[CRIU] [PATCH] zdtm: add test maps008 for dedup on unmap vma

Andrew Vagin avagin at parallels.com
Tue Apr 1 06:18:06 PDT 2014


On Tue, Apr 01, 2014 at 03:10:40PM +0400, Tikhomirov Pavel wrote:
> this test mmaps 512M area of memory, than sleep to be dumped,
> than it munmaps 128 odd areas of size 2M of all 256 such areas
> and in second dump process will have only 256M of memory

Why do we need so big slice of memory? What is a difference between 64
Mb and 512 Mb for this test? Will it catch more bugs with 512Mb?

> 
> if --auto-dedup option is on, all images in the end must be
> of size 0
> 
> use:
> sudo bash test/zdtm.sh -P -i 2 --auto-dedup transition/maps008
> 
> to work need "[PATCH] dedup: add dedup on unmap vma, into
> auto-dedup and dedup"
> 
> Signed-off-by: Tikhomirov Pavel <snorcht at gmail.com>
> ---
>  test/zdtm.sh                        |  1 +
>  test/zdtm/live/transition/Makefile  |  1 +
>  test/zdtm/live/transition/maps008.c | 65 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 67 insertions(+)
>  create mode 100644 test/zdtm/live/transition/maps008.c
> 
> diff --git a/test/zdtm.sh b/test/zdtm.sh
> index d7f8fca..e4ed770 100755
> --- a/test/zdtm.sh
> +++ b/test/zdtm.sh
> @@ -103,6 +103,7 @@ static/chroot
>  static/chroot-file
>  static/rtc
>  transition/maps007
> +transition/maps008
>  "
>  # Duplicate list with ns/ prefix
>  TEST_LIST=$TEST_LIST$(echo $TEST_LIST | tr ' ' '\n' | sed 's#^#ns/#')
> diff --git a/test/zdtm/live/transition/Makefile b/test/zdtm/live/transition/Makefile
> index a4d0127..c1f7a7a 100644
> --- a/test/zdtm/live/transition/Makefile
> +++ b/test/zdtm/live/transition/Makefile
> @@ -13,6 +13,7 @@ TST_NOFILE	=	\
>  		fork2		\
>  		thread-bomb	\
>  		maps007		\
> +		maps008		\
>  
>  TST_FILE	=	\
>  		file_read	\
> diff --git a/test/zdtm/live/transition/maps008.c b/test/zdtm/live/transition/maps008.c
> new file mode 100644
> index 0000000..04054be
> --- /dev/null
> +++ b/test/zdtm/live/transition/maps008.c
> @@ -0,0 +1,65 @@
> +#include <unistd.h>
> +#include <sys/mman.h>
> +
> +#include "zdtmtst.h"
> +
> +#define MEM_SIZE (1 << 29)
> +#define PAGE_SIZE 4096
> +
> +const char *test_doc	= "create big mapping and unmap odd blocks of size 2M";
> +
> +int main(int argc, char **argv)
> +{
> +	void *start, *p;
> +	unsigned long long count = 0;
> +	unsigned long long i;
> +
> +	test_init(argc, argv);
> +
> +	/*
> +	 * allocate workspace
> +	 */
> +	start = mmap(NULL, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> +	if (start == MAP_FAILED)
> +		return -1;
> +
> +	test_msg("%p-%p\n", start, start + MEM_SIZE);
> +
> +	/*
> +	 * dirty pages to ensure allocation
> +	 */
> +	for (i = 0; i < MEM_SIZE/PAGE_SIZE; i++) {
> +		char *t = start + i * PAGE_SIZE;
> +		t[0] = 'o';
> +	}
> +
> +	test_daemon();
> +
> +	/*
> +	 * Sleep to make 1-st dump get all workspace
> +	 */
> +	sleep(1);

test_waitsig()

> +
> +	while (test_go()) {

I don't understand this loop. Pls explain.

> +		int ret;
> +		unsigned long size = 512 * PAGE_SIZE;
> +
> +		if (count * size >= MEM_SIZE)
> +			break;
> +		p = start + ((count) * size);
> +		count+=2;
> +
> +		/*
> +		 * unmap every odd block of size 2M
> +		 */
> +		ret = munmap(p, size);

What is an idea to unmap one slice more than once?

> +		if (ret == -1) {
> +			err("%p-%p", p, p + size);
> +			return -1;
> +		}
> +	}
> +
> +	test_waitsig();
> +	pass();
> +	return 0;
> +}
> -- 
> 1.8.3.2
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list