[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