[CRIU] [PATCH v2] lazy-pages: don't close page_read when a parent process exits

Andrei Vagin avagin at virtuozzo.com
Thu Sep 7 18:24:01 MSK 2017


Applied, thanks

On Thu, Sep 07, 2017 at 06:15:57PM +0300, Mike Rapoport wrote:
> If there were fork()'s during lazy-restore we create a shallow copy of the
> parent process' page-read. Since all the copies reference the same open
> files, we cannot close the page-read until we finish restore of all the
> processes that share the page-read.
> 
> Signed-off-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
> ---
> v2: rebased on current criu-dev
> 
>  criu/uffd.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/criu/uffd.c b/criu/uffd.c
> index 077724b..43dc0ce 100644
> --- a/criu/uffd.c
> +++ b/criu/uffd.c
> @@ -80,6 +80,7 @@ struct lazy_pages_info {
>  	struct list_head reqs;
>  
>  	struct lazy_pages_info *parent;
> +	unsigned num_children;
>  
>  	struct page_read pr;
>  
> @@ -136,7 +137,9 @@ static void lpi_fini(struct lazy_pages_info *lpi)
>  	free_iovs(lpi);
>  	if (lpi->lpfd.fd > 0)
>  		close(lpi->lpfd.fd);
> -	if (!lpi->parent && lpi->pr.close)
> +	if (lpi->parent)
> +		lpi->parent->num_children--;
> +	if (!lpi->parent && !lpi->num_children && lpi->pr.close)
>  		lpi->pr.close(&lpi->pr);
>  	free(lpi);
>  }
> @@ -947,6 +950,8 @@ static int handle_fork(struct lazy_pages_info *parent_lpi, struct uffd_msg *msg)
>  
>  	dup_page_read(&lpi->parent->pr, &lpi->pr);
>  
> +	lpi->parent->num_children++;
> +
>  	return 1;
>  
>  out:
> -- 
> 2.7.4
> 


More information about the CRIU mailing list