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

Re: [Xen-devel] [PATCH] x86/mm: Take the p2m lock even in shadow mode.



At 09:58 -0500 on 21 Feb (1361440689), Andres Lagar-Cavilla wrote:
> > The remaining locked lookups are in sh_page_fault() (in a path that's
> > almost always already serializing on the paging lock), and in
> > emulate_map_dest() (which can probably be updated to use
> > get_page_from_gfn()).
> That is absolutely the case. Here is a rough patch:

Applied, thanks.  I've taken your S-o-b below to apply to this patch
too; hope that's OK. 

Tim.

> diff -r 7324955b35ad xen/arch/x86/mm/shadow/multi.c
> --- a/xen/arch/x86/mm/shadow/multi.c
> +++ b/xen/arch/x86/mm/shadow/multi.c
> @@ -4861,6 +4861,7 @@ static mfn_t emulate_gva_to_mfn(struct v
>                                  struct sh_emulate_ctxt *sh_ctxt)
>  {
>      unsigned long gfn;
> +    struct page_info *page;
>      mfn_t mfn;
>      p2m_type_t p2mt;
>      uint32_t pfec = PFEC_page_present | PFEC_write_access;
> @@ -4878,22 +4879,30 @@ static mfn_t emulate_gva_to_mfn(struct v
>  
>      /* Translate the GFN to an MFN */
>      ASSERT(!paging_locked_by_me(v->domain));
> -    mfn = get_gfn(v->domain, _gfn(gfn), &p2mt);
> -        
> +    page = get_page_from_gfn(v->domain, gfn, &p2mt, P2M_ALLOC);
> +
> +    /* Sanity checking */
> +    if ( page == NULL )
> +    {
> +        return _mfn(BAD_GFN_TO_MFN);
> +    }
>      if ( p2m_is_readonly(p2mt) )
>      {
> -        put_gfn(v->domain, gfn);
> +        put_page(page);
>          return _mfn(READONLY_GFN);
>      }
>      if ( !p2m_is_ram(p2mt) )
>      {
> -        put_gfn(v->domain, gfn);
> +        put_page(page);
>          return _mfn(BAD_GFN_TO_MFN);
>      }
> -
> +    mfn = page_to_mfn(page);
>      ASSERT(mfn_valid(mfn));
> +
>      v->arch.paging.last_write_was_pt = !!sh_mfn_is_a_page_table(mfn);
> -    put_gfn(v->domain, gfn);
> +    /* Note shadow cannot page out or unshare this mfn, so the map won't
> +     * disappear. Otherwise, caller must hold onto page until done. */
> +    put_page(page);
>      return mfn;
>  }
>  
> 
> 
> >  They're not addressed here but may be in a
> > follow-up patch.
> > 
> 
> Acked-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> or Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>? see 
> http://lists.xen.org/archives/html/xen-devel/2012-04/msg00962.html
> 

_______________________________________________
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®.