[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.



On Feb 21, 2013, at 12:42 PM, Tim Deegan <tim@xxxxxxx> wrote:

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

Cool, thanks
Andres

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