[CRIU] [PATCH] vma: don't skip vmas during searching a parent vma

Filipe Brandenburger filbranden at google.com
Tue May 13 09:50:46 PDT 2014


Hi,

I just checked this set of patches
[PATCH] vma: don't skip vmas during searching a parent vma
[PATCH] mem: stop searching a parent vma if we found one

And after applying them I seem to be seeing the right logs for COW
regions to be shared between parent and child, so I do believe they
address the issue of the sessions being skipped because they were
previously getting out of sync.

Cheers,
Filipe


On Tue, May 13, 2014 at 5:25 AM, Andrey Vagin <avagin at openvz.org> wrote:
> We stop searching if vma->start is bigger than a required one.
> The coursor is set on the last examined vma. When we are searching a
> parent vma for the next vma, we start examine vma-s starting from
> coursor->next, so we don't examine the vma, which is pointed by cursor.
>
> This patch replaces list_for_each_entry_continue on list_for_each_entry_from.
>
> Reported-by: Filipe Brandenburger <filbranden at google.com>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  cr-restore.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/cr-restore.c b/cr-restore.c
> index 91cce50..530d2c4 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -239,7 +239,7 @@ static int map_private_vma(pid_t pid, struct vma_area *vma, void **tgt_addr,
>         if (vma->page_bitmap == NULL)
>                 return -1;
>
> -       list_for_each_entry_continue(p, pvma_list, list) {
> +       list_for_each_entry_from(p, pvma_list, list) {
>                 if (p->e->start > vma->e->start)
>                          break;
>
> @@ -265,8 +265,6 @@ static int map_private_vma(pid_t pid, struct vma_area *vma, void **tgt_addr,
>                 break;
>         }
>
> -       *pvma = p;
> -
>         /*
>          * A grow-down VMA has a guard page, which protect a VMA below it.
>          * So one more page is mapped here to restore content of the first page
> @@ -295,6 +293,8 @@ static int map_private_vma(pid_t pid, struct vma_area *vma, void **tgt_addr,
>                         pr_perror("Unable to map ANON_VMA");
>                         return -1;
>                 }
> +
> +               *pvma = p;
>         } else {
>                 /*
>                  * This region was found in parent -- remap it to inherit physical
> @@ -309,6 +309,7 @@ static int map_private_vma(pid_t pid, struct vma_area *vma, void **tgt_addr,
>                         return -1;
>                 }
>
> +               *pvma = list_entry(p->list.next, struct vma_area, list);
>         }
>
>         vma->premmaped_addr = (unsigned long) addr;
> @@ -508,7 +509,7 @@ static int prepare_mappings(int pid)
>         current->rst->premmapped_addr = addr;
>         current->rst->premmapped_len = vmas->priv_size;
>
> -       pvma = list_entry(parent_vmas, struct vma_area, list);
> +       pvma = list_first_entry(parent_vmas, struct vma_area, list);
>
>         list_for_each_entry(vma, &vmas->h, list) {
>                 if (pstart > vma->e->start) {
> --
> 1.8.5.3
>


More information about the CRIU mailing list