[CRIU] [PATCH 4/5] vdso: parasite -- Prepare new vdso mark structure.

Cyrill Gorcunov gorcunov at gmail.com
Tue Jun 10 08:52:22 PDT 2014


On Tue, Jun 10, 2014 at 07:42:57PM +0400, Pavel Emelyanov wrote:
> On 06/06/2014 06:07 PM, Cyrill Gorcunov wrote:
> 
> > @@ -78,26 +84,38 @@ static inline unsigned long vdso_vma_size(struct vdso_symtable *t)
> >   */
> >  struct vdso_mark {
> >  	u64			signature;
> > -	unsigned long		proxy_addr;
> > -};
> > +	unsigned long		proxy_vdso_addr;
> > +
> > +	unsigned long		version;
> 
> This is write-only variable.

Yes, for a while. I wanted to polish code some more and add testing
for the @version but desided to do that on top.

> >  
> > +	/*
> > +	 * In case of new vDSO format the VVAR area address
> > +	 * neeed for easier discovering where it lives without
> > +	 * relying on procfs output.
> > +	 */
> 
> How do we distinguish 3 cases from each other:
> 
> 1. Old kernel w/o vvar area
> 2. New kernel with vvar area
> 3. New kernel with vvar area and error in its detection

By signature + proxy_vdso_addr. Old images which were
created with previous version of criu won't have proxy_vdso_addr
and such but have signature set to VDSO_MARK_SIGNATURE. New
criu generates mark with VDSO_MARK_SIGNATURE_V2 where all
members of vdso_mark are filled and depending if kernel
has or has not vvar zone @proxy_vdso_addr either set to
some valid VMA address. either set to BAD_ADDR, pointing that
there is no vvar zone.

> 
> ?
> 
> > +	unsigned long		proxy_vvar_addr;
> > +};
> >  /* Magic number (criuvdso) */
> >  #define VDSO_MARK_SIGNATURE	(0x6f73647675697263ULL)
> 
> This signature is no longer in use in the code. Why?
> 
> > +#define VDSO_MARK_SIGNATURE_V2	(0x4f53447675697263ULL)	/* Magic number (criuvDSO) */
> 
> Can we make these comments to be placed in one manner?

Sure. I think it came from the moment when I've been squashing the big
series of small (but incomplete) patches into workable versions. Thanks.

> >  static inline bool is_vdso_mark(void *addr)
> >  {
> >  	struct vdso_mark *m = addr;
> >  
> > -	return m->signature == VDSO_MARK_SIGNATURE &&
> > -		m->proxy_addr != VDSO_BAD_ADDR;
> > +	return (m->signature == VDSO_MARK_SIGNATURE_V2 ||
> > +		m->signature == VDSO_MARK_SIGNATURE) &&
> > +		m->proxy_vdso_addr != VDSO_BAD_ADDR;
> >  }

I just noticed that this is not correct, I need more detailed
test here otherwise all will work of course but proxy will
be piled again and again. Will fix.


More information about the CRIU mailing list