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