- 02 Mar, 2018 40 commits
-
-
Kirill Tkhai authored
waitpid() does not return child pid, when child has not exited. So, we can't use it to find pids of children. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Pavel Tikhomirov authored
We should close cwd_fd on error paths, found by Coverity Scan: *** CID 187162: Resource leaks (RESOURCE_LEAK) /criu/mount.c: 1370 in open_mountpoint() 1364 */ 1365 pid = clone_noasan(ns_open_mountpoint, CLONE_VFORK | CLONE_VM 1366 | CLONE_FILES | CLONE_IO | CLONE_SIGHAND 1367 | CLONE_SYSVSEM, &ca); 1368 if (pid == -1) { 1369 pr_perror("Can't clone helper process"); >>> CID 187162: Resource leaks (RESOURCE_LEAK) >>> Handle variable "cwd_fd" going out of scope leaks the handle. 1370 return -1; 1371 } 1372 1373 errno = 0; 1374 if (waitpid(pid, &status, __WALL) != pid || !WIFEXITED(status) 1375 || WEXITSTATUS(status)) { Signed-off-by:
Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Pavel Tikhomirov authored
close_safe can operate uninitialized fd in case of error in switch_ns, found by Coverity Scan: *** CID 187164: Uninitialized variables (UNINIT) /criu/mount.c: 1313 in open_mountpoint() 1307 err: 1308 return 1; 1309 } 1310 1311 int open_mountpoint(struct mount_info *pm) 1312 { >>> CID 187164: Uninitialized variables (UNINIT) >>> Declaring variable "fd" without initializer. 1313 int fd, cwd_fd, ns_old = -1; 1314 1315 /* No overmounts and children - the entire mount is visible */ 1316 if (list_empty(&pm->children) && !mnt_is_overmounted(pm)) 1317 return __open_mountpoint(pm, -1); 1318 Signed-off-by:
Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Andrei Vagin authored
Start test ./mxcsr --pidfile=mxcsr.pid --outfile=mxcsr.out Run criu dump Unable to kill 44: [Errno 3] No such process <--------------- this one Run criu restore Run criu dump Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com> Reviewed-by:
Dmitry Safonov <0x7f454c46@gmail.com>
-
Andrei Vagin authored
Signed-off-by:
Andrei Vagin <avagin@openvz.org>
-
Andrei Vagin authored
Write a nullbyte only if there is enought space for it. Cc: Stephen Röttger <stephen.roettger@gmail.com> Reported-by:
Stephen Röttger <stephen.roettger@gmail.com> Signed-off-by:
Andrei Vagin <avagin@openvz.org>
-
Pavel Tikhomirov authored
We print errors in all error cases when calling linkat_hard anyway, but for some errors like EEXIST we are fine and just skip them, so we should not print error here. Signed-off-by:
Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Pavel Tikhomirov authored
It is a test for convert_path_from_another_mp fix, it is a bit tricky as we don't fully support ghosts on readonly fs, but only if the ghost can be remaped on some _other_ bindmount (luckily we have same ghost on other bind). Moreover wrong absolute path generated with old convert_path_from _another_mp for lnkat don't always fail, only in case we want to do linkat on mount in _other_ mountns and absolute path makes us do it in local mountns and local path is readonly and we fail. =) v2: remove unused headers Signed-off-by:
Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Pavel Tikhomirov authored
If dmi->ns_mountpoint is "/" then in dst we will return "/..." - absolute path but we want here path relative to dmi mount. Adding "./" before the path guaranties that it will be always relative. https://jira.sw.ru/browse/PSBM-72351Signed-off-by:
Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Fork tasks and create fds with different numbers. Some children share file with parent (CLONE_FILES). Check, than we can suspend and resume in this case. v2: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Currently, we set rlim(RLIMIT_NOFILE) unlimited and service_fd_rlim_cur to place service fds. This leads to a signify problem: every task uses the biggest possible files_struct in kernel, and it consumes excess memory after restore in comparation to dump. In some situations this may end in restore fail as there is no enough memory in memory cgroup of on node. The patch fixes the problem by introducing task-measured service_fd_base. It's calculated in dependence of max used file fd and is placed near the right border of kernel-allocated memory hunk for task's fds (see alloc_fdtable() for details). This reduces kernel-allocated files_struct to 512 fds for the most process in standard linux system (I've analysed the processes in my work system). Also, since the "standard processes" will have the same service_fd_base, clone_service_fd() won't have to actualy dup() their service fds for them like we have at the moment. This is the one of reasons why we still keep service fds as a range of fds, and do not try to use unused holes in task fds. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> v2: Add a handle for very big fd numbers near service_fd_rlim_cur. v3: Fix excess accounting for nr equal to pow 2 minus 1. Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
In normal life this is impossible. But in case of big fdt::nr number (many processes, sharing the same files), and custom service_fd_base, normal (!CLONE_FILES) child of such process may have overlaping service fds with parent's fdt. This patch introduces "memmove()" behavior (currently there is "memcpy()" behavior) and this will be used in next patch. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch just moves part of clone_service_fd() to separate function, that change readability of the code. There are no functional changes, only refactoring. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch makes the call of service fds relocation after root_prepare_shared()->prepare_fd_pid(). Next patches will make service_fd_base depend on task's max fd used, and for root_item we need to read all fles to know the maximum of them. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Next patches will make service_fd_base not contant. It will be "floating" and change from task to task. This patch makes preparation for that: it closes old service fd after it's duplicated. Currently the code is unused as in case of !(rsti(me)->clone_flags & CLONE_FILES), the child has the same id as its parent, and the duplication just does not occur. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Refactoring for next patches. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch counts maximum of inherited fds. The value will be used in next patch. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Next patches will make service fds numbers not connected not rlimit. Change the name to better fit its goal. Also, leave service_fd_rlim_cur variable to have cached access to rlimit value. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> v2: More comments Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Mark area, where service fds modifications are prohibited. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch populates/occupies PROC_FD_OFF fd number, which is goint to be replaced atomically in next patches. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch populates and occupies ROOT_FD_OFF fd, which guarantees it won't be reused by ordinary fds. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch introduces sfds_protected, which allows to mask areas, where modifications of sfds are prohibited. That guarantees, that populated sfds won't be reused. v4: New v5: Add comment and print sfd type before BUG(). Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Function to print call trace of a process. Borrowed from this fm: https://www.gnu.org/software/libc/manual/html_node/Backtraces.html backtrace() and backtrace_symbols() are not implemented in alpine, so we use __GLIBC__ ifdef to do not compile this function there. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Net namespace does not act on /proc/[pid] context, so this close is completely useless. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
1)Further mntns_set_root_fd() calls install_service_fd(), which silently closes already open fd. So, kill close_service_fd() and make __mntns_get_root_fd() atomical in ROOT_FD_OFF modifications. 2)close_pid_proc() is not need here, as it's about root_item's /proc directory and __mntns_get_root_fd() actions don't act on it. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Here we need to close proc self fd only, as it's not a service fd, and it can occupy real task fd number. Closing of PROC_PID_FD_OFF is useless action here, because it's already occupy a service fd number. So, we skip this excess syscall, and leave PROC_PID_FD_OFF open. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Place stdin in fdstore. Kill SELF_STDIN_OFF. v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Next patch will move SELF_STDIN_OFF sfd to fdstore. This patch moves fdstore_init() before tty_prep_fds(). v4: New Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Create a zombie with specific pgid and check that pgid remains the same after restore. This test hangs criu restore without any of two previous patches: 1)without "restore: Call prepare_fds() in restore_one_zombie()" in 100% cases; 2)without "restore: Split restore_one_helper() and wait exiting zombie children" fail is racy, but you can add something like criu/cr-restore.c: ## -1130,6 +1130,8 @@ static int restore_one_zombie(CoreEntry *core) if (task_entries != NULL) { restore_finish_stage(task_entries, CR_STATE_RESTORE); + if (current->parent->pid->state == TASK_ALIVE) + sleep(2); zombie_prepare_signals(); } and it will fail with almost 100% probability. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Cleanup fork() definition and make a generic function for all archs. It may be useful, when you want to add more clone flags to fork(), or if you want to pass more, than one argument to child function (glibc's clone alows only one). Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Zombie is also can be choosen as a parent for task helper like any other task. If the task helper exits between restore_finish_stage(CR_STATE_RESTORE) and zombie_prepare_signals()->SIG_UNBLOCK, the standard criu SIGCHLD handler is called, and the restore fails: (00.057762) 41: Error (criu/cr-restore.c:1557): 40 exited, status=0 (00.057815) Error (criu/cr-restore.c:2465): Restoring FAILED. This patch makes restore_one_zombie() behave as restore_one_helper() and to wait children exits before allowing SIGCHLD. This makes us safe against races with exiting children. See next patch for test details. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Zombie may be choosen as parent for task helper during solving pgid dependences. In this situation, it becomes to share fdt with the helper and it has to call prepare_fds() to decrement fdt->nr. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Make it possible to use this function by tests. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
CTL_TTY_OFF and reserve_service_fd() are unused now, so purge them from the code. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
There are two problems. The first is CTL_TTY_OFF occupies one of the biggest available fds in the system. It's a number near service_fd_rlim_cur. Next patches want to allocate service fds lower, than service_fd_rlim_cur, and they want to know max used fd from file fles after the image reading. But since one of fds is already set very big (CTL_TTY_OFF) on a stage of collection fles, the only availabe service fds are near service_fd_rlim_cur. It's vicious circle, and the only way is to change ctl tty fd allocation way. The second problem is ctl tty is ugly out of generic file engine fixup (see open_fd()). This is made because ctl tty is the only slave fle, which needs additional actions (see tty_restore_ctl_terminal()). Another file types just receive their slave fle, and do not do anything else. This patch moves ctl tty to generic engine and solves all the above problems. To do that, we implement new CTL_TTY file type, which open method waits till slave tty is received and then calls tty_restore_ctl_terminal() for that. It fits to generic engine well, and allocates fd via find_unused_fd(), and do not polute file table by big fd numbers. Next patch will kill currently unneed CTL_TTY leftovers and will remove CTL_TTY_OFF service fd from criu. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Move the function and reduce its arguments number. This is cleanup needed to keep all tty code together. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
Just mark the fle as "fake" and the engine will do all the work. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
service_fd_id is id of a specific task, while other tasks in shared fd table group may have bigger id numbers. In this case given unused fd intersects with service fds of such tasks. This leads to undefined behaviour. Fix that. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
This patch speeds up creation of child process by disabling iteration over open files for the most cases. Really, we don't need that now, as previous patches make parent files do not leak: mnt namespace fds are stored in fdstore, pid proc files are closed directly. So, now we can skip closing old files for the most cases, except some CLONE_FILES cases: we need that only if parent have CLONE_FILES in its flags (and for root_item). Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-
Kirill Tkhai authored
When task is in pid namespace, getpid() can't be used to identify it. So, use vpid instead of that. Also, move log_init_by_pid() above pid check. Signed-off-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Andrei Vagin <avagin@virtuozzo.com>
-