[CRIU] [PATCH 6/6] mem: Cleanup dumping pages controls

Mike Rapoport rppt at linux.vnet.ibm.com
Mon Sep 19 23:34:32 PDT 2016


On Mon, Sep 19, 2016 at 02:18:22PM +0300, Pavel Emelyanov wrote:
> This makes the API cleaner -- now we tell to parasite_dump_pages_seized
> only two things -- whether it's pre-dump or not and, if not, whether this
> is lazy dump.
> 
> And make it do all the other decisions himself.
> 
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
>  criu/cr-dump.c     |  4 ++--
>  criu/include/mem.h |  2 +-
>  criu/mem.c         | 37 ++++++++++++++++++++++++-------------
>  3 files changed, 27 insertions(+), 16 deletions(-)
> 
> diff --git a/criu/cr-dump.c b/criu/cr-dump.c
> index d845ebd..d30dec8 100644
> --- a/criu/cr-dump.c
> +++ b/criu/cr-dump.c
> @@ -1176,7 +1176,7 @@ static int pre_dump_one_task(struct pstree_item *item)
> 
>  	parasite_ctl->pid.virt = item->pid.virt = misc.pid;
> 
> -	mdc.delayed_dump = true;
> +	mdc.pre_dump = true;
>  	mdc.lazy = false;
> 
>  	ret = parasite_dump_pages_seized(parasite_ctl, &vmas, &mdc);
> @@ -1336,7 +1336,7 @@ static int dump_one_task(struct pstree_item *item)
>  		}
>  	}
> 
> -	mdc.delayed_dump = opts.lazy_pages;
> +	mdc.pre_dump = false;
>  	mdc.lazy = opts.lazy_pages;
> 
>  	ret = parasite_dump_pages_seized(parasite_ctl, &vmas, &mdc);
> diff --git a/criu/include/mem.h b/criu/include/mem.h
> index 4b18af1..f1e6b78 100644
> --- a/criu/include/mem.h
> +++ b/criu/include/mem.h
> @@ -11,7 +11,7 @@ struct page_pipe;
>  struct pstree_item;
> 
>  struct mem_dump_ctl {
> -	bool	delayed_dump;
> +	bool	pre_dump;
>  	bool	lazy;
>  };
> 
> diff --git a/criu/mem.c b/criu/mem.c
> index 09a225d..96083ab 100644
> --- a/criu/mem.c
> +++ b/criu/mem.c
> @@ -199,7 +199,7 @@ static int generate_iovs(struct vma_area *vma, struct page_pipe *pp, u64 *map, u
>  }
> 
>  static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl *ctl,
> -		struct vm_area_list *vma_area_list, bool delayed_dump)
> +		struct vm_area_list *vma_area_list, bool skip_non_trackable)
>  {
>  	struct parasite_dump_pages_args *args;
>  	struct parasite_vma_entry *p_vma;
> @@ -217,7 +217,7 @@ static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl
>  		 * Kernel write to aio ring is not soft-dirty tracked,
>  		 * so we ignore them at pre-dump.
>  		 */
> -		if (vma_entry_is(vma->e, VMA_AREA_AIORING) && delayed_dump)
> +		if (vma_entry_is(vma->e, VMA_AREA_AIORING) && skip_non_trackable)
>  			continue;
>  		if (vma->e->prot & PROT_READ)
>  			continue;
> @@ -292,7 +292,6 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
>  	int ret = -1;
>  	unsigned cpp_flags = 0;
>  	unsigned long pmc_size;
> -	bool should_xfer = (!mdc->delayed_dump || mdc->lazy);
> 
>  	pr_info("\n");
>  	pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid.real);
> @@ -314,17 +313,27 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
>  		return -1;
> 
>  	ret = -1;
> -	if (!mdc->delayed_dump)
> +	if (!(mdc->pre_dump || mdc->lazy))
> +		/*
> +		 * Chunk mode pushes pages portion by portion. This mode
> +		 * only works when we don't need to keep pp for later
> +		 * use, i.e. on non-lazy non-predump.
> +		 */
>  		cpp_flags |= PP_CHUNK_MODE;
>  	if (!seized_native(ctl))
>  		cpp_flags |= PP_COMPAT;
> -	ctl->mem_pp = pp = create_page_pipe(vma_area_list->priv_size,
> +	pp = create_page_pipe(vma_area_list->priv_size,
>  					    mdc->lazy ? NULL : pargs_iovs(args),
>  					    cpp_flags);
>  	if (!pp)
>  		goto out;
> 
> -	if (should_xfer) {
> +	if (!mdc->pre_dump) {
> +		/*
> +		 * Regular dump -- create xfer object and send pages to it
> +		 * right here. For pre-dumps the pp will be taken by the
> +		 * caller and handled later.
> +		 */
>  		ret = open_page_xfer(&xfer, CR_FD_PAGEMAP, ctl->pid.virt);
>  		if (ret < 0)
>  			goto out_pp;
> @@ -350,7 +359,7 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
>  				!vma_area_is(vma_area, VMA_ANON_SHARED))
>  			continue;
>  		if (vma_entry_is(vma_area->e, VMA_AREA_AIORING)) {
> -			if (mdc->delayed_dump)
> +			if (mdc->pre_dump)
>  				continue;
>  			has_parent = false;
>  		}
> @@ -365,11 +374,11 @@ again:
>  			ret = generate_iovs(vma_area, pp, map, &off,
>  				has_parent);
>  			if (ret == -EAGAIN) {
> -				BUG_ON(mdc->delayed_dump);
> +				BUG_ON((pp->flags & PP_CHUNK_MODE) || mdc->pre_dump);

I think it should be BUG_ON(!(pp->flags & PP_CHUCK_MODE))...

> 
>  				ret = drain_pages(pp, ctl, args);
>  				if (!ret)
> -					ret = xfer_pages(pp, &xfer, false);
> +					ret = xfer_pages(pp, &xfer, mdc->lazy /* false actually */);
>  				if (!ret) {
>  					page_pipe_reinit(pp);
>  					goto again;
> @@ -384,7 +393,7 @@ again:
>  		memcpy(pargs_iovs(args), pp->iovs,
>  		       sizeof(struct iovec) * pp->nr_iovs);
>  	ret = drain_pages(pp, ctl, args);
> -	if (!ret && should_xfer)
> +	if (!ret && !mdc->pre_dump)
>  		ret = xfer_pages(pp, &xfer, mdc->lazy);
>  	if (ret)
>  		goto out_xfer;
> @@ -397,11 +406,13 @@ again:
> 
>  	ret = task_reset_dirty_track(ctl->pid.real);
>  out_xfer:
> -	if (should_xfer)
> +	if (!mdc->pre_dump)
>  		xfer.close(&xfer);
>  out_pp:
> -	if (ret || !mdc->delayed_dump)
> +	if (ret || !(mdc->pre_dump || mdc->lazy))
>  		destroy_page_pipe(pp);
> +	else
> +		ctl->mem_pp = pp;
>  out:
>  	pmc_fini(&pmc);
>  	pr_info("----------------------------------------\n");
> @@ -415,7 +426,7 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl,
>  	int ret;
>  	struct parasite_dump_pages_args *pargs;
> 
> -	pargs = prep_dump_pages_args(ctl, vma_area_list, mdc->delayed_dump);
> +	pargs = prep_dump_pages_args(ctl, vma_area_list, mdc->pre_dump);
> 
>  	/*
>  	 * Add PROT_READ protection for all VMAs we're about to
> -- 
> 2.5.0
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> 



More information about the CRIU mailing list