Re: [PATCH] mm/slub: replace alloc_pages with folio_alloc

From: Matthew Wilcox
Date: Sat May 28 2022 - 23:31:51 EST


On Sun, May 29, 2022 at 10:58:18AM +0800, Muchun Song wrote:
> On Sat, May 28, 2022 at 05:27:11PM +0100, Matthew Wilcox wrote:
> > On Sun, May 29, 2022 at 12:11:58AM +0800, bh1scw@xxxxxxxxx wrote:
> > > From: Fanjun Kong <bh1scw@xxxxxxxxx>
> > >
> > > This patch will use folio allocation functions for allocating pages.
> >
> > That's not actually a good idea. folio_alloc() will do the
> > prep_transhuge_page() step which isn't needed for slab.
>
> You mean folio_alloc() is dedicated for THP allocation? It is a little
> surprise to me. I thought folio_alloc() is just a variant of alloc_page(),
> which returns a folio struct instead of a page. Seems like I was wrong.
> May I ask what made us decide to do this?

Yeah, the naming isn't great here. The problem didn't really occur
to me until I saw this patch, and I don't have a good solution yet.
We're in the middle of a transition, but the transition is likely to
take years and I don't think we necessarily have the final form of the
transition fully agreed to or understood, so we should come up with
something better for the transition.

Ignoring the naming here, memory allocated to filesystems can be split,
but the split can fail, so they need the page-deferred-list and the
DTOR. Memory allocated to slab cannot be split, so initialising the
page-deferred-list is a waste of time.

The end-goal is to split apart allocating the memory from allocating
its memory descriptor (which I like to call memdesc). So for filesystem
folios, we'd call slab to allocate a struct folio and then tell the
buddy allocator "here is the memdesc of type folio, allocate
me 2^n pages and make pfn_to_memdesc return this memdesc for each of
the 2^n pages in it".

In this end-goal, slab would also allocate a struct slab (... there's
a recursion problem here which has a solution ...), and then allocate
2^n pages. But until we're ready to shrink struct page down to one
or two words, doing this is just a waste of memory and time.

So I still don't have a good solution to receiving patches like this
other than maybe adding a comment like

/* Do not change this to allocate a folio */

which will be ignored.