Commit graph

2972 commits

Author SHA1 Message Date
Cyrill Gorcunov
0ae67a7743 vdso: Escape double dumping of rt-vdso if proxy present
In case if we have created vdso proxy the rt-vdso should
not be dumped because it will be re-created on next restore
anyway. Thus with help of parasite service routine find
the rt-vdso and tear it off from VMAs list.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:20 +04:00
Cyrill Gorcunov
528106a5dc vdso: Mark runtime vdso if proxy needed
In case if we need vdso proxy there is a need
to recognize it somehow on further checkpoint
action. But such vdso won't be recognized by
the kernel and [vdso] mark won't appear in
procfs output. Thus we put own mark on it.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:19 +04:00
Cyrill Gorcunov
bc66eb535c vdso: Fetch page frame number on init
We will need it in parasite code to detect run time vdso area.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:18 +04:00
Cyrill Gorcunov
f267443134 vdso: Implement vdso proxy on restore
When a task being restored we may meet two situations

 - vdso in image doesn't match the runtime vdso provided
   by a kernel. For this case we need to patch dumpee
   vdso redirecting calls to runtime vdso, thus dumpee
   vdso become a proxy.

 - vdso in image does match the runtime vdso, in this
   case we simply remap runtime vdso to address where
   dumpee vdso lives. Plain remapping here is quite
   important and allows us to save vdso pfn which will
   be used in parasite code later.

Note after this patch the restored task may have two
vdso in memory. Proper dumping of such situation will
be addressed in future patches.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:17 +04:00
Cyrill Gorcunov
b051c66fb6 vdso: Remap runtime vdso copy to safe place
Runtime vdso need to be kept in some safe place when all
self-vmas are unmapped. So we reserve space for it in restorer
blob area and then remap it into. It's quite important to do
a remap here rather than data copy because otherwise pfn
of vdso disappear and in future we won't be able to detect
vdso are on dumping stage.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:16 +04:00
Cyrill Gorcunov
e44b3dbe84 vdso: Initialize vdso data on startup
During criu startup we need to fill symbol table of own
run-time vdso provided by the kernel. We will need this
data for vdso proxy.

Because this functions are not used in restorer code,
we move them out of PIE (since PIE code must remain
as small as possible).

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:15 +04:00
Cyrill Gorcunov
61cc86ddd2 vdso: Introduce vdso pie-engine
It's quite minimal at moment and provides only two helpers

 - vdso_redirect_calls, to patch vdso area redirectling
   calls to some new place.

 - vdso_fill_symtable, to parse vma area as vdso library
   and fill symbols table with offsets and names.

Because these routines will be needed in both regular criu
code and restorer code -- we compile it in pie format.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:27:13 +04:00
Cyrill Gorcunov
9208108c9f make: Define program object deps as separate variable
Will need to extend it to support vdso-pie code which
used in both -- pie code and plain executable code.

I know it's ugly and I must invent some more elegant
way, but need some solution at moment to be able to
compile existing code.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:24:29 +04:00
Vladimir Davydov
5dbab1a711 zdtm: check one-shot posix timers
With the patch zdtm will check not only periodic timers, but also
one-shot ones.

 Set one-shot timer to expire in a very long interval (INT_MAX in the
 test), and check its remaining value after checkpoint/restore. The
 following relationship must hold:

 initial_value - remaining_value = time_passed

Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
Acked-by: Andrew Vagin <avagin@parallels.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-24 13:04:52 +04:00
Andrey Vagin
fc07b9ae0e zdtm.sh: save archive with dump files
An archive is saved in unsuccessful case.

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 20:30:10 +04:00
Andrey Vagin
97ee174a99 zdtm.sh: use tmpfs for dump files
It's optional. It's going to be used in jenkins.

time bash -x test//zdtm.sh  static/maps04
real	0m40.220s
user	0m0.096s
sys	0m12.822s

time bash -x test//zdtm.sh -t static/maps04
real	0m9.904s
user	0m0.074s
sys	0m1.630s

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 20:29:49 +04:00
Andrey Vagin
c9c9fe479e zdtm: fix sigpending to check blocked signal masks
Here are a few bugs which hide each other.
* memcmp(&newset, &oldset, sizeof(newset) returns 0 is masks are equal.
* sigprocmask return sigset_t and it contains extra bits for the future,
so we need to initialize all this bits otherwise they will contain
random data.

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 20:27:58 +04:00
Cyrill Gorcunov
a21cdb8437 asm: Add builtin_memcpy, builtin_memcmp generic helpers
Will need them in pie code soon.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 16:51:14 +04:00
Cyrill Gorcunov
17f6c36305 asm: Move builtin_memcpy helper into asm/string.h
There will be a couple of more builtin helpers needed
in pie code soon. Thus to unify approach do

 - rename asm/memcpy_64.h to asm/string.h

 - introduce include/asm-generic/string.h file
   where all helpers are implemented if optimized
   variant is not  yet provided

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 16:51:06 +04:00
Cyrill Gorcunov
54b32cb1fd x86: Implement prlimit proxy
RHEL6 is shipped with libc 2.12 where no prlimit
helper provided (which was pushed into libc itself
since 2.13). So we implement own proxy for convenience.

Note, if libc does support prlimit itself we simply
don't use any proxy and call it directly.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 15:12:58 +04:00
Cyrill Gorcunov
a5fcc8b021 x86: syscall -- Add sys_prlimit64 call
We will need it for own prlimit proxy call.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 15:12:57 +04:00
Cyrill Gorcunov
fc7c13ded0 make: config -- Add test for prlimit call
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 15:12:56 +04:00
Cyrill Gorcunov
88b13cffbe mem: Add PME_ bits for page frame retrieval
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 12:51:27 +04:00
Cyrill Gorcunov
58cb8b2769 pagemap: Move PME_ constants to the header
This constants are system wide, so move them to mem.h
header for reuse sake.

[ xemul: It was kerndat.h in the patch ]

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 12:50:43 +04:00
Cyrill Gorcunov
52509a20c7 mem: Beautify mem.h
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-23 12:48:57 +04:00
Andrey Vagin
0bca286722 ipc_ns: allocate enough memrory for the buffer
==22653== Syscall param read(buf) points to unaddressable byte(s)
==22653==    at 0x50480B0: __read_nocancel (in /usr/lib64/libpthread-2.17.so)
==22653==    by 0x40CF7C: parasite_dump_pages_seized (mem.c:244)
==22653==    by 0x41681D: cr_dump_tasks (cr-dump.c:1533)
==22653==    by 0x40448C: main (crtools.c:309)

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 19:06:03 +04:00
Andrey Vagin
084a630dfd zdtm: use a current stack for preccesses created by clone()
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 19:05:38 +04:00
Pavel Tikhomirov
9a726d4f9e page-server: Add daemonize call return check
On ubuntu this don't compile if no check.

Signed-off-by: Pavel Tikhomirov <snorcht@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 19:05:15 +04:00
Andrey Vagin
653053b40c proc: use vma flags for determing vmas with MAP_GROWSDOWN
When a kernel didn't show vma flags, we set MAP_GROWSDOWN for stack
vmas, but it's not reliable. E.g. thread stacks are mapped without
MAP_GROWSDOWN.

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 19:03:57 +04:00
Andrey Vagin
84e84cbb65 proc: add vma_area in a list after parsing all parameters
The size of vma can be changed after parsing flags. For example we need
to add a guard page for vma with MAP_GROWSDOWN.

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 19:03:48 +04:00
Cyrill Gorcunov
11b525f30e zdtm: Update proc-self test
The link must be read after restore on original
file descriptor since namespace id do change between
c/r sessions.

https://bugzilla.openvz.org/show_bug.cgi?id=2599

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-21 13:09:37 +04:00
Andrey Vagin
b2846be8c3 page-server: introduce the --daemon long option
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-20 19:11:19 +04:00
Cyrill Gorcunov
66cc9b6657 make: Introduce compile time include/config.h generation
It's being reported that some systems (as Ubuntu 13.04) already
have struct tcp_repair_opt definition in their system headers.

| sk-tcp.c:25:8: error: redefinition of struct tcp_repair_opt
| sk-tcp.c:31:2: error: redeclaration of enumerator TCP_NO_QUEUE

So add a facility for compile time testing for reported entities
to be present on a system. For this we generate include/config.h
where all tested entries will lay and source code need to include
it only in places where really needed.

Reported-by: Vasily Averin <vvs@parallels.com>
Acked-by: Kir Kolyshkin <kir@openvz.org>
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-20 16:02:14 +04:00
Cyrill Gorcunov
234dce785f make: Add scripts/utilities.mak
Some features need to be tested on the system
where the project is compiled, so instead of
drowning into autoconf hell lets try to handle
all this with make facility.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-20 16:02:07 +04:00
Andrey Vagin
4f1d2a1005 page-server: allow to execute page-server in the background (v2)
page-server creates a listen socket and only then goes into the
background, so we can be sure, that page-server is ready for work after
detaching.

v2: call daemon() in a proper place and reuse the option -d

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-20 15:00:40 +04:00
Pavel Emelyanov
e8e1cae2f9 zdtm: Wire proc-self test in
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 04:02:18 +04:00
Cyrill Gorcunov
650164e037 test: zdtm -- Add proc-self test
Just open /proc/self/ns/net and check if
it remains the same on restore.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 04:01:20 +04:00
Pavel Emelyanov
ec50a07727 ns: Add c/r for /proc/$pid/ns/$ids references
Based on work done by Cyrill Corcunov (many thanks for that).

In this commit we implement c/r for files which have opened
/proc/$pid/ns/$ids entries.

The idea is rather simple one

Checkpoint
==========

- Check if the file name is the one of known to be ns ref
- If match then write protobuf entry

Restore
=======

- Read all ns entries from the image
- When criu tries to open one we lookup over process
  tree to figure out which PID should be used in path
  and then just open it

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 04:00:05 +04:00
Cyrill Gorcunov
a49325b524 protobuf: Prepare scaffolds for procfs NS entries
[ xemul: rename pb.cflag -> pb.ns_cflag ]

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 03:37:00 +04:00
Cyrill Gorcunov
30936058a0 ns: Extend ns_desc to carry the length of the ns name
This will be needed for fast parsing of procfs ns references.

[ xemul: Add user_ns_desc here ]

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 03:36:56 +04:00
Cyrill Gorcunov
4531f0ac7d files: Add ability to use read link in dump_one_reg_file
To be able to dump procfs namespace entries we will need to
analyze the link name first and then figure out if the file
referred indeed a procfs entry or it's plain regular file.

This means we read link early, and to escape double reading
of same link, once we read it we remember it in fd_parms
structure which we pass to dump_one_reg_file.

Still the dump_one_reg_file is not solely used from inside
of dump_one_file, but from a number of other places (fifo,
special files) where fd_parms is filled only partially
and fill_fd_params is not even called. Thus dump_one_reg_file
must be ready for such scenario and read the link name by own
if the caller has not provided one.

To achieve all this we do

 - extend fd_parms structure to have a reference on a new
   fd_link structure, thus if caller already read the link
   name it might assign the reference and call for dump_one_reg_file

 - tune up dump_one_reg_file to fill own copy of fd_link
   structure if the caller has not provied one

  [ xemul: Added const to fill_fdlink arg ]

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 03:36:54 +04:00
Cyrill Gorcunov
19ce784db5 dump: Add missing FD_PARMS_INIT assignments
struct fd_parms is reused for two calls, so don't
forget to initialize it before dump_one_reg_file
call.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-18 03:36:01 +04:00
Pavel Emelyanov
4c3fe87258 ipcs: Fix mqueue sysctls directory name
Stupid misprint :(

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 18:45:29 +04:00
Pavel Emelyanov
21c1e71b19 ipc: The mqueue syscls can be missing from kernel
All this sits under config option, so we shouldn't try
to read/write them in this case. What to do if they are
in different on/off state on src/dst kernels is an open
question :\

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 17:40:06 +04:00
Pavel Emelyanov
61c6360c1d mem: Update soft-dirty detection to work on -mm tree
The soft-dirty API has changed slightly -- now the bit in
question _is_ in pagemap file (not pagemap2) but to see it
we have to reset soft-dirty for anyone first.

Teach the kerndat soft-dirty checker this fact. The actual
pagemap reading code already knows select pagemap/pagemap2
file itself.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 16:13:49 +04:00
Andrey Vagin
1412904e7d zdtm.sh: add the option to clean up in successful cases
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 15:07:22 +04:00
Andrey Vagin
3a93bee98c zdtm.sh: add ability to exclude some tests
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 15:07:21 +04:00
Andrey Vagin
635005b1c1 zdtm.sh: add description for the option -p
The option -p is used for testing page server

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 15:07:20 +04:00
Libo Chen
bd9b052b3f image: potential fd leak in err case
without this patch, fd will not be freeed

* Changelog from v1:
	* just free fd, no crt.ids

Signed-off-by: Libo Chen <libo.chen@huawei.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-17 15:06:36 +04:00
Libo Chen
112d7d770e crshow: fix potential fd leak
when pb_read_one_eof faild, we should close fd

Signed-off-by: Libo Chen <libo.chen@huawei.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 17:07:26 +04:00
Libo Chen
ad6db8332b mountns: potential fd leak when readlinkat call
when mntns_collect_root->readlinkat call faild, we should close pdf

Signed-off-by: Libo Chen <libo.chen@huawei.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 17:07:15 +04:00
Libo Chen
7071d52088 filelock: fix potential fl memleak
when is_blocked is seted, we should free file_lock

Signed-off-by: Libo Chen <libo.chen@huawei.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 17:07:00 +04:00
Libo Chen
37b586f055 Don't use \Newline in pr_perror
Signed-off-by: Libo Chen <libo.chen@huawei.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 17:05:45 +04:00
Pavel Emelyanov
df79e097ad page-server: Clos last loc xfer on connection close
Currsntly this affects nothing, but xfer close should be called.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 17:04:31 +04:00
Pavel Emelyanov
9c14120dd8 page-server: Introduce the OPEN protocol command
If we have empty pagemap, the page server receives no
IO-s for one and doesn't create image file. Intoroduce
the OPEN command to say to page server, that we're about
to xfer and image so it can prepare.

https://bugzilla.openvz.org/show_bug.cgi?id=2584

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-05-16 16:37:35 +04:00