|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH V4] xen/gnttab: Store frame GFN in struct page_info on Arm
On 22.12.2021 11:01, Julien Grall wrote:
> On 14/12/2021 17:45, Jan Beulich wrote:
>> On 14.12.2021 17:26, Oleksandr wrote:
>>> On 14.12.21 15:37, Jan Beulich wrote:
>>>> On 03.12.2021 21:33, Oleksandr Tyshchenko wrote:
>>>>> @@ -2177,14 +2181,22 @@ void *alloc_xenheap_pages(unsigned int order,
>>>>> unsigned int memflags)
>>>>>
>>>>> void free_xenheap_pages(void *v, unsigned int order)
>>>>> {
>>>>> + struct page_info *pg;
>>>>> + unsigned int i;
>>>>> +
>>>>> ASSERT(!in_irq());
>>>>>
>>>>> if ( v == NULL )
>>>>> return;
>>>>>
>>>>> + pg = virt_to_page(v);
>>>>> +
>>>>> memguard_guard_range(v, 1 << (order + PAGE_SHIFT));
>>>> ... this really want to (logically) move into the new arch hooks.
>>>> That'll effectively mean to simply drop the Arm stubs afaict (and I
>>>> notice there's some dead code there on x86, which I guess I'll make
>>>> a patch to clean up). But first of all this suggests that you want
>>>> to call the hooks with base page and order, putting the loops there.
>>>
>>> I see your point and agree ... However I see the on-list patches that
>>> remove common memguard_* invocations and x86 bits.
>>> So I assume, this request is not actual anymore, or I still need to pass
>>> an order to new arch hooks? Please clarify.
>>
>> Well, that patch (really just the Arm one) effectively takes care of
>> part of what I did say above. Irrespective I continue to think that
>> the hook should take a (page,order) tuple instead of getting invoked
>> once for every order-0 page. And the hook invocations should be placed
>> such that they could fulfill the (being removed) memguard function
>> (iirc that was already the case, at least mostly).
>
> IIUC your suggestion, with your approach, alloc_xenheap_pages() would
> look like:
>
> for ( i = 0; i < (1u << order); i++ )
> pg[i].count_info |= PGC_xen_heap;
>
> arch_alloc_xenheap_pages(pg, 1U << order);
Like Oleksandr said, the 2nd argument would be just "order".
> The Arm implementation for arch_alloc_xenheap_pages() would also contain
> a loop.
>
> This could turn out to be quite expensive with large allocation (1GB
> allocation would require 16MB of cache) because the cache may not have
> enough space contain all the pages of that range. So you would have to
> pull twice the page_info in the cache.
Hmm, that's a fair point. I assume you realize that a similar issue of
higher overhead would occur when using your approach, and when some
memguard-like thing was to reappear: Such mapping operations typically
are more efficient when done on a larger range. Since that's only a
hypothetical use at this point, I'm willing to accept your preference.
I'd like us to consider one more aspect though: All you need on Arm is
the setting of the exact same bits to the exact same pattern for every
struct page_info involved. Can't we simply have an arch hook returning
that pattern, for generic code to then OR it in alongside PGC_xen_heap?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |