Re: [PATCH v2] mm: alloc_pages_bulk: remove assumption of populating only NULL elements
From: NeilBrown
Date: Thu Mar 06 2025 - 16:15:04 EST
On Thu, 06 Mar 2025, Yunsheng Lin wrote:
> On 2025/3/6 7:41, NeilBrown wrote:
> > On Wed, 05 Mar 2025, Yunsheng Lin wrote:
> >>
> >> For the existing btrfs and sunrpc case, I am agreed that there
> >> might be valid use cases too, we just need to discuss how to
> >> meet the requirements of different use cases using simpler, more
> >> unified and effective APIs.
> >
> > We don't need "more unified".
>
> What I meant about 'more unified' is how to avoid duplicated code as
> much as possible for two different interfaces with similar functionality.
>
> The best way I tried to avoid duplicated code as much as possible is
> to defragment the page_array before calling the alloc_pages_bulk()
> for the use case of btrfs and sunrpc so that alloc_pages_bulk() can
> be removed of the assumption populating only NULL elements, so that
> the API is simpler and more efficient.
>
> >
> > If there are genuinely two different use cases with clearly different
> > needs - even if only slightly different - then it is acceptable to have
> > two different interfaces. Be sure to choose names which emphasise the
> > differences.
>
> The best name I can come up with for the use case of btrfs and sunrpc
> is something like alloc_pages_bulk_refill(), any better suggestion about
> the naming?
I think alloc_pages_bulk_refill() is a good name.
So:
- alloc_pages_bulk() would be given an uninitialised array of page
pointers and a required count and would return the number of pages
that were allocated
- alloc_pages_bulk_refill() would be given an initialised array of page
pointers some of which might be NULL. It would attempt to allocate
pages for the non-NULL pointers and return the total number of
allocated pages in the array - just like the current
alloc_pages_bulk().
sunrpc could usefully use both of these interfaces.
alloc_pages_bulk() could be implemented by initialising the array and
then calling alloc_pages_bulk_refill(). Or alloc_pages_bulk_refill()
could be implemented by compacting the pages and then calling
alloc_pages_bulk().
If we could duplicate the code and have two similar but different
functions.
The documentation for _refill() should make it clear that the pages
might get re-ordered.
Having looked at some of the callers I agree that the current interface
is not ideal for many of them, and that providing a simpler interface
would help.
Thanks,
NeilBrown