- 06 Feb, 2017 37 commits
-
-
Kirill Tkhai authored
Firstly masters, then slaves and lastly ctty. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This make open fds asynchronous. Now we restore them in a poll-style. Every ->open callback operates like a poll. It returns 1, i.e. "call me again", if some events have not received yet, or 0, if restoring of a fle has finished. We iterate over list of file descriptors and look at its return value. If there were not progress in restoring of a fle, we sleep on task_st futex. As all events are sent together with changing task_st, we will be woken up, when there is a some new work for us. v6: Add a comment about open method return values v5: Clear FDS_EVENT every beginning of cycle. Use 0, -1 and 1 for successful return error and "again" request. v4: unix: 1)standalone sockets return ORV_AGAIN after first open to reopen fd by generic code 2)do not call post_open_unix_sk() for !standalone sockets inet, epoll: return ORV_AGAIN after first open to reopen fd by generic code autofs: iterate used list instead of fds list Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This breaks everything, because files.c can't have a deal with this yet. But next patch will teach it. v5: Use hard-coded 0, -1 and 1 for successful return, error and "again" request. v4: tty: merge new_fd assignment to receive_tty() and return this function result directly. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Return results of work separate: a new fd is in a parameter, a status is in return value. In next patches we will use return value "1" to indicate, that open callback should be called once again, and restore for this fle has not finished yet. So, we need to be able to differ file descriptor with number 1 and "again" request. We do not use negative value like -2 for this purpose, because we want to allow fles to be served out before they are completelly restored. So, if a fle is successefuly open, but it's need one more call of open to complete its restore, then we return 1 and populate new_fd in not negative value. See "files: Kill struct file_desc_ops::post_open" for the details. Also, export open_pipe() v5: Use 0 and -1 for successful return and error. v6: Rebase on new criu Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This is need to make receiving a fle non-blocking. We will sleep on task_st futex instead of this. v5: Do not set event in send_fd_to_self() Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Currently, it's just an additional check. But later this will be used int the following way. Return value "1" means, that fle is not ready for restore, and the caller should recall this method once again later. See "[PATCH] files: Kill struct file_desc_ops::post_open" for the details. v5: Use "1" for return v2: Use generic FLE_OPEN and FLE_RESTORED to determ if a fle is ready Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This point we think it's a first call of open(), so the state must be FLE_INITIALIZED. v6: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Timerfd's post_open state does not depend on another objects, so it may be safely merged into open stage. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
The step to make file opening use the only futex. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This is need for waiting, while port has users, using task_st futex. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Use task_st futex notifier instead of per-socket. The step to make file opening use the only futex. v2: Use internal bound and listen states instead of generic travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
This is need for waiting a peer using task_st futex. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Add fle open stages. Set a stage after every operation. v2: Do not merge filetype specific state with generic. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
The idea is symilar to kernel's wake_up() and wait_event(). One task needs some event. It checks the event has not happened yet (fle hasn't received, unix peer hasn't bound, etc) and calls get_fds_event(). Other task makes the event (sends a fle, binds the peer to a name, etc) and calls set_fds_event(). So, while there is no an event, the first task is sleeping, and the second wakes it up later: Task A: clear_fds_event(); if (!socket_bound) wait_fds_event(); /* sleep */ Task B: bind_socket(); set_fds_event(); /* wake up */ For the details of using see next patches. v5: Use bit operations. Split clear_fds_event from wait function. v2: Do not wait for foreign transport sock is ready, as it's guarantied by we create it before CR_STATE_FORKING. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Borrowed from Linux Kernel v5: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
(was "files: Wait transport_fd before sending a fd to peer" and "pstree: Add task_st futex") We are going to move to the the single per-task bit field for notifications about file opening events. Introduce pstree_item::task_st for that. v5: Add FDS_EVENT_BIT description. v2: Do not wait until a peer's socket is created as it's guarantied by we create it before CR_STATE_FORKING. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
TTY masters and slaves have no post_open stage, so these two blocks may safely have their stages merged together. The third is eventpoll, but two above do not depend on it (their .post_open do not depend on eventpoll .open). Unix sockets would have been, but this isn't implemented yet. So, we may safely execute all stages for different file types separatelly. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Since "receive" stage is used only for slave fds and nobody depends on slave fds receiving is finished, we may move it functionality in "post_open" stage. This just makes slave fds to be received a little bit later. In other words, only masters have post_open stage, and only slaves have receive stage. So, in the case of A and B files: A->open B->open A->recv A->post_open B->recv B->post_open A->post_open can't depend on B->recv. This follows just from analyzing of all file types post_open methods. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Since we are going to get rid of stage at all, kill this function and call post_open_fd() unconditionally. It can handle the case, when file_desc_ops::post_open is NULL travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Since transport socket is per-process, we do not need fd parameter in this function anymore. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Since transport fd is per-task, this method is not need anymore. Kill it. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Move reopen_fd_as() from receive_fd() to this function. Note, that recv_fd_from_peer() has other callers, and all of them are OK with receiving real fds (before, they received arbitrary fds, and they OK with any fds). travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
Don't wait for "prepare" stage of every peer's fd. Just send everything to a peer's global transport socket, and the peer will find appropriate fd, it needs at the moment. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
For moving to a single transport socket scheme, we should be able to receive a fd, which is not need at the moment, but it will be used in the future. So, we receive a further fd, and then continue to wait the fd, we really need now. v3: Delete excess BUG_ON(). Rename main patch funtion to keep_fd_for_future(). Rename second funtion to task_fle(), and make it have "task" argument. travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
No functional changes v3: Also do real_pid futex initialization travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
No functional changes travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
No functional changes travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
For moving to a single transport socket scheme, we need to be able to differ fds in receive queue from each other. Add a fle pointer as identifier for that. v2: Rebase on compel travis-ci: success for Rework file opening scheme to make it asynchronous (rev5) Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kirill Tkhai authored
System call sys_futex() requires that (from futex(2)): "On all platforms, futexes are four-byte integers that must be aligned on a four-byte boundary". travis-ci: success for locks: Mask futexes aligned Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kir Kolyshkin authored
1. LOGROTATEDIR is not used since commit f4e9a1df ("make: don't install service and logrotate configs"). 2. SYSTEMDUNITDIR is not used since commit 10d5e9a4 ("criu: scripts: remove criu service files"). 3. install-tree target was *never* used, makes no sense to keep it. While at it, also - sort the variables in "export" statement to match the order of appearance in Makefile; - don't export DESTDIR (it is exported by default as it always comes from the make command line); - remove unused variable from INSTALL.md. travis-ci: success for Makefile.install fixes Signed-off-by:
Kir Kolyshkin <kir@openvz.org> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kir Kolyshkin authored
Commit 6a51c7ec ("make: Allow to install in custom dirs") replaced all := assignments with ?=, effectively disabling the LIBDIR guessing logic (as once a variable is assigned, further ?= make no sense). That commit description says that setting PREFIX from make command line didn't work. I can't find the original bug report but according to GNU make documentation (see [1], [2]) as well as to my best knowledge, any variable set in Makefile can be overridden from the command line, unless "override VAR = value" is used in the Makefile. The result of this patch is LIBDIR is correctly set for distros such as Fedora and Debian, so "make install" works more correct. Surely, any variable can still be overriden from the command line. I have also checked the build of Fedora package from criu.spec with this change -- it works fine. Now, I am not sure why it was not working for the original bug reporter. The only hypothesis I have is he tried to do something like PREFIX=/usr make instead of make PREFIX=/usr If this was the case, it was not a bug but wrong usage. While at it, fix LIBDIR description in INSTALL.md. [1] https://www.gnu.org/software/make/manual/html_node/Overriding.html [2] https://www.gnu.org/software/make/manual/html_node/Override-Directive.html travis-ci: success for Makefile.install fixes Cc: Cyrill Gorcunov <gorcunov@openvz.org> Cc: Andrei Vagin <avagin@virtuozzo.com> Signed-off-by:
Kir Kolyshkin <kir@openvz.org> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kir Kolyshkin authored
These variables doesn't need to end with a slash. This helps the next patch. travis-ci: success for More polishing for compel cli Signed-off-by:
Kir Kolyshkin <kir@openvz.org> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Cyrill Gorcunov authored
They are the same in meaning and may collide on building. Signed-off-by:
Cyrill Gorcunov <gorcunov@openvz.org>
-
Cyrill Gorcunov authored
Signed-off-by:
Cyrill Gorcunov <gorcunov@openvz.org>
-
Cyrill Gorcunov authored
We gonna share this file between subprojects so lets minimize deps on headers, only syscalls are left here for non libc compiling. travis-ci: success for Common headers Signed-off-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Andrei Vagin authored
musl-libc fixed inconsistency between posix and kernl msghdr structures by adding pad-s. It initializes all pad-s before calling recvmsg and sendmsg syscalls. CRIU calls raw system calls from pie code, so we need to intialize pads too. In addition, we don't initialize msg_flags and iov_len. https://github.com/xemul/criu/issues/276 https://travis-ci.org/kolyshkin/criu/builds/198415449Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kir Kolyshkin authored
C compiler might generate calls to memcpy, memset, memcmp, and memmove as it seem fit (so far we haven't seen memmove being required). That means we need to provide our own versions of it for code which is not linked to a libc. We already have a solution for that in commit bdf60512 ("pie: provide memcpy/memcmp/memset for noglibc case") but we faced another problem of compiler trying to optimize our builtin_memset() by inserting calls to memset() which is just an alias in our case and so it lead to infinite recursion. This was workarounded in commit 8ea0ba7d ("string.h: fix memset over-optimization with clang") but it's not clear that was a proper fix. This patch is considered to be the real solution. As we don't have any other implementations of memset/memcpy/memcmp in non-libc case, we can call ours without any prefixes and avoid using weak aliases. Implementation notes: 1. mem*() functions code had to be moved from .h to .c for the functions to be compatible with their prototypes declared in /usr/include/string.h (i.e. "extern"). 2. FORTIFY_SOURCE needed to be disabled for code not linked to libc, because otherwise memcpy() may be replaced with a macro that expands to __memcpy_chk() which of course can't be resolved during linking. https://travis-ci.org/kolyshkin/criu/builds/198415449Signed-off-by:
Kir Kolyshkin <kir@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
- 03 Feb, 2017 3 commits
-
-
Dmitry Safonov authored
Now changes in top-Makefile, middle-Makefile will result in a correct recompiling, as it's expected: [criu]$ touch criu/Makefile [criu]$ make <...> DEP criu/arch/x86/sigframe.d DEP criu/arch/x86/sigaction_compat.d DEP criu/arch/x86/crtools.d DEP criu/arch/x86/cpu.d DEP criu/arch/x86/call32.d CC criu/arch/x86/call32.o CC criu/arch/x86/cpu.o CC criu/arch/x86/crtools.o <...> travis-ci: success for Fix rebuild on Makefile changes Reported-by:
Andrey Ryabinin <aryabinin@virtuozzo.com> Signed-off-by:
Dmitry Safonov <dsafonov@virtuozzo.com> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Dmitry Safonov authored
Result: [japdoll@dsafonov criu]$ touch Makefile [japdoll@dsafonov criu]$ make make[1]: Entering directory '/home/japdoll/tools/criu' PBCC images/macvlan.pb-c.c DEP images/macvlan.pb-c.d PBCC images/autofs.pb-c.c DEP images/autofs.pb-c.d PBCC images/sysctl.pb-c.c DEP images/sysctl.pb-c.d <...> travis-ci: success for Fix rebuild on Makefile changes Signed-off-by:
Dmitry Safonov <dsafonov@virtuozzo.com> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-
Kir Kolyshkin authored
We found a weird case of parasite code dying of SIGSEGV when clang is used as a compiler (see [1] for more details). Apparently, it was caused by clang optimizing our builtin_memset() by inserting a call to memset(). It is a valid compiler optimization, aside from the fact that in our code memset() is defined as a weak alias to builtin_memset(), which of course lead to infinite recursion and stack growth. This might be a bug in compiler, but there are ways to avoid it: 1. Rewrite builtin_memset() in asm (note it needs to be done for every architecture supported). 2. Disable compiler optimizations for this code (say, by using -O0). 3. Declare the pointer inside builtin_memcpy() as volatile. The last approach looks more appealing -- mostly for being simple. [1] https://github.com/xemul/criu/issues/279 travis-ci: success for string.h: fix memset over-optimization with clang Cc: Andrei Vagin <avagin@virtuozzo.com> Cc: Dmitry Safonov <dsafonov@virtuozzo.com> Cc: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Kir Kolyshkin <kir@openvz.org> Acked-by:
Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
-