|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 6/6] xen: retrieve reserved pages on populate_physmap
On 17/05/2022 07:24, Penny Zheng wrote: Hi Julien Hi Penny, + if ( unlikely(!page) ) + return INVALID_MFN; + + smfn = page_to_mfn(page); + + if ( acquire_domstatic_pages(d, smfn, 1, memflags) )I am OK if we call acquire_domstatic_pages() for now. But long term, I think we should consider to optimize it because we know the page is valid and belong to the guest. So there are a lot of pointless work (checking mfn_valid(), scrubbing in the free part, cleaning the cache...).I'm willing to fix it here since this fix is not blocking any other patch serie~~ I'm considering that maybe we could add a new memflag MEMF_xxx, (oh, Naming something is really "killing" me), then all these pointless work, checking mfn_valid, flushing TLB and cache, we could exclude them by checking memflags & MEMF_xxxx. Wdyt? I don't think we need a new flag because the decision is internal to the page allocator. Instead, acquire_staticmem_pages() could be split in two parts. Something like (function names are random):
static bool foo(struct page_info *pg,
unsigned long nr,
unsigned long memflags)
{
spin_lock(&heap_lock);
for ( i = 0; i < nr; i++ )
...
spin_unlock(&heap_lock);
if ( need_tlbflush )
filtered...
return true;
out_err:
for ( ... )
...
return false;
}
static struct page_info *bar(mfn_t smfn,
unsigned long mfn,
unsigned int memflags)
{
ASSERT(nr_mfns);
for ( i = 0; i < nr_mfns; i++ )
if ( !mfn_valid(mfn_add(smfn, i)) )
return NULL;
pg = mfn_to_page(mfn);
if ( !foo(...) )
return NULL;
for ( i = 0; i < nr_mfns; i++ )
flush_page_to_ram(...);
}
acquire_reserved_page() would then only call foo() and assign_pages().
Cheers,
--
Julien Grall
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |