1. 10 May, 2017 23 commits
  2. 24 Apr, 2017 1 commit
    • Pavel Emelyanov's avatar
      criu: Version 3.0 · fce87893
      Pavel Emelyanov authored
      So, we've done a HUUGE rework in this release, that's why it's 3.0.
      Two biggest changes are:
      
      * Compel library -- the framwork for parasite code injection.
      * 32bit x86 support. Note, that it's neither x32 support, not 32-bit
        criu. It's purely the ability to dump 32-bit tasks on 64-bit host.
      
      With compel at hands the 'criu exec' is removed.
      
      Main set of kudos go to Cyrill and Dima for this heavy lifting :)
      
      Other things include shutdown-ed UDP sockets, bind-mounts to external
      bind mounts, ASAN, extentions to RPC, rework of SysVIPC shmem dump
      format and some bugfixes and beautifications in CRIT.
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      fce87893
  3. 20 Apr, 2017 3 commits
  4. 17 Apr, 2017 5 commits
    • Dmitry Safonov's avatar
      arm: Workaround shmat() page coloring alignment · e98d16e7
      Dmitry Safonov authored
      Please, see incode comment about the issue.
      There was an attempt to fix this feature in kernel:
        http://www.spinics.net/lists/arm-kernel/msg258870.html
      
      I'll send a patch for kernel with a correct justification.
      Still it's worth to workaround this on older kernels.
      mremap() after shmat() makes it possible to C/R shmem between ARMv7 CPUs.
      Without it C/R will fail even on the same platform.
      
      That is possible that this workaround changes *restore failure* to
      *corruption* in shared memory after restore.
      Still, I think it's worth to be applied by the following reasons:
      1. All ARMv7 CPUs do not have VIPT aliasing data cache.
         And ARMv6 CPUs may have any, but they are not popular because of UMP.
      2. SysV IPC shmem should be writable and SHMLBA unaligned
         (if it's only readable, then it's OK).
      3. For the data corruption we need to migrate from non-VIPT cached CPUs
         to VIPT aliasing.
      4. As this is shmem migration between platforms - quite likely we have
         it`s copy (in case of whole IPC namespace dump - in images).
      5. C/R before on the same CPU may fail (quite likely, more than 50% of
         zdtm/transition/ipc failed while I've test it).
      
      So, I think it's very unlikely that someone uses CRIU to migrate
      from ARMv7 to ARMv6 unaligned writable shmem, but if he is - here is
      a BIG WARNING on restore.
      
      And after all: we've restored application as it was on checkpoint,
      we can't reliably tell that shmem needs align on the target platform,
      but we warned on restoring.
      
      I wanted to test the cpuid for VIPT caching firstly, but it's in cp15
      coprocessor, which means it's unavailable from userspace. Only one
      reliable way to tell is to check couple of first boot lines in dmesg:
      [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      e98d16e7
    • Dmitry Safonov's avatar
      arm32/Makefile: fix readable mappings getting +x · d7c86c8b
      Dmitry Safonov authored
      Flag `noexecstack' for ld implies `EXSTACK_DISABLE_X' ELF flag
      on CRIU binary. Without this flag the kernel ELF loader will set
      `READ_IMPLIES_EXEC' personality bit:
      >	if (elf_read_implies_exec(loc->elf_ex, executable_stack))
      >		current->personality |= READ_IMPLIES_EXEC;
      
      This flag is checked by sys_mmap():
      >	if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))
      >		if (!(file && path_noexec(&file->f_path)))
      >			prot |= PROT_EXEC;
      
      Which results in each mmap() syscall returning +x mapping for any
      readable mapping for CRIU binary, e.g:
      Before C/R:
      76fc4000-76fc5000 r--p 0001f000 b3:02 131656     /usr/lib/ld-2.25.so
      76fc5000-76fc6000 rw-p 00020000 b3:02 131656     /usr/lib/ld-2.25.so
      After restore:
      76fc4000-76fc5000 r-xp 0001f000 b3:02 131656     /usr/lib/ld-2.25.so
      76fc5000-76fc6000 rwxp 00020000 b3:02 131656     /usr/lib/ld-2.25.so
      
      Which also makes ZDTM very sad:
      1: Old maps lost: set(["76f80000-76f81000 ['rw-p', '0120400']", "25000-26000
      ['rw-p', '0120400']", "76f7d000-76f7f000 ['rw-p']", "14a8000-14c9000 ['rw-p']",
      "76f4a000-76f4c000 ['r--p', '0120400']", "7ed3d000-7ed7f000 ['rw-p']",
      "76f7f000-76f80000 ['r--p', '0120400']", "24000-25000 ['r--p', '0120400']",
      "76f4c000-76f50000 ['rw-p', '0120400']"])
      1: New maps appeared: set(["76f7f000-76f80000 ['r-xp', '0120400']",
      "7ed3d000-7ed7f000 ['rwxp']", "76f4a000-76f4c000 ['r-xp', '0120400']",
      "76f80000-76f81000 ['rwxp', '0120400']", "24000-25000 ['r-xp', '0120400']",
      "14a8000-14c9000 ['rwxp']", "25000-26000 ['rwxp', '0120400']",
      "76f7d000-76f7f000 ['rwxp']", "76f4c000-76f50000 ['rwxp', '0120400']"])
      
      Maybe we also need to set it for arm64 or even for all archs, but that
      needs to be tested in the first place, so add it now to arm32, x86
      already has it.
      Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      d7c86c8b
    • Dmitry Safonov's avatar
      python: specify python2 as .py interpreter · 057c3f29
      Dmitry Safonov authored
      On some distro the default python interpreter is Python 3,
      which results in such errors:
      >  Running zdtm/static/socket-tcp-closed.hook(--post-start)
      >  make[1]: Nothing to be done for default.
      >  ./socket-tcp-closed --pidfile=socket-tcp-closed.pid --outfile=socket-tcp-closed.out
      >    File "zdtm/static/socket-tcp-closed.hook", line 16
      >      except OSError, e:
      >                    ^
      >  SyntaxError: invalid syntax
      >  ######### Test zdtm/static/socket-tcp-closed FAIL at hook --post-start #########
      >  Running zdtm/static/socket-tcp-closed.hook(--clean)
      >    File "zdtm/static/socket-tcp-closed.hook", line 16
      >      except OSError, e:
      >                    ^
      >  SyntaxError: invalid syntax
      >  Traceback (most recent call last):
      >    File "zdtm.py", line 1921, in <module>
      >      do_run_test(tinfo[0], tinfo[1], tinfo[2], tinfo[3])
      >    File "zdtm.py", line 1388, in do_run_test
      >      try_run_hook(t, ["--clean"])
      >    File "zdtm.py", line 1053, in try_run_hook
      >      raise test_fail_exc("hook " + " ".join(args))
      >  __main__.test_fail_exc: <__main__.test_fail_exc instance at 0x76294468>
      Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      057c3f29
    • Dmitry Safonov's avatar
      arm/compel: add generated headers to .gitignore · 692da148
      Dmitry Safonov authored
      [criu]# git status -s
      ?? compel/arch/arm/plugins/std/syscalls/syscalls.S
      ?? compel/plugins/include/uapi/std/syscall-aux.S
      ?? compel/plugins/include/uapi/std/syscall-aux.h
      Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      692da148
    • Dmitry Safonov's avatar
      test/maps01: document mmap() failures · ab33ae2d
      Dmitry Safonov authored
      Arm32 devices often have poor amount of RAM. E.g., RPI2 board
      has only 1Gb memory. This lead to failures with maps01 test,
      which tries to mmap() 1Gb of memory. The failures of test is
      not very evident - let's document mmap() errors here to
      blow some light on the situation.
      Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      ab33ae2d
  5. 11 Apr, 2017 8 commits
    • Pavel Emelyanov's avatar
      crit: Beautify unix names recode · e77d36c3
      Pavel Emelyanov authored
      Unix socket name can be a string with any bytes in it. So to
      print the name we use base64 encoding. Doing so doesn't allow
      to see the socket name when it contains only printable chars.
      
      So here's the custom encoding for bytes fields, that can be
      used for custom conversion.
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      e77d36c3
    • Pavel Emelyanov's avatar
      crit: Decode some numbers into strings · 5e3509ba
      Pavel Emelyanov authored
      There are several places in image files, where we store
      integers, but these numbers actually mean some string.
      E.g. socket families, states and types and tasks states.
      
      So here's the (criu).dict option for such fields that
      helps to convert the numbers into strings and back.
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      5e3509ba
    • Adrian Reber's avatar
      RPC: add version check interface · fe974169
      Adrian Reber authored
      Instead of parsing the output of 'criu -V' this offers a RPC interface
      to get CRIU's version. In a follow up patch a test script is included
      to use the new interface:
      
       ./version.py
       Connecting to CRIU in swrk mode to check the version:
       RPC: Success
       CRIU major 2
       CRIU minor 12
       CRIU gitid v2.12-635-g6d3ae4d
      
      This change exports the following version fields:
       * major
       * minor
       * gitid (optional)
       * sublevel (optional)
       * extra (optional)
       * name (optional)
      
      The optional gitid field is not set when CRIU is not built from git.
      Signed-off-by: 's avatarAdrian Reber <areber@redhat.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      fe974169
    • Adrian Reber's avatar
      RPC: add script to test the new RPC version interface · bc169fef
      Adrian Reber authored
      This script connects to 'criu swrk' and asks for the version. If running
      from a git checkout the output would look like this:
      
       $ ./version.py
       Connecting to CRIU in swrk mode to check the version:
       RPC: Success
       CRIU major 2
       CRIU minor 12
       CRIU gitid v2.12-635-g6d3ae4d
      
      If not running from git checkout it looks like this:
      
       $ ./version.py
       Connecting to CRIU in swrk mode to check the version:
       RPC: Success
       CRIU major 2
       CRIU minor 12
      
      If running with a CRIU binary which does not support the VERSION
      command:
      
       $ ./version.py
       Connecting to CRIU in swrk mode to check the version:
       Error (cr-service.c:116): RPC error: Invalid req: Success
       RPC: Unexpected msg type
      Signed-off-by: 's avatarAdrian Reber <areber@redhat.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      bc169fef
    • Pavel Emelyanov's avatar
      ipc: Keep shmem segments contents into pagemap/page images · 9d2e1dfe
      Pavel Emelyanov authored
      Right now the contents of the sysvipc shmem segment is stored as
      raw blob in the ipcns-shm image. This is bad for two reasons.
      
      First is that huge segments with holes are filled with real zeroes
      in image. Second is that we prefer not to mix images with pb object
      and raw data.
      
      To fix both let's re-use the shmem.c code that keeps anon shared
      memory contents in pagemap/pages images.
      
      https://github.com/xemul/criu/issues/287Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      9d2e1dfe
    • Pavel Emelyanov's avatar
      ipcns: Split some routines · 0ba02b2c
      Pavel Emelyanov authored
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      0ba02b2c
    • Pavel Emelyanov's avatar
      shmem: Split some routines · 71d93a5a
      Pavel Emelyanov authored
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      71d93a5a
    • Dmitry Safonov's avatar
      zdtm: rely on -D_GNU_SOURCE passed from Makefiles · 3bdaf5a9
      Dmitry Safonov authored
      After the commit
        02c763939c10 ("test/zdtm: unify common code")
      
      CFLAGS with -D_GNU_SOURCE defined in the top Makefile
      are being passed to tests Makefiles.
      As _GNU_SOURCE is also defined by tests, that resulted in
      zdtm tests build failures:
      
        make[2]: Entering directory `/home/criu/test/zdtm/lib'
         CC        test.o
        test.c:1:0: error: "_GNU_SOURCE" redefined [-Werror]
         #define _GNU_SOURCE
         ^
        <command-line>:0:0: note: this is the location of the previous definition
        cc1: all warnings being treated as errors
        make[2]: *** [test.o] Error 1
      
      However, we didn't catch this in time by Travis-CI, as zdtm.py doesn't
      do `make zdtm`, rather it does `make -C test/zdtm/{lib,static,transition}`.
      By calling middle makefile this way, it doesn't have _GNU_SOURCE in
      CFLAGS from top-Makefile.
      
      I think the right thing to do here - is following CRIU's way:
      rely on definition of _GNU_SOURCE by Makefiles.
      
      This patch is almost fully generated with
        find test/zdtm/ -name '*.c' -type f					\
           -exec sed -i '/define _GNU_SOURCE/{n;/^$/d;}' '{}' \;		\
           -exec sed -i '/define _GNU_SOURCE/d' '{}' \;
      
      With an exception for adding -D_GNU_SOURCE in tests Makefile.inc for
      keeping the same behaviour for zdtm.py.
      Also changed utsname.c to use utsname::domainname, rather private
      utsname::__domainname, as now it's uncovered (from sys/utsname.h):
      > struct utsname
      >  {
      ...
      > # ifdef __USE_GNU
      >     char domainname[_UTSNAME_DOMAIN_LENGTH];
      > # else
      >     char __domainname[_UTSNAME_DOMAIN_LENGTH];
      > # endif
      Reported-by: 's avatarAdrian Reber <areber@redhat.com>
      Cc: Kir Kolyshkin <kir@openvz.org>
      Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      3bdaf5a9