|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 4/4] arm/mem_access: Add software guest-page-table walk
On Mon, May 8, 2017 at 5:44 AM, Julien Grall <julien.grall@xxxxxxx> wrote:
> Hi,
>
> On 08/05/17 10:22, Sergej Proskurin wrote:
>>
>> On 05/02/2017 05:17 PM, Julien Grall wrote:
>>>
>>> On 30/04/17 20:48, Sergej Proskurin wrote:
>>> Also s/ttbcr/tcr/
>>>
>>>> + struct domain *d = p2m->domain;
>>>> +
>>>> + const unsigned int offsets[4] = {
>>>> +#ifdef CONFIG_ARM_64
>>>> + zeroeth_table_offset(gva),
>>>> +#endif
>>>> + first_table_offset(gva),
>>>> + second_table_offset(gva),
>>>> + third_table_offset(gva)
>>>> + };
>>>
>>>
>>> Offsets are based on the granularity of Xen (currently 4KB). However
>>> the guests can support 4KB, 16KB, 64KB. Please handle everything
>>> correctly.
>>
>>
>> True, ARM ist quite flexible. Yet, I have not seen an OS implementation
>> that is supported by Xen and makes use of page sizes other than 4KB and
>> their supersets (2/4MB, 1GB) (please let me know, if you know some),
>> which is why I doubt that we need that. Please let me know why you think
>> we need that kind of flexibility in software?
>>
>> If you should nevertheless insist on that functionality, I would include
>> it in the next patch and try not to blow up the code too much.
>
>
> Linux is able to support 4KB, 16KB, 64KB page granularity for AArch64.
> Centos and RedHat are only shipped with 64KB page granularity.
>
>
>>
>>>
>>>> +
>>>> + const paddr_t masks[4] = {
>>>> +#ifdef CONFIG_ARM_64
>>>> + ZEROETH_SIZE - 1,
>>>> +#endif
>>>> + FIRST_SIZE - 1,
>>>> + SECOND_SIZE - 1,
>>>> + THIRD_SIZE - 1
>>>> + };
>>>> +
>>>> + /* If the MMU is disabled, there is no need to translate the
>>>> gva. */
>>>> + if ( !(sctlr & SCTLR_M) )
>>>> + {
>>>> + *ipa = gva;
>>>> +
>>>> + return 0;
>>>> + }
>>>> +
>>>> + if ( is_32bit_domain(d) )
>>>> + {
>>>> + /*
>>>> + * XXX: We do not support 32-bit domain translation table
>>>> walks for
>>>> + * domains using the short-descriptor translation table
>>>> format, yet.
>>>> + */
>>>
>>>
>>> Debian ARM 32bit is using short-descriptor translation table. So are
>>> you suggesting that memaccess will not correctly with Debian guest?
>>>
>>
>> Yes, as stated in the comment, the current implementation does not
>> support the short-descriptor translation table format. As this is an RFC
>> patch, I wanted to see your opinion on that functionality in general
>> before implementing all corner cases of the ARM architecture.
>>
>> As mentioned in my previous reply in patch (patch 2/4), I would prefer
>> to separate the long-descriptor from the short-descriptor translation in
>> the future implementation.
>
>
> I agree here. See my answer on patch #2 about how I would like to see the
> implementation.
>
> [...]
>
>>>> +
>>>> + *ipa = pfn_to_paddr(pte.walk.base) | (gva & masks[level]);
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>> +
>>>> /*
>>>> * If mem_access is in use it might have been the reason why
>>>> get_page_from_gva
>>>> * failed to fetch the page, as it uses the MMU for the permission
>>>> checking.
>>>> @@ -109,9 +233,23 @@ p2m_mem_access_check_and_get_page(vaddr_t gva,
>>>> unsigned long flag,
>>>> struct page_info *page = NULL;
>>>> struct p2m_domain *p2m = &v->domain->arch.p2m;
>>>>
>>>> + ASSERT(p2m->mem_access_enabled);
>>>> +
>>>
>>>
>>> Why this ASSERT has been added?
>>
>>
>> The function p2m_mem_access_check_and_get_page is called only if
>> get_page_from_gva fails and mem_access is active. I can add a comment
>> and move this part into an individual commit.
>
>
> Whilst I agree it is dumb to call this code without mem_access enabled, this
> code is able to cope with it. So why do you need this ASSERT?
>
>
>>
>>>
>>>> rc = gva_to_ipa(gva, &ipa, flag);
>>>> +
>>>> + /*
>>>> + * In case mem_access is active, hardware-based gva_to_ipa
>>>> translation
>>>> + * might fail. Since gva_to_ipa uses the guest's translation
>>>> tables, access
>>>> + * to which might be restricted by the active VTTBR, we perform
>>>> a gva to
>>>> + * ipa translation in software.
>>>> + */
>>>> if ( rc < 0 )
>>>> - goto err;
>>>> + if ( p2m_gva_to_ipa(p2m, gva, &ipa, flag) < 0 )
>>>> + /*
>>>> + * The software gva to ipa translation can still fail,
>>>> if the the
>>>> + * gva is not mapped or does not hold the requested
>>>> access rights.
>>>> + */
>>>> + goto err;
>>>
>>>
>>> Rather falling back, why don't we do software page table walk every time?
>>
>>
>> A software page table walk would (presumably) take more time to
>> translate the gva. Do we want that? Also, I am not sure what you meant
>> by "falling back" at this point. Thank you.
>
>
> What you currently do is try gva_to_ipa and if it does not work you will
> call p2m_gva_to_ipa. This sounds a bit pointless to me and waste of time if
> the underlying memory of stage-1 page table is protected.
But we don't know that the stage-1 page table is protected until the
hardware based lookup fails. I can turn your argument around and say
doing the software based lookup is pointless and a waste of time when
the stage-1 table is not protected. Which is by the way what I would
expect to see in most cases.
> Before saying this is taking much more time, I would like to see actual
> numbers.
Whether the performance is measurable different is going to be very
usecase specific. If the TLBs are already loaded with the translation
then the hardware lookup will be a lot faster. Setting up a test-case
for this is just a PITA and I don't really see why you are against
using the hardware lookup to start with.
Tamas
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |