|
Size: 865
Comment:
|
Size: 873
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 3: | Line 3: |
| Once we live in a MatthewWilcox/Memdescs world, we need to do two allocations. First, we allocate a struct folio from slab. Then we call into the MatthewWilcox/BuddyAllocator to allocate the memory. I envisage a function like this: | Once we live in a [[MatthewWilcox/Memdescs]] world, we need to do two allocations. First, we allocate a struct folio from slab. Then we call into the [[MatthewWilcox/BuddyAllocator]] to allocate the memory. I envisage a function like this: |
Today with folios being an overlay on struct page, folio_alloc() is simple; we allocate a compound page and cast the result to a struct folio pointer.
Once we live in a MatthewWilcox/Memdescs world, we need to do two allocations. First, we allocate a struct folio from slab. Then we call into the MatthewWilcox/BuddyAllocator to allocate the memory. I envisage a function like this:
struct folio *folio_alloc(gfp_t gfp, unsigned int order)
{
struct page *page;
struct folio *folio = kmem_cache_alloc(folio_slab, gfp);
if (!folio)
return NULL;
page = alloc_page_desc(gfp, order, MEMDESC_TYPE_FOLIO, folio);
if (!page) {
kmem_cache_free(folio_slab, folio);
return NULL;
}
folio->pfn = page_to_pfn(page);
return folio;
}