• Pavel Tikhomirov's avatar
    zdtm: check that pid-reuse does not break iterative memory dump · 4d9bf608
    Pavel Tikhomirov authored
    The idea of the test is:
    
    1) mmap separate page and put variable there, so that other usage does
    not dirty these region. Initialize the variable with VALUE_A.
    
    2) fork a child with special pid == CHILD_NS_PID. Only if it is a first
    child overwrite the variable with VALUE_B.
    
    3) wait for the end of the next predump or end of restore with
    test_wait_pre_dump_ack/test_wait_pre_dump pair and kill our child.
    
    Note: The memory region is "clean" in parent.
    
    4) goto (2) unles end of cr is reported by test_waitpre
    
    So on first iteration child with pid CHILD_NS_PID was dumped with
    VALUE_B, on all other iterations and on final dump other child with the
    same pid exists but with VALUE_A. But on all iterations after the first
    one we have these memory region "clean". So criu before the fix would
    have restored the VALUE_B taking it from first child's image, but should
    restore VALUE_A.
    
    Note: Child in its turn waits termination and performs a check that variable
    value doesn't change after c/r.
    
    We should run the test with at least one predump to trigger the problem:
    
    [root@snorch criu]# ./test/zdtm.py run --pre 1 -k always -t zdtm/transition/pid_reuse
    Checking feature ns_pid
    Checking feature ns_get_userns
    Checking feature ns_get_parent
    
    === Run 1/1 ================ zdtm/transition/pid_reuse
    
    ===================== Run zdtm/transition/pid_reuse in ns ======================
    DEP       pid_reuse.d
    CC        pid_reuse.o
    LINK      pid_reuse
    Start test
    Test is SUID
    ./pid_reuse --pidfile=pid_reuse.pid --outfile=pid_reuse.out
    Run criu pre-dump
    Send the 10 signal to  52
    Run criu dump
    Run criu restore
    Send the 15 signal to  73
    Wait for zdtm/transition/pid_reuse(73) to die for 0.100000
    Test output: ================================
    14:47:57.717: 11235: ERR: pid_reuse.c:76: Wrong value in a variable after restore
    14:47:57.717:     4: FAIL: pid_reuse.c:110: Task 11235 exited with wrong code 1 (errno = 11 (Resource temporarily unavailable))
    
    <<< ================================
    
    https://jira.sw.ru/browse/PSBM-67502
    
    v3: simplify waitpid's status check
    v9: switch to test_wait_pre_dump(_ack)
    Signed-off-by: 's avatarPavel Tikhomirov <ptikhomirov@virtuozzo.com>
    Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
    4d9bf608
Name
Last commit
Last update
..
compel Loading commit data...
inhfd Loading commit data...
jenkins Loading commit data...
others Loading commit data...
zdtm Loading commit data...
.gitignore Loading commit data...
Makefile Loading commit data...
abrt.sh Loading commit data...
check_actions.py Loading commit data...
crit-recode.py Loading commit data...
empty-netns-prep.sh Loading commit data...
groups.desc Loading commit data...
inhfd.desc Loading commit data...
pycriu Loading commit data...
show_action.sh Loading commit data...
umount2.c Loading commit data...
zdtm.desc Loading commit data...
zdtm.py Loading commit data...
zdtm_ct.c Loading commit data...
zdtm_mount_cgroups Loading commit data...