[CRIU] [PATCH 2/2] mem: Don't assume guard page is returned in procfs with new kernels

Cyrill Gorcunov gorcunov at gmail.com
Tue Jun 20 16:10:28 MSK 2017


On Tue, Jun 20, 2017 at 03:02:47PM +0200, Oleg Nesterov wrote:
> Add CC's, we will need to fix criu for rhel...
> 
> 
> On 06/20, Cyrill Gorcunov wrote:
> >
> > If the guard page is not reported in show_map_vma we should
> > not ajust vma address neither we should call unmap_guard_pages
> > in restorer.
> > 
> > https://github.com/xemul/criu/issues/322
> > 
> > Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> > ---
> >  criu/cr-restore.c | 3 ++-
> >  criu/proc_parse.c | 6 ++++--
> >  2 files changed, 6 insertions(+), 3 deletions(-)
> > 
> > diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> > index 298fb693a09e..d44e723cc180 100644
> > --- a/criu/cr-restore.c
> > +++ b/criu/cr-restore.c
> > @@ -1812,7 +1812,8 @@ static int restore_task_with_children(void *_arg)
> >  
> >  	timing_stop(TIME_FORK);
> >  
> > -	if (unmap_guard_pages(current))
> > +	if (kdat.mm_guard_page_maps &&
> > +	    unmap_guard_pages(current))
> 
> can't resist... I feel that unmap_guard_pages() logic is not really right and
> this helper can be simply removed even with stack-guard... but I can be easily
> wrong and this is off-topic right now.

You know, we're running tests now and found that not calling unmap_guard_pages
on new kernel left some pages on restored process. They are came from other
restore code which assumes that on growsdown flag page-size need to added/removed.
So as a fast fix unmap_guard_pages still should be called.

> >  
> >  	restore_pgid();
> > diff --git a/criu/proc_parse.c b/criu/proc_parse.c
> > index 041d4512413d..4cb4b9dbf288 100644
> > --- a/criu/proc_parse.c
> > +++ b/criu/proc_parse.c
> > @@ -638,8 +638,10 @@ static int vma_list_add(struct vma_area *vma_area,
> >  
> >  	/* Add a guard page only if here is enough space for it */
> >  	if ((vma_area->e->flags & MAP_GROWSDOWN) &&
> > -	    *prev_end < vma_area->e->start)
> > -		vma_area->e->start -= PAGE_SIZE; /* Guard page */
> > +	    *prev_end < vma_area->e->start) {
> > +		if (kdat.mm_guard_page_maps)
> > +			vma_area->e->start -= PAGE_SIZE; /* Guard page */
> > +	}
> 
> OK, but what about MAP_GROWSDOWN checks in criu/mem.c ? At first glance it
> seems that most of them (if not all) should be updated too, no?

Exactly. I need to revisit all over the places, sigh.

> Perhaps you can make a helper? something like
> 
> 	bool vma_has_guard(vma_area *vma)
> 	{
> 		return kdat.mm_guard_page_maps && (vma->e->flags & MAP_GROWSDOWN);
> 	}
> 
> then it would be simpler to change the code whenever this is needed.
> 
> And. This can also help us (redhat) ;) more on this later, but most probably
> we will need to disable this logic unconditionally (iow, without the 1st patch)
> for the short term fix.

Why? The patches gonna be in vanilla repo I think for you it should be
easlier to simply cherry-pick.


More information about the CRIU mailing list