• 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
Makefile 1.54 KB