[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 3/4] xen: introduce new function update_dirty_bitmap



> -----Original Message-----
> From: Tim Deegan [mailto:tim@xxxxxxx]
> Sent: Thursday, June 28, 2012 9:42 PM
> To: Hao, Xudong
> Cc: xen-devel@xxxxxxxxxxxxx; Shan, Haitao; keir@xxxxxxx; Zhang, Xiantao;
> JBeulich@xxxxxxxx
> Subject: Re: [Xen-devel] [PATCH v2 3/4] xen: introduce new function
> update_dirty_bitmap
> 
> At 09:57 +0800 on 20 Jun (1340186266), Xudong Hao wrote:
> > @@ -83,19 +84,31 @@ static int hap_enable_vram_tracking(struct domain
> *d)
> >  static int hap_disable_vram_tracking(struct domain *d)
> >  {
> >      struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
> > +    p2m_type_t p2mt = p2m_ram_rw;
> >
> >      if ( !dirty_vram )
> >          return -EINVAL;
> >
> > +    /* With hap dirty bit, p2m type cannot be changed from
> p2m_ram_logdirty
> > +     * to p2m_ram_rw when first fault is met. Actually, there is no such
> > +     * fault occurred.
> > +     */
> > +    if ( hap_has_dirty_bit )
> > +        p2mt = p2m_ram_logdirty;
> > +
> >      paging_lock(d);
> >      d->arch.paging.mode &= ~PG_log_dirty;
> >      paging_unlock(d);
> >
> >      /* set l1e entries of P2M table with normal mode */
> >      p2m_change_type_range(d, dirty_vram->begin_pfn,
> dirty_vram->end_pfn,
> > -                          p2m_ram_logdirty, p2m_ram_rw);
> > +                          p2mt, p2m_ram_rw);
> 
> What's the intent of this change?
> 
> AFAICS it will break the hap_has_dirty_bit==0 case, by basically making
> that p2m_change_type_range() into a noop.
> 

Thanks for the review, it's a code mistake indeed.
It should be: 
      p2m_change_type_range(d, dirty_vram->begin_pfn, dirty_vram->end_pfn, 
-                          p2m_ram_logdirty, p2m_ram_rw);
+                          p2m_ram_logdirty, p2mt);


> > --- a/xen/arch/x86/mm/p2m.c
> > +++ b/xen/arch/x86/mm/p2m.c
> > @@ -148,6 +148,15 @@ void p2m_change_entry_type_global(struct domain
> *d,
> >      p2m_unlock(p2m);
> >  }
> >
> > +void p2m_query_entry_global(struct domain *d, int mask)
> > +{
> > +    struct p2m_domain *p2m = p2m_get_hostp2m(d);
> > +    ASSERT(p2m);
> > +    p2m_lock(p2m);
> > +    p2m->query_entry_global(p2m, mask);
> > +    p2m_unlock(p2m);
> > +}
> > +
> 
> Given that when you implement this, it's basically just the same as
> p2m_change_type_global() with p2m_ram_logdirty for both types:
> 
>  - Why not just use p2m_change_type_global() instead of adding the new
>    function pointer?

Because it's need to add a mask to indentify D bit or not, I do not want to 
change current ept_change_entry_type_global() interface. So add a new function 
pointer.

>  - If you do need a new function pointer, this name is very confusing:
>    it's not doing any kind of query.
> 

The new function query dirty page in whole p2m table and update the dirty 
bitmap. 

> > --- a/xen/arch/x86/mm/paging.c
> > +++ b/xen/arch/x86/mm/paging.c
> > @@ -335,9 +335,24 @@ int paging_log_dirty_op(struct domain *d, struct
> xen_domctl_shadow_op *sc)
> >      int i4, i3, i2;
> >
> >      domain_pause(d);
> > -    paging_lock(d);
> >
> >      clean = (sc->op == XEN_DOMCTL_SHADOW_OP_CLEAN);
> > +    if ( clean )
> > +    {
> > +        /* We need to further call clean_dirty_bitmap() functions of
> specific
> > +         * paging modes (shadow or hap).  Safe because the domain is
> paused.
> > +         * And this call must be made before actually transferring the
> dirty
> > +         * bitmap since with HW hap dirty bit support, dirty bitmap is
> > +         * produced by hooking on this call. */
> > +        d->arch.paging.log_dirty.clean_dirty_bitmap(d);
> > +    }
> 
> > +    if ( peek && d->arch.paging.log_dirty.update_dirty_bitmap)
> > +    {
> > +        d->arch.paging.log_dirty.update_dirty_bitmap(d);
> > +    }
> 
> Doesn't this end up doing _two_ passes over the p2m table?
> 

Oh, it does 2 passes over the p2m table. I wanted to differentiate the CLEAN 
and PEEK op by variable "clean" and "peek", seems peek=1 even when it's a CLEAN 
hapercall.
I do the following modification: 
+    if ( (sc->op == XEN_DOMCTL_SHADOW_OP_PEEK) && 
d->arch.paging.log_dirty.update_dirty_bitmap)
+    {
+        d->arch.paging.log_dirty.update_dirty_bitmap(d);
+    }

> I think it would be better to leave the clean() op at the end of the
> function, and arrange for it to be a noop in the EPT/D-bit case.  Then

We need to clean D bit in clean() op for the EPT/D bit case. How about the 
modification above?
 
> with the addition of this update_dirty_bitmap() call, the p2m only gets
> walked once, for all configurations.
> 
> Cheers,
> 
> Tim.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.