[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