[CRIU] Re: [PATCH cr 07/16] restore: map private vma-s before forking children

Andrey Vagin avagin at parallels.com
Wed Oct 31 06:16:01 EDT 2012


On Tue, Oct 30, 2012 at 10:56:13PM +0400, Pavel Emelyanov wrote:
> >>
> >>> +			break;
> >>> +		}
> >>> +
> >>> +	}
> >>> +
> >>> +	*pvma = list_entry(p->list.prev, struct vma_area, list);
> >>
> >> prev? Why prev? We should move forward the parent list. No?
> > 
> > list_for_each_entry_continue() starts from a next element, so we need to
> > save prev here.
> 
> Indeed. Then the initialization of the pvma with _first_ element is wrong,
> you should start with the list head instead.

Yes, thanks.
> 
> >>
> >>> +
> >>> +		list_del(&p->list);
> >>> +		xfree(p);
> >>
> >> Why do we remove parent vma from its list?
> > 
> > Then all unused parent's vma-s will be unmapped.
> 
> What do you mean by "unused"?

This vma-s are present in parent and they are not present in a child.

> 
> >>
> >>> +	}
> >>> +
> >>> +	if (vma_entry_is(&vma->vma, VMA_FILE_PRIVATE))
> >>> +		close(vma->vma.fd);
> >>
> >> Plz, explain this close.
> > 
> > This fd was opened upper and a vma was mapped and this fd isn't needed more.
> 
> Upper? Where is it?

static int map_private_vma(pid_t pid, struct vma_area *vma, void
*tgt_addr,
                        struct vma_area **pvma, struct list_head
*pvma_list)
{       
        int ret;
        void *addr;
        unsigned long nr_pages;
        struct vma_area *p = *pvma;
                
        if (vma_entry_is(&vma->vma, VMA_FILE_PRIVATE)) {
                ret = get_filemap_fd(pid, &vma->vma);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> >>
> >>> +
> >>> +		addr = (void *) vma_premmaped_start(&vma->vma);
> >>> +		len = vma_area_len(vma);
> >>> +
> >>> +		if (!addr)
> >>> +			continue;
> >>> +
> >>> +		if (munmap(addr, len)) {
> >>
> >> What is this munmap for?
> > 
> > Why do we need this vma-s, they were inherited from a parent.
> > And one more thing is that all this vma-s will be inherited by
> > children of this process and so on...
> 
> So this is unmap of all parent's maps, right? They were mapped with
> one big chunk, why not unmapping them the same way?
Yes, we can.


More information about the CRIU mailing list