<div dir="ltr">Sorry missed mailing list.<br clear="all"><div><div dir="ltr"><br>Best Regards, Tikhomirov Pavel.</div></div>
<br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Pavel Tikhomirov</b> <span dir="ltr">&lt;<a href="mailto:snorcht@gmail.com">snorcht@gmail.com</a>&gt;</span><br>
Date: 2014-04-01 17:36 GMT+04:00<br>Subject: Re: [CRIU] [PATCH] zdtm: add test maps008 for dedup on unmap vma<br>To: Andrew Vagin &lt;<a href="mailto:avagin@parallels.com">avagin@parallels.com</a>&gt;<br><br><br><div dir="ltr">
<div class="gmail_extra"><br><div class="gmail_quote">2014-04-01 17:18 GMT+04:00 Andrew Vagin <span dir="ltr">&lt;<a href="mailto:avagin@parallels.com" target="_blank">avagin@parallels.com</a>&gt;</span>:<div class=""><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Tue, Apr 01, 2014 at 03:10:40PM +0400, Tikhomirov Pavel wrote:<br>
&gt; this test mmaps 512M area of memory, than sleep to be dumped,<br>
&gt; than it munmaps 128 odd areas of size 2M of all 256 such areas<br>
&gt; and in second dump process will have only 256M of memory<br>
<br>
</div>Why do we need so big slice of memory? What is a difference between 64<br>
Mb and 512 Mb for this test? Will it catch more bugs with 512Mb?</blockquote><div><br></div></div><div>For this test it doesn&#39;t matter, yes, we can do even less than 64Mb.</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

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


<div>  </div></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
&gt; +             int ret;<br>
&gt; +             unsigned long size = 512 * PAGE_SIZE;<br>
&gt; +<br>
&gt; +             if (count * size &gt;= MEM_SIZE)<br>
&gt; +                     break;<br></div></blockquote><div><br></div></div><div>count til the end of memory, than break.</div><div class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>
&gt; +             p = start + ((count) * size);<br>
&gt; +             count+=2;<br></div></blockquote><div><br></div></div><div>counts step is 2, because I want unmap odd blocks: 1-st,3-rd, etc.</div><div class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>
&gt; +<br>
&gt; +             /*<br>
&gt; +              * unmap every odd block of size 2M<br>
&gt; +              */<br>
&gt; +             ret = munmap(p, size);<br>
<br>
</div>What is an idea to unmap one slice more than once?</blockquote></div><div>I unmap one slice only one time resulting memory will look like:</div><div>    |maped|unmaped|maped|unmaped|.... </div><div class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>
&gt; +             if (ret == -1) {<br>
&gt; +                     err(&quot;%p-%p&quot;, p, p + size);<br>
&gt; +                     return -1;<br>
&gt; +             }<br>
&gt; +     }<br>
&gt; +<br>
&gt; +     test_waitsig();<br>
&gt; +     pass();<br>
&gt; +     return 0;<br>
&gt; +}<br>
&gt; --<br>
&gt; 1.8.3.2<br>
&gt;<br>
</div>&gt; _______________________________________________<br>
&gt; CRIU mailing list<br>
&gt; <a href="mailto:CRIU@openvz.org" target="_blank">CRIU@openvz.org</a><br>
&gt; <a href="https://lists.openvz.org/mailman/listinfo/criu" target="_blank">https://lists.openvz.org/mailman/listinfo/criu</a><br>
</blockquote></div></div> </div></div>
</div><br></div>