[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