[CRIU] [PATCH 2/3] mem: if no parent image persists, can't rely on it
Pavel Emelyanov
xemul at parallels.com
Mon Apr 14 04:17:45 PDT 2014
On 04/09/2014 01:34 PM, Tikhomirov Pavel wrote:
> here was bug cause if e.g.: iterative snapshots are made and
> between two of them new process in process tree was created,
> criu will assume that all pages of this new process are "clean"
> believing that there is previous image for it and dirty tracking
> is on, but non of that is true, and it will end up in fail on restore.
>
> also this bug was not catched because of error in zdtm, look 3/3
>
> Signed-off-by: Tikhomirov Pavel <snorcht at gmail.com>
> ---
> mem.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/mem.c b/mem.c
> index ef1d010..6df198c 100644
> --- a/mem.c
> +++ b/mem.c
> @@ -106,7 +106,7 @@ static inline bool page_in_parent(u64 pme)
> * the memory contents is present in the pagent image set.
> */
>
> -static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u64 *off)
> +static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u64 *off, bool no_parent)
> {
> u64 *at = &map[PAGE_PFN(*off)];
> unsigned long pfn, nr_to_scan;
> @@ -130,7 +130,7 @@ static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u
> * page. The latter would be checked in page-xfer.
> */
>
> - if (page_in_parent(at[pfn])) {
> + if (page_in_parent(at[pfn]) && !no_parent) {
If xfer.parent == NULL then page_in_parent should never return true. Why is this happening?
> ret = page_pipe_add_hole(pp, vaddr);
> pages[0]++;
> } else {
> @@ -282,7 +282,7 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
> if (!map)
> goto out_xfer;
> again:
> - ret = generate_iovs(vma_area, pp, map, &off);
> + ret = generate_iovs(vma_area, pp, map, &off, xfer.parent == NULL);
> if (ret == -EAGAIN) {
> BUG_ON(pp_ret);
>
>
More information about the CRIU
mailing list