[CRIU] [PATCH] zdtm: check pre-dump of shared memory

Andrei Vagin avagin at virtuozzo.com
Tue Oct 11 16:00:01 PDT 2016


Pavel, could you commit this patch?

On Fri, Sep 16, 2016 at 03:31:28PM +0300, Andrei Vagin wrote:
> From: Andrei Vagin <avagin at virtuozzo.com>
> 
> [root at fc24 criu]# python test/zdtm.py run -t zdtm/transition/shmem  --pre 3
> === Run 1/1 ================
> 
> ======================== Run zdtm/transition/shmem in h ========================
> cc -g -O2 -Wall -Werror -fno-strict-aliasing  -iquote ../lib/arch/x86/include -I../lib   shmem.c ../lib/libzdtmtst.a ../lib/libzdtmtst.a -o shmem
> Start test
> ./shmem --pidfile=shmem.pid --outfile=shmem.out
> Run criu pre-dump
> Run criu pre-dump
> Run criu pre-dump
> Run criu dump
> Run criu restore
> Send the 15 signal to  33
> Wait for zdtm/transition/shmem(33) to die for 0.100000
> Test output: ================================
> 15:12:25.444:    33: FAIL: shmem.c:70: checksum mismatch: ea71000 109c9000
> 
> Cc: Eugene Batalov <eabatalov89 at gmail.com>
> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
> ---
>  test/zdtm/transition/Makefile |  1 +
>  test/zdtm/transition/shmem.c  | 82 +++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 83 insertions(+)
>  create mode 100644 test/zdtm/transition/shmem.c
> 
> diff --git a/test/zdtm/transition/Makefile b/test/zdtm/transition/Makefile
> index f3797ad..7ddb238 100644
> --- a/test/zdtm/transition/Makefile
> +++ b/test/zdtm/transition/Makefile
> @@ -23,6 +23,7 @@ TST_NOFILE	=	\
>  		file_aio        \
>  		socket-tcp      \
>  		socket-tcp6     \
> +		shmem		\
>  
>  
>  TST_FILE	=	\
> diff --git a/test/zdtm/transition/shmem.c b/test/zdtm/transition/shmem.c
> new file mode 100644
> index 0000000..f6b093c
> --- /dev/null
> +++ b/test/zdtm/transition/shmem.c
> @@ -0,0 +1,82 @@
> +#define _GNU_SOURCE
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/mman.h>
> +#include <signal.h>
> +#include <sys/wait.h>
> +
> +#include "zdtmtst.h"
> +
> +const char *test_author	= "Andrei Vagin <avagin at virtuozzo.com>";
> +
> +#define MEM_SIZE (1<<25)
> +
> +int main(int argc, char **argv)
> +{
> +	pid_t pid;
> +	void *addr;
> +	int *sum, status;
> +	long size;
> +
> +	test_init(argc, argv);
> +
> +	sum = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
> +	if (sum == MAP_FAILED)
> +		return 1;
> +	addr = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
> +	if (addr == MAP_FAILED)
> +		return 1;
> +
> +	pid = fork();
> +	if (pid < 0)
> +		return 1;
> +
> +	if (pid == 0) {
> +		int i = 0;
> +		long size = PAGE_SIZE, old_size = MEM_SIZE;
> +
> +		status = 0;
> +		while (test_go()) {
> +			addr = mremap(addr, old_size, size, MREMAP_MAYMOVE);
> +
> +			status -= *((int *)(addr + size - PAGE_SIZE));
> +
> +			*((int *)(addr + size - PAGE_SIZE)) = i++;
> +
> +			status += *((int *)(addr + size - PAGE_SIZE));
> +
> +			old_size = size;
> +			size += PAGE_SIZE;
> +			if (size > MEM_SIZE)
> +				size = PAGE_SIZE;
> +		}
> +		*sum = status;
> +		return 0;
> +	}
> +
> +	test_daemon();
> +	test_waitsig();
> +
> +	kill(pid, SIGTERM);
> +	status = -1;
> +	waitpid(pid, &status, 0);
> +	if (status) {
> +		pr_perror("The child return non-zero code: %d\n", status);
> +		return 1;
> +	}
> +
> +	status = 0;
> +	for (size = PAGE_SIZE; size <= MEM_SIZE; size += PAGE_SIZE) {
> +		status += *((int *)(addr + size - PAGE_SIZE));
> +	}
> +
> +	if (status != *sum) {
> +		fail("checksum mismatch: %x %x\n", status, *sum);
> +		return 1;
> +	}
> +
> +	pass();
> +
> +	return 0;
> +}
> -- 
> 2.7.4
> 


More information about the CRIU mailing list