<div dir="ltr"><div>It seem to me, that clear_soft_dirty function for pte in kernel is called only</div><div>if we had explicit write to /proc/pid/clear_refs. Only after that all pages will</div><div>become write-protected and dirty tracking realy works, if new process was</div>
<div>created between snapshots, some part of its memory can be not write</div><div>protected so no PF generated for this part and some soft-dirty bits not set,</div><div>isn&#39;t it?</div><div class="gmail_extra"><br clear="all">
<div><div dir="ltr">
<br>Best Regards, Tikhomirov Pavel.</div></div>
<br><br><div class="gmail_quote">2014-04-14 16:54 GMT+04:00 Pavel Emelyanov <span dir="ltr">&lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div>On 04/14/2014 04:52 PM, Pavel Tikhomirov wrote:<br>
&gt; try next patch(3/3) without this one, you&#39;ll catch(triggers 1/5 approximately)<br>
&gt; (00.017322)  21253: Error (page-read.c:67): No parent for snapshot pagemap<br>
&gt; this mean that page is in parent but no parent exists<br>
<br>
</div>Plz, investigate.<br>
<div><div><br>
&gt; sudo bash test/zdtm.sh -i 3 -s transition/fork<br>
&gt; ================================= CRIU CHECK =================================<br>
&gt; Looks good.<br>
&gt; Execute zdtm/live/transition/fork<br>
&gt; ./fork --pidfile=fork.pid --outfile=fork.out<br>
&gt; Dump 19786<br>
&gt; /home/snorch/temp_criu/criu/test/post-dump.sh: 3: [: post-dump: unexpected operator<br>
&gt; Dump 19786<br>
&gt; /home/snorch/temp_criu/criu/test/post-dump.sh: 3: [: post-dump: unexpected operator<br>
&gt; Dump 19786<br>
&gt; Restore<br>
&gt; Test: zdtm/live/transition/fork, Result: FAIL<br>
&gt; Test: zdtm/live/transition/fork, Namespace:<br>
&gt; Dump log   : /home/snorch/temp_criu/criu/test/dump/fork/19786/3/dump.log<br>
&gt; ==================================== ERROR ====================================<br>
&gt; --------------------------------- grep Error ---------------------------------<br>
&gt; (00.023035) Error (image.c:202): Unable to open pagemap-21253.img: No such file or directory<br>
&gt; (00.023046) Error (image.c:202): Unable to open pages-21253.img: No such file or directory<br>
&gt; (00.023049) Error (page-xfer.c:661): No parent image found, though parent directory is set: No such file or directory<br>
&gt; ------------------------------------- END -------------------------------------<br>
&gt; Restore log: /home/snorch/temp_criu/criu/test/dump/fork/19786/3/restore.log<br>
&gt; --------------------------------- grep Error ---------------------------------<br>
&gt; (00.017277)  21253: Error (image.c:202): Unable to open pagemap-21253.img: No such file or directory<br>
&gt; (00.017297)  21253: Error (image.c:202): Unable to open pages-21253.img: No such file or directory<br>
&gt; (00.017322)  21253: Error (page-read.c:67): No parent for snapshot pagemap<br>
&gt; (00.017468)  19786: Error (cr-restore.c:1036): 21253 exited, status=1<br>
&gt; (00.017502) Error (cr-restore.c:1579): Restoring FAILED.<br>
&gt; ------------------------------------- END -------------------------------------<br>
&gt; ================================= ERROR OVER =================================<br>
&gt;<br>
&gt;<br>
&gt; Best Regards, Tikhomirov Pavel.<br>
&gt;<br>
&gt;<br>
</div></div>&gt; 2014-04-14 15:17 GMT+04:00 Pavel Emelyanov &lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a> &lt;mailto:<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;&gt;:<br>

<div>&gt;<br>
&gt;     On 04/09/2014 01:34 PM, Tikhomirov Pavel wrote:<br>
&gt;     &gt; here was bug cause if e.g.: iterative snapshots are made and<br>
&gt;     &gt; between two of them new process in process tree was created,<br>
&gt;     &gt; criu will assume that all pages of this new process are &quot;clean&quot;<br>
&gt;     &gt; believing that there is previous image for it and dirty tracking<br>
&gt;     &gt; is on, but non of that is true, and it will end up in fail on restore.<br>
&gt;     &gt;<br>
&gt;     &gt; also this bug was not catched because of error in zdtm, look 3/3<br>
&gt;     &gt;<br>
</div>&gt;     &gt; Signed-off-by: Tikhomirov Pavel &lt;<a href="mailto:snorcht@gmail.com" target="_blank">snorcht@gmail.com</a> &lt;mailto:<a href="mailto:snorcht@gmail.com" target="_blank">snorcht@gmail.com</a>&gt;&gt;<br>

<div><div>&gt;     &gt; ---<br>
&gt;     &gt;  mem.c | 6 +++---<br>
&gt;     &gt;  1 file changed, 3 insertions(+), 3 deletions(-)<br>
&gt;     &gt;<br>
&gt;     &gt; diff --git a/mem.c b/mem.c<br>
&gt;     &gt; index ef1d010..6df198c 100644<br>
&gt;     &gt; --- a/mem.c<br>
&gt;     &gt; +++ b/mem.c<br>
&gt;     &gt; @@ -106,7 +106,7 @@ static inline bool page_in_parent(u64 pme)<br>
&gt;     &gt;   * the memory contents is present in the pagent image set.<br>
&gt;     &gt;   */<br>
&gt;     &gt;<br>
&gt;     &gt; -static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u64 *off)<br>
&gt;     &gt; +static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u64 *off, bool no_parent)<br>
&gt;     &gt;  {<br>
&gt;     &gt;       u64 *at = &amp;map[PAGE_PFN(*off)];<br>
&gt;     &gt;       unsigned long pfn, nr_to_scan;<br>
&gt;     &gt; @@ -130,7 +130,7 @@ static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u<br>
&gt;     &gt;                * page. The latter would be checked in page-xfer.<br>
&gt;     &gt;                */<br>
&gt;     &gt;<br>
&gt;     &gt; -             if (page_in_parent(at[pfn])) {<br>
&gt;     &gt; +             if (page_in_parent(at[pfn]) &amp;&amp; !no_parent) {<br>
&gt;<br>
&gt;     If xfer.parent == NULL then page_in_parent should never return true. Why is this happening?<br>
&gt;<br>
&gt;     &gt;                       ret = page_pipe_add_hole(pp, vaddr);<br>
&gt;     &gt;                       pages[0]++;<br>
&gt;     &gt;               } else {<br>
&gt;     &gt; @@ -282,7 +282,7 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,<br>
&gt;     &gt;               if (!map)<br>
&gt;     &gt;                       goto out_xfer;<br>
&gt;     &gt;  again:<br>
&gt;     &gt; -             ret = generate_iovs(vma_area, pp, map, &amp;off);<br>
&gt;     &gt; +             ret = generate_iovs(vma_area, pp, map, &amp;off, xfer.parent == NULL);<br>
&gt;     &gt;               if (ret == -EAGAIN) {<br>
&gt;     &gt;                       BUG_ON(pp_ret);<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br></div></div>