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

Re: [Xen-devel] [PATCH v3 33/38] arm/p2m: Add altp2m paging mechanism



Hi Julien


[...]

>>>  static void do_trap_instr_abort_guest(struct cpu_user_regs *regs,
>>>                                        const union hsr hsr)
>>>  {
>>> @@ -2445,6 +2465,14 @@ static void do_trap_instr_abort_guest(struct
>>> cpu_user_regs *regs,
>>>          break;
>>>      case FSC_FLT_TRANS:
>>>          /*
>>> +         * The guest shall retry accessing the page if the altp2m
>>> handler
>>> +         * succeeds. Otherwise, we continue injecting an instruction
>>> abort
>>> +         * exception.
>>> +         */
>>> +        if ( try_handle_altp2m(current, gpa, npfec) )
>>> +            return;
>> I would have expected that altp2m is the last thing we want to check
>> in the abort handler. I.e after p2m_lookup.
>>
> Alright, I will reorder both calls, thank you.

Actually, reordering of these calls (try_handle_altp2m/altp2m_lazy_copy
and p2m_lookup) would make the system stall if altp2m is active. This is
because the p2m_lookup routine considers only the host's p2m, which will
most likely return a mfn != INVALID_MFN and thus entirely skip the call
to altp2m_lazy_copy. Thus, both calls should rather be conditional as
shown in the following:

if ( likely(!altp2m_active(current->domain)) )
{
    /*
     * The PT walk may have failed because someone was playing
     * with the Stage-2 page table. Walk the Stage-2 PT to check
     * if the entry exists. If it's the case, return to the guest
     */
    mfn = p2m_lookup(current->domain, _gfn(paddr_to_pfn(gpa)), NULL);
    if ( !mfn_eq(mfn, INVALID_MFN) )
        return;
}
else
    /*
     * The guest shall retry accessing the page if the altp2m handler
     * succeeds. Otherwise, we continue injecting an instruction abort
     * exception.
     */
    if ( altp2m_lazy_copy(current, _gfn(paddr_to_pfn(gpa))) )
        return;


Please excuse me for the confusion.

>>> +
>>> +        /*
>>>           * The PT walk may have failed because someone was playing
>>>           * with the Stage-2 page table. Walk the Stage-2 PT to check
>>>           * if the entry exists. If it's the case, return to the guest
>>> @@ -2547,6 +2575,13 @@ static void do_trap_data_abort_guest(struct
>>> cpu_user_regs *regs,
>>>          }
>>>
>>>          /*
>>> +         * The guest shall retry accessing the page if the altp2m
>>> handler
>>> +         * succeeds. Otherwise, we continue injecting a data abort
>>> exception.
>>> +         */
>>> +        if ( try_handle_altp2m(current, info.gpa, npfec) )
>>> +            return;
>> Ditto here.
>>

Same here.

Cheers,
~Sergej


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

 


Rackspace

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