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, which will set the memdesc value in each page to refer to the folio. 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; }