We use the same dumping and restoring mechanism for anon private and
anon shared memory. Because of this we can implement manual deduplication
of shared anon memory the same way we do it with private anonymous memory.
Also we need to rename pid parameter of cr_dedup_one_pagemap to id because
now we can pass either pid or shmid there and the actual meaning depends
on flags: PR_TASK is for pid, PR_SHMEM is for shmid.
Signed-off-by: Fyodor Bocharov <bocharovfedor@gmail.com>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
As anon shmem dumping supports page changes tracking
we can call it during predump.
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This allows us not to dump anon shmem pages that weren't changed since
last dump. We dump each anon shmem vma using page-xfer. page-xfer does all
magic with storing "in_parent" field in pagemap-entry.
When restoring we simply read every page with page-read and it does
all magic of reading from right place in image hierarchy.
auto-dedup on restore is already implemented by page-read so we don't need
to code it.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Anon shmem pages state tracking allows us not to dump unused
anon shmem pages at all.
To track anon anon shmem pages state we create a bitmap.
Each 2 bits in this bitmap correspond to particular page.
Each 2 bits store one page state:
PST_DONT_DUMP, PST_DUMP, PST_ZERO, PST_DIRTY.
This number of states is enough to decide what to do with the page
on dump.
With anon shmem there is a peculiarity. To decide what state page has
we need to examine its PME bits in all the processes that share it.
So page state derived from PME bits in one process may be overriden
by page state derived from PME bits from another process.
See implementation of this overrides in the patch.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
So we would be able to analyze pagemap bits for each
anonymous shmem page and decide on its dirtiness and usage
by dumpee process.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
proc_parse.h is too generic and it is a bad idea to include it everywhere.
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
It removes a dependence between proc_parse.h and cgroup.h
v2: type fix in the subject
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
It remove a dependece between proc_parse.h and mount.c.
v2: type fix in the subject
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
There are files that include both vma.h and proc_parse.h and
since dump_filemap_t is declared in both some gccs generate
a warning.
Warning: proc_parse.h:131: note: previous declaration of ‘dump_filemap_t’ was here
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
restorer.h eventually includes fcntl-linux.h system file, which
indiscriminately defines F_SETPIPE_SZ/F_GETPIPE_SZ. But those
are also defined by CRIU's own headers in config-base.h. The latter
contains ifdef guards, however in arch/x86/crtools.c it's included
after restorer.h which causes gcc warnings for macro redefinition.
Fix this by reordering the 2 headers, ensuring the ifdef guards in
config-base.h actually work.
Signed-off-by: Nikolay Borisov <kernel@kyup.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
>From the commit 64e74fab05 ("parasite: handle errors while a transport
socket is being created"), we have futex in parasite init args to
synchronize parasite and criu during initialization.
And man futex(2): "On all platforms, futexes are four-byte integers that
must be aligned on a four-byte boundary."
This is checked by kernel in get_futex_key():
if (unlikely((address % sizeof(u32)) != 0))
return -EINVAL;
So, we need to align parasite arguments on four bytes, while mapping
of parasite blob on page-aligned address will guarantee that it'll
be aligned on four bytes in memory.
Fixes:
(00.013468) -----------------------
(00.013470) Putting tsock into pid 22043
(00.014024) Error (criu/parasite-syscall.c:541): futex() returned an unexpected error: -22
(00.014026) Error (criu/parasite-syscall.c:541): BUG at criu/parasite-syscall.c:541
Cc: Andrew Vagin <avagin@virtuozzo.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Acked-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Process private memory was dumped at this moment, but a memory
tracker isn't reseted, so we can't use a process memory here.
https://github.com/xemul/criu/issues/203
Cc: Eugene Batalov <eabatalov89@gmail.com>
Cc: Fyodor Bocharov <fbocharov@yandex.ru>
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
Fixes: 101e3ba49d08 ("mem: reset SOFT_DIRTY bits after dumping of all vmas in the process")
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Initially, the cgroupns patchset that went into the Ubuntu kernels had the
nsroot= argument in mountopts, which allowed us to distinguish between
cgroupfs mounts. The upstream kernel doesn't have this (the reasoning was
that it showed up in the root field of mountinfo), so all cgroup mounts
look idential if we don't consider the root mount, and we wrongly detect
the mounts as bind mounts. Instead, let's remember the root path and
compare this when considering when a mount is a bind mount.
This patch is a little ugly because it intorduces cgroup specific behavior
into the generic code, which we've thus far been able to avoid. One way to
deal with this might be able to add a ->sb_equal hook to the fstype struct
that could compare mountinfos' superblocks, and then fall back to
mounts_sb_equal if that isn't present. Or we can leave this specific code
in the generic bits until more of these appear. Either way is fine with me.
v2: move the cgroup specific code to mounts_sb_equal()
Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Out-of-core rlims and timers existed before 1.3, so people trying
to restore from images generated of this old CRIU would have to
upgrade.
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This is the option that would enable the deprecated (to be removed)
functionality. For convenience it's also possible to set one via
the environment.
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
When serving out fds in files engine we _may_ goto move_fd_from()
call on the recently added service transport fd.
Avoid this theoretical situation.
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Acked-by: Andrei Vagin <avagin@virtuozzo.com>
The same thing as in e46ba88614 exists in pipes, unix sockets and
ttys, so let's re-use the service transport fd there as well.
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Similar to f444f7fac40, we need to treat memory.oom_control as a "special"
property and try not to write its default value, since in the 3.11 kernel
it can't be written when memory.use_heirarchy is true, which is the
default.
CC: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
It's what we have when ReadOnlyDirectories=/ is set for systemd services.
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
pivot_root requires a place where to move an old root. Currently
a temporary directory is created for that, but it doesn't
work if the / directory is read-only.
Actually we can use any existing directory. In this patch,
criu tries to use /tmp and only if it doesn't exist,
criu creates a temporary directory.
https://bugs.openvz.org/browse/OVZ-6778
v2: don't give a constant string to mkdtemp
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
If we want to dedup anon shared memory we need to call page_in_parent.
So we need to make it extern.
Also in case of anon shared mem we have only 1 bit per page so we have to
change page_in_parent signature.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
In order to restore deduplicated anonymous shared memory we need
to open it's parent pagemap images. Code that opens parent pagemap
images already exists for anonymous private memory. All we need to do
is to remove couple of checks from existing code. Also we need to rename
pid to id because now we can pass either pid or shmid and the actual
meaning depends on pr_flags.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
To dedup anon shared memory we need to know its longest size so we could
create page cache of appropriate size when dumping pages.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
These are only three left in ipc_kern_table which we haven't
checkpointed yet, I'm not sure if somebody really uses them
except criu, but to be consistent, beter not to change them
while c/r.
v3: do one sysctl_op for all xxx_next_id(as sysctl_op is quiet slow)
v4: do only one sysctl_op in ipc_sysctl_req
v5: do msg*_default only if have /proc/sys/fs/mqueue same as other
ones from fs/mqueue
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
...and fix misprints that weren't caught before.
I guess, I never fixed that much (possible) bugs by one commit, heh.
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
As on x86 compat/native sigframe differ, I need to generalize/modify
sigframe macro helpers having in mind:
- SIGFRAME_OFFSET differ between native/compat tasks, so it takes
sigframe parameter now, which will be used in following patches
(also renamed it in RT_SIGFRAME_OFFSET to complement other macros)
- RT_SIGFRAME_FPU is now pointer, because each caller takes result's
address with &RT_SIGFRAME_FPU(...)
- sigreturn_prep_fpu_frame now takes rt_sigframe parameter, as
address of fpu_state pointer on x86 will depend on native/compat
frame type, so I check local sigframe's type and count address
for rsigframe. (See in the very next commit).
Cc: Laurent Dufour <ldufour@linux.vnet.ibm.com>
Cc: Christopher Covington <cov@codeaurora.org>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
sigreturn_prep_fpu_frame is no-op for arm, but I think it's better
to fix it while macro correctly expands in sigframe.c - it
may change in some future.
Cc: Christopher Covington <cov@codeaurora.org>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
For x86 there are different SIGFRAME_OFFSET for native and compatible
tasks. In the next patches I will make SIGFRAME_OFFSET(rt_sigframe)
macro (depending on rt_sigframe).
As RESTORE_STACK_SIGFRAME used only for allocation sizes,
I don't want to introduce RESTORE_STACK_SIGFRAME(rt_sigframe)
dependency on rt_sigframe type. Let's just use for this porpose max
sigframe offset of native/compat tasks.
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This patch adds implementation of --leave-stopped option
to CRIU restore cmd. If --leave-stopped is passed then
each process in ps tree gets SIGSTOP before detaching
from it.
Signed-off-by: Kravchenko Dmitrii <equivalence1@gmail.com>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Acked-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Bug-fix mostly release.
We've also came very close in -dev branch to having x86 32bit
support, so hopefully we'll have it in 2.6/2.7. Lazy restore
now in test-able state, but still we want kernel patches to
leave maintainer's tree, so we still wait.
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Currently during criu dump we create link remap in the same dir
where original file was opened. But that dir may not exist during
link remap creation. At the same time it's okay to create link
remap in any dir on the same mount point.
In this patch we do this. We check existance of every dir bottom
up through the original file path. We use the first existing dir.
Similar approach is used on criu restore during ghost file creation.
Signed-off-by: Egor Gorbunov <egor-mailbox@ya.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
The problem:
$(DEFINES) array added to $(CFLAGS) in a global Makefile.
But, in criu/Makefile we include Makefile.config, which
adds feature-based config options to $(DEFINES).
We need to propagate this new defines again to CFLAGS array.
Previously, I added:
ccflags-y += $(DEFINES)
to Makefile.crtools, but those $(DEFINES) are useful not only
in the crtools makefile.
Let's just propagate this feature defines to CFLAGS and DEFINES
in place.
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@openvz.org>
Acked-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Adjust all calls to try-cc to compare with 'true' instead of 'y',
drop additional rule check-build-packages, as we can check them
in the rule now.
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@openvz.org>
Acked-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
- simplify: don't use temporary file -- use /dev/null instead
- return 'true' or 'false' -- this way we can use it inside rules
without external call to bash to compare return with 'y', see
the next patch for a use case.
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@openvz.org>
Acked-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
'longest' field in vma_area_list struct stores longest private vma
size. It is better to name it priv_longest as it is done
for priv_size field.
Signed-off-by: Fyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: Eugene Batalov <eabatalov89@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
There can be autofs direct mount point without target mount on top.
In this case there won't be any bindmount and nothing to restore on top of the
autofs mount point.
Signed-off-by: Stanislav Kinsburskiy <skinsbursky@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
CID 164719 (#1 of 1): Resource leak (RESOURCE_LEAK)
7. leaked_handle: Handle variable sk going out of scope leaks the handle.
Signed-off-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Instead of calling it in fill_fd_params_special (which is called for any found
path).
This reduces amount of system calls on dump.
Signed-off-by: Stanislav Kinsburskiy <skinsbursky@virtuozzo.com>
Acked-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>