mm: alloc_pages_bulk: small API refactor
Subsystems (23)
cover mm: alloc_pages_bulk: small API refactor
Hi,
Today, alloc_pages_bulk_noprof() supports two arguments to return allocated
pages: a linked list and an array. There are also higher level APIs for both.
However, the linked list API has apparently never been used. So, this series removes it along with the list API and also refactors the remaining API naming for consistency.
I've boot-tested this series on arm64 and built-tested it on x86.
PS: Matthew, it was easier to keep my patch instead of fixing up Mel's but I included the API refactoring patch as well.
PPS: It's probably good to have a free_pages_bulk() function, but I'll leave this for another day.
Luiz Capitulino (2):
mm: alloc_pages_bulk_noprof: drop page_list argument
mm: alloc_pages_bulk: rename API
.../staging/media/atomisp/pci/hmm/hmm_bo.c | 12 +++--- drivers/vfio/pci/mlx5/cmd.c | 14 +++---- drivers/vfio/pci/virtio/migrate.c | 6 +-- fs/btrfs/extent_io.c | 2 +- fs/erofs/zutil.c | 4 +- fs/splice.c | 2 +- fs/xfs/xfs_buf.c | 4 +- include/linux/gfp.h | 22 +++++------ kernel/bpf/arena.c | 2 +- lib/alloc_tag.c | 4 +- lib/kunit_iov_iter.c | 2 +- lib/test_vmalloc.c | 2 +- mm/mempolicy.c | 28 ++++++------- mm/page_alloc.c | 39 ++++++------------- mm/vmalloc.c | 4 +- net/core/page_pool.c | 7 ++-- net/sunrpc/svc.c | 4 +- net/sunrpc/svc_xprt.c | 3 +- 18 files changed, 70 insertions(+), 91 deletions(-)
Signature · 1 line
2.47.1
PATCH 1/2 mm: alloc_pages_bulk_noprof: drop page_list argument
The commit 387ba26fb1cb added __alloc_pages_bulk() along with the page_list argument. The next commit 0f87d9d30f21 added the array-based argument. As it turns out, the page_list argument has no users in the current tree (if it ever had any). Dropping it allows for a slight simplification and eliminates some unnecessary checks, now that page_array is required.
--- include/linux/gfp.h | 8 ++------ mm/mempolicy.c | 14 +++++++------- mm/page_alloc.c | 39 ++++++++++++--------------------------- 3 files changed, 21 insertions(+), 40 deletions(-)
include/linux/gfp.h +2 -6
@@ -212,7 +212,6 @@ struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_unsigned long alloc_pages_bulk_noprof (gfp_t gfp,int preferred_nid,nodemask_t *nodemask,int nr_pages, -struct list_head *page_list,struct page **page_array);#define __alloc_pages_bulk (...) alloc_hooks(alloc_pages_bulk_noprof(__VA_ARGS__))
@@ -223,11 +222,8 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp,alloc_hooks (alloc_pages_bulk_array_mempolicy_noprof (__VA_ARGS__)) /* Bulk allocate order-0 pages */ -#define alloc_pages_bulk_list (_gfp, _nr_pages, _list) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _list, NULL) -#define alloc_pages_bulk_array (_gfp, _nr_pages, _page_array) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, NULL, _page_array) + __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _page_array) static inline unsigned long alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages,
@@ -236,7 +232,7 @@ alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages,if (nid ==NUMA_NO_NODE ) nid =numa_mem_id (); -return alloc_pages_bulk_noprof (gfp, nid,NULL , nr_pages,NULL , page_array); +return alloc_pages_bulk_noprof (gfp, nid,NULL , nr_pages, page_array); }#define alloc_pages_bulk_array_node (...) \
mm/mempolicy.c +7 -7
@@ -2375,13 +2375,13 @@ static unsigned long alloc_pages_bulk_array_interleave(gfp_t gfp,if (delta) { nr_allocated =alloc_pages_bulk_noprof (gfp,interleave_nodes (pol),NULL , - nr_pages_per_node +1 ,NULL , + nr_pages_per_node +1 , page_array); delta--; }else { nr_allocated =alloc_pages_bulk_noprof (gfp,interleave_nodes (pol),NULL , - nr_pages_per_node,NULL , page_array); + nr_pages_per_node, page_array); } page_array += nr_allocated;
@@ -2430,7 +2430,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp,if (weight &&node_isset (node, nodes)) { node_pages =min (rem_pages, weight); nr_allocated =__alloc_pages_bulk (gfp, node,NULL , node_pages, -NULL , page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated;/* if that's all the pages, no need to interleave */
@@ -2493,7 +2493,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp,if (!node_pages)break ; nr_allocated =__alloc_pages_bulk (gfp, node,NULL , node_pages, -NULL , page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated;if (total_allocated == nr_pages)
@@ -2517,11 +2517,11 @@ static unsigned long alloc_pages_bulk_array_preferred_many(gfp_t gfp, int nid, preferred_gfp &= ~(__GFP_DIRECT_RECLAIM | __GFP_NOFAIL); nr_allocated =alloc_pages_bulk_noprof (preferred_gfp, nid, &pol->nodes, - nr_pages,NULL , page_array); + nr_pages, page_array);if (nr_allocated < nr_pages) nr_allocated +=alloc_pages_bulk_noprof (gfp,numa_node_id (),NULL , - nr_pages - nr_allocated,NULL , + nr_pages - nr_allocated, page_array + nr_allocated);return nr_allocated; }
@@ -2557,7 +2557,7 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp, nid =numa_node_id (); nodemask =policy_nodemask (gfp, pol,NO_INTERLEAVE_INDEX , &nid);return alloc_pages_bulk_noprof (gfp, nid, nodemask, - nr_pages,NULL , page_array); + nr_pages, page_array); }int vma_dup_policy (struct vm_area_struct *src,struct vm_area_struct *dst)
mm/page_alloc.c +12 -27
@@ -4529,28 +4529,23 @@ static inline bool prepare_alloc_pages(gfp_t gfp_mask, unsigned int order, }/* -* __alloc_pages_bulk - Allocate a number of order-0 pages to a list or array +* __alloc_pages_bulk - Allocate a number of order-0 pages to an array * @gfp: GFP flags for the allocation * @preferred_nid: The preferred NUMA node ID to allocate from * @nodemask: Set of nodes to allocate from, may be NULL -* @nr_pages: The number of pages desired on the list or array -* @page_list: Optional list to store the allocated pages -* @page_array: Optional array to store the pages +* @nr_pages: The number of pages desired in the array +* @page_array: Array to store the pages * * This is a batched version of the page allocator that attempts to -* allocate nr_pages quickly. Pages are added to page_list if page_list -* is not NULL, otherwise it is assumed that the page_array is valid. +* allocate nr_pages quickly. Pages are added to the page_array. * -* For lists, nr_pages is the number of pages that should be allocated. -* -* For arrays, only NULL elements are populated with pages and nr_pages +* Note that only NULL elements are populated with pages and nr_pages * is the maximum number of pages that will be stored in the array. * -* Returns the number of pages on the list or array. +* Returns the number of pages in the array. */ unsigned long alloc_pages_bulk_noprof (gfp_t gfp,int preferred_nid,nodemask_t *nodemask,int nr_pages, -struct list_head *page_list,struct page **page_array) {struct page *page;
@@ -4568,7 +4563,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,* Skip populated array elements to determine if any pages need * to be allocated before disabling IRQs. */ -while (page_array && nr_populated < nr_pages && page_array[nr_populated]) +while (nr_populated < nr_pages && page_array[nr_populated]) nr_populated++;/* No pages requested? */
@@ -4576,7 +4571,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, goto out;/* Already populated array? */ -if (unlikely (page_array && nr_pages - nr_populated ==0 )) +if (unlikely (nr_pages - nr_populated ==0 )) goto out;/* Bulk allocator does not support memcg accounting. */
@@ -4658,7 +4653,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,while (nr_populated < nr_pages) {/* Skip existing pages */ -if (page_array && page_array[nr_populated]) { +if (page_array[nr_populated]) { nr_populated++;continue ; }
@@ -4676,11 +4671,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, nr_account++;prep_new_page (page,0 , gfp,0 ); -if (page_list) -list_add (&page->lru, page_list); -else - page_array[nr_populated] = page; - nr_populated++; + page_array[nr_populated++] = page; }pcp_spin_unlock (pcp);
@@ -4697,14 +4688,8 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, failed: page =__alloc_pages_noprof (gfp,0 , preferred_nid, nodemask); -if (page) { -if (page_list) -list_add (&page->lru, page_list); -else - page_array[nr_populated] = page; - nr_populated++; - } - +if (page) + page_array[nr_populated++] = page; goto out; }EXPORT_SYMBOL_GPL (alloc_pages_bulk_noprof);
Signature · 1 line
2.47.1
Re: [PATCH 1/2] mm: alloc_pages_bulk_noprof: drop page_list argument
Quoted 2 lines · Luiz Capitulino
The commit
387ba26fb1cbadded__alloc_pages_bulk()along with thepage_listargument. The next commit0f87d9d30f21added the array-based argument. As
Nit: Use "commit 387ba26fb1cb ("mm/page_alloc: add a bulk page allocator")" ,same for the other commit
(likely scripts/checkpatch.pl should complain)
Quoted 4 lines
it turns out, the
page_listargument has no users in the current tree (if it ever had any). Dropping it allows for a slight simplification and eliminates some unnecessary checks, now thatpage_arrayis required.
It's probably a good idea to link to Mel's patch and the discussion from 2023. Quoting what Willy said back then about performance of list vs. arrays might be valuable to have here is well.
Quoted 198 lines
Signed-off-by Luiz Capitulino <[email protected]>--- include/linux/gfp.h | 8 ++------ mm/mempolicy.c | 14 +++++++------- mm/page_alloc.c | 39 ++++++++++++--------------------------- 3 files changed, 21 insertions(+), 40 deletions(-)include/linux/gfp.h +2
-6@@ -212,7 +212,6 @@ struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_unsigned long alloc_pages_bulk_noprof (gfp_t gfp,int preferred_nid,nodemask_t *nodemask,int nr_pages, -struct list_head *page_list,struct page **page_array);#define __alloc_pages_bulk (...) alloc_hooks(alloc_pages_bulk_noprof(__VA_ARGS__))@@ -223,11 +222,8 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp,alloc_hooks (alloc_pages_bulk_array_mempolicy_noprof (__VA_ARGS__)) /* Bulk allocate order-0 pages */ -#define alloc_pages_bulk_list (_gfp, _nr_pages, _list) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _list, NULL) -#define alloc_pages_bulk_array (_gfp, _nr_pages, _page_array) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, NULL, _page_array) + __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _page_array) static inline unsigned long alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages,@@ -236,7 +232,7 @@ alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages,if (nid ==NUMA_NO_NODE ) nid =numa_mem_id (); -return alloc_pages_bulk_noprof (gfp, nid,NULL , nr_pages,NULL , page_array); +return alloc_pages_bulk_noprof (gfp, nid,NULL , nr_pages, page_array); }#define alloc_pages_bulk_array_node (...) \mm/mempolicy.c +7
-7@@ -2375,13 +2375,13 @@ static unsigned long alloc_pages_bulk_array_interleave(gfp_t gfp,if (delta) { nr_allocated =alloc_pages_bulk_noprof (gfp,interleave_nodes (pol),NULL , - nr_pages_per_node +1 ,NULL , + nr_pages_per_node +1 , page_array); delta--; }else { nr_allocated =alloc_pages_bulk_noprof (gfp,interleave_nodes (pol),NULL , - nr_pages_per_node,NULL , page_array); + nr_pages_per_node, page_array); } page_array += nr_allocated;@@ -2430,7 +2430,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp,if (weight &&node_isset (node, nodes)) { node_pages =min (rem_pages, weight); nr_allocated =__alloc_pages_bulk (gfp, node,NULL , node_pages, -NULL , page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated;/* if that's all the pages, no need to interleave */ @@ -2493,7 +2493,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp,if (!node_pages)break ; nr_allocated =__alloc_pages_bulk (gfp, node,NULL , node_pages, -NULL , page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated;if (total_allocated == nr_pages)@@ -2517,11 +2517,11 @@ static unsigned long alloc_pages_bulk_array_preferred_many(gfp_t gfp, int nid, preferred_gfp &= ~(__GFP_DIRECT_RECLAIM | __GFP_NOFAIL); nr_allocated =alloc_pages_bulk_noprof (preferred_gfp, nid, &pol->nodes, - nr_pages,NULL , page_array); + nr_pages, page_array);if (nr_allocated < nr_pages) nr_allocated +=alloc_pages_bulk_noprof (gfp,numa_node_id (),NULL , - nr_pages - nr_allocated,NULL , + nr_pages - nr_allocated, page_array + nr_allocated);return nr_allocated; }@@ -2557,7 +2557,7 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp, nid =numa_node_id (); nodemask =policy_nodemask (gfp, pol,NO_INTERLEAVE_INDEX , &nid);return alloc_pages_bulk_noprof (gfp, nid, nodemask, - nr_pages,NULL , page_array); + nr_pages, page_array); }int vma_dup_policy (struct vm_area_struct *src,struct vm_area_struct *dst)mm/page_alloc.c +12
-27@@ -4529,28 +4529,23 @@ static inline bool prepare_alloc_pages(gfp_t gfp_mask, unsigned int order, }/* -* __alloc_pages_bulk - Allocate a number of order-0 pages to a list or array +* __alloc_pages_bulk - Allocate a number of order-0 pages to an array * @gfp: GFP flags for the allocation * @preferred_nid: The preferred NUMA node ID to allocate from * @nodemask: Set of nodes to allocate from, may be NULL -* @nr_pages: The number of pages desired on the list or array -* @page_list: Optional list to store the allocated pages -* @page_array: Optional array to store the pages +* @nr_pages: The number of pages desired in the array +* @page_array: Array to store the pages * * This is a batched version of the page allocator that attempts to -* allocate nr_pages quickly. Pages are added to page_list if page_list -* is not NULL, otherwise it is assumed that the page_array is valid. +* allocate nr_pages quickly. Pages are added to the page_array. * -* For lists, nr_pages is the number of pages that should be allocated. -* -* For arrays, only NULL elements are populated with pages and nr_pages +* Note that only NULL elements are populated with pages and nr_pages * is the maximum number of pages that will be stored in the array. * -* Returns the number of pages on the list or array. +* Returns the number of pages in the array. */ unsigned long alloc_pages_bulk_noprof (gfp_t gfp,int preferred_nid,nodemask_t *nodemask,int nr_pages, -struct list_head *page_list,struct page **page_array) {struct page *page;@@ -4568,7 +4563,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,* Skip populated array elements to determine if any pages need * to be allocated before disabling IRQs. */ -while (page_array && nr_populated < nr_pages && page_array[nr_populated]) +while (nr_populated < nr_pages && page_array[nr_populated]) nr_populated++;/* No pages requested? */ @@ -4576,7 +4571,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, goto out;/* Already populated array? */ -if (unlikely (page_array && nr_pages - nr_populated ==0 )) +if (unlikely (nr_pages - nr_populated ==0 )) goto out;/* Bulk allocator does not support memcg accounting. */ @@ -4658,7 +4653,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,while (nr_populated < nr_pages) {/* Skip existing pages */ -if (page_array && page_array[nr_populated]) { +if (page_array[nr_populated]) { nr_populated++;continue ; }@@ -4676,11 +4671,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, nr_account++;prep_new_page (page,0 , gfp,0 ); -if (page_list) -list_add (&page->lru, page_list); -else - page_array[nr_populated] = page; - nr_populated++; + page_array[nr_populated++] = page; }pcp_spin_unlock (pcp);@@ -4697,14 +4688,8 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, failed: page =__alloc_pages_noprof (gfp,0 , preferred_nid, nodemask); -if (page) { -if (page_list) -list_add (&page->lru, page_list); -else - page_array[nr_populated] = page; - nr_populated++; - } - +if (page) + page_array[nr_populated++] = page; goto out; }EXPORT_SYMBOL_GPL (alloc_pages_bulk_noprof);
Signature · 3 lines
Cheers, David / dhildenb
Re: [PATCH 1/2] mm: alloc_pages_bulk_noprof: drop page_list argument
Quoted 6 lines · David Hildenbrand
Quoted 2 lines · Luiz Capitulino
The commit
387ba26fb1cbadded__alloc_pages_bulk()along with thepage_listargument. The next commit0f87d9d30f21added the array-based argument. AsNit: Use "commit
387ba26fb1cb("mm/page_alloc: add a bulk page allocator")" ,same for the other commit
Quoted 8 lines
(likely
scripts/checkpatch.plshould complain)Quoted 4 lines
it turns out, the
page_listargument has no users in the current tree (if it ever had any). Dropping it allows for a slight simplification and eliminates some unnecessary checks, now thatpage_arrayis required.It's probably a good idea to link to Mel's patch and the discussion from 2023. Quoting what Willy said back then about performance of list vs. arrays might be valuable to have here is well.
I'll add these and the other patch's suggestion for v2.
Thanks for the review, David.
Quoted 186 lines
Quoted 180 lines
Signed-off-by Luiz Capitulino <[email protected]>---
include/linux/gfp.h| 8 ++------
mm/mempolicy.c | 14 +++++++------- mm/page_alloc.c | 39 ++++++++++++---------------------------3 files changed, 21 insertions(+), 40 deletions(-)include/linux/gfp.h +1
-5@@ -212,7 +212,6 @@ struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, nodemask_t *nodemask, int nr_pages, - struct list_head *page_list, struct page **page_array); #define __alloc_pages_bulk(...) alloc_hooks(alloc_pages_bulk_noprof(__VA_ARGS__))@@ -223,11 +222,8 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp, alloc_hooks(alloc_pages_bulk_array_mempolicy_noprof(__VA_ARGS__)) /* Bulk allocate order-0 pages */ -#define alloc_pages_bulk_list (_gfp, _nr_pages, _list) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _list, NULL) - #define alloc_pages_bulk_array(_gfp, _nr_pages, _page_array) \ - __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, NULL, _page_array) + __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _page_array)static inline unsigned long alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long
nr_pages,include/linux/gfp.h +1
-1@@ -236,7 +232,7 @@ alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages, if (nid == NUMA_NO_NODE) nid = numa_mem_id(); - return alloc_pages_bulk_noprof(gfp, nid, NULL, nr_pages, NULL, page_array); + return alloc_pages_bulk_noprof(gfp, nid, NULL, nr_pages, page_array); } #define alloc_pages_bulk_array_node(...) \mm/mempolicy.c +7
-7@@ -2375,13 +2375,13 @@ static unsigned long alloc_pages_bulk_array_interleave(gfp_t gfp, if (delta) { nr_allocated = alloc_pages_bulk_noprof(gfp, interleave_nodes(pol), NULL, - nr_pages_per_node + 1, NULL, + nr_pages_per_node + 1, page_array); delta--; } else { nr_allocated = alloc_pages_bulk_noprof(gfp, interleave_nodes(pol), NULL, - nr_pages_per_node, NULL, page_array); + nr_pages_per_node, page_array); } page_array += nr_allocated;@@ -2430,7 +2430,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp, if (weight && node_isset(node, nodes)) { node_pages = min(rem_pages, weight); nr_allocated = __alloc_pages_bulk(gfp, node, NULL, node_pages, - NULL, page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated; /* if that's all the pages, no need to interleave */@@ -2493,7 +2493,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp, if (!node_pages) break; nr_allocated = __alloc_pages_bulk(gfp, node, NULL, node_pages, - NULL, page_array); + page_array); page_array += nr_allocated; total_allocated += nr_allocated; if (total_allocated == nr_pages)@@ -2517,11 +2517,11 @@ static unsigned long alloc_pages_bulk_array_preferred_many(gfp_t gfp, int nid, preferred_gfp &= ~(__GFP_DIRECT_RECLAIM | __GFP_NOFAIL); nr_allocated = alloc_pages_bulk_noprof(preferred_gfp, nid, &pol->nodes, - nr_pages, NULL, page_array); + nr_pages, page_array); if (nr_allocated < nr_pages) nr_allocated += alloc_pages_bulk_noprof(gfp, numa_node_id(), NULL, - nr_pages - nr_allocated, NULL, + nr_pages - nr_allocated, page_array + nr_allocated); return nr_allocated; }@@ -2557,7 +2557,7 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp, nid = numa_node_id(); nodemask = policy_nodemask(gfp, pol, NO_INTERLEAVE_INDEX, &nid); return alloc_pages_bulk_noprof(gfp, nid, nodemask, - nr_pages, NULL, page_array); + nr_pages, page_array); } int vma_dup_policy(struct vm_area_struct *src, struct vm_area_struct *dst)mm/page_alloc.c +10
-19@@ -4529,28 +4529,23 @@ static inline bool prepare_alloc_pages(gfp_t gfp_mask, unsigned int order, } /* - * __alloc_pages_bulk - Allocate a number of order-0 pages to a list or array + * __alloc_pages_bulk - Allocate a number of order-0 pages to an array * @gfp: GFP flags for the allocation * @preferred_nid: The preferred NUMA node ID to allocate from * @nodemask: Set of nodes to allocate from, may be NULL - * @nr_pages: The number of pages desired on the list or array - * @page_list: Optional list to store the allocated pages - * @page_array: Optional array to store the pages + * @nr_pages: The number of pages desired in the array + * @page_array: Array to store the pages * * This is a batched version of the page allocator that attempts to - * allocate nr_pages quickly. Pages are added to page_list if page_list - * is not NULL, otherwise it is assumed that the page_array is valid. + * allocate nr_pages quickly. Pages are added to the page_array. * - * For lists, nr_pages is the number of pages that should be allocated. - * - * For arrays, only NULL elements are populated with pages and nr_pages + * Note that only NULL elements are populated with pages and nr_pages * is the maximum number of pages that will be stored in the array. * - * Returns the number of pages on the list or array. + * Returns the number of pages in the array. */ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, nodemask_t *nodemask, int nr_pages, - struct list_head *page_list, struct page **page_array) { struct page *page;@@ -4568,7 +4563,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,* Skip populated array elements to determine if any pages need * to be allocated before disabling IRQs. */ - while (page_array && nr_populated < nr_pages && page_array[nr_populated]) + while (nr_populated < nr_pages && page_array[nr_populated]) nr_populated++; /* No pages requested? */@@ -4576,7 +4571,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, goto out; /* Already populated array? */ - if (unlikely(page_array && nr_pages - nr_populated == 0)) + if (unlikely(nr_pages - nr_populated == 0)) goto out; /* Bulk allocator does not support memcg accounting. */@@ -4658,7 +4653,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, while (nr_populated < nr_pages) { /* Skip existing pages */ - if (page_array && page_array[nr_populated]) { + if (page_array[nr_populated]) { nr_populated++; continue; }@@ -4676,11 +4671,7 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, nr_account++; prep_new_page(page, 0, gfp, 0); - if (page_list) - list_add(&page->lru, page_list); - else - page_array[nr_populated] = page; - nr_populated++; + page_array[nr_populated++] = page; } pcp_spin_unlock(pcp);@@ -4697,14 +4688,8 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,failed:
page =__alloc_pages_noprof(gfp, 0, preferred_nid, nodemask); - if (page) {
- if (page_list)
-list_add(&page->lru, page_list);
- else
- page_array[nr_populated] = page;
- nr_populated++;
- }
-
+ if (page)
+ page_array[nr_populated++] = page;
goto out;
}
EXPORT_SYMBOL_GPL(alloc_pages_bulk_noprof);
PATCH 2/2 mm: alloc_pages_bulk: rename API
In reply to Luiz CapitulinoThe previous commit removed the page_list argument from alloc_pages_bulk_noprof() along with the alloc_pages_bulk_list() function.
Now that only the *_array() flavour of the API remains, we can do the following renaming (along with the _noprof() ones):
alloc_pages_bulk_array -> alloc_pages_bulk alloc_pages_bulk_array_mempolicy -> alloc_pages_bulk_mempolicy alloc_pages_bulk_array_node -> alloc_pages_bulk_node
--- drivers/staging/media/atomisp/pci/hmm/hmm_bo.c | 12 ++++++------ drivers/vfio/pci/mlx5/cmd.c | 14 +++++++------- drivers/vfio/pci/virtio/migrate.c | 6 +++--- fs/btrfs/extent_io.c | 2 +- fs/erofs/zutil.c | 4 ++-- fs/splice.c | 2 +- fs/xfs/xfs_buf.c | 4 ++-- include/linux/gfp.h | 14 +++++++------- kernel/bpf/arena.c | 2 +- lib/alloc_tag.c | 4 ++-- lib/kunit_iov_iter.c | 2 +- lib/test_vmalloc.c | 2 +- mm/mempolicy.c | 14 +++++++------- mm/vmalloc.c | 4 ++-- net/core/page_pool.c | 7 +++---- net/sunrpc/svc.c | 4 ++-- net/sunrpc/svc_xprt.c | 3 +-- 17 files changed, 49 insertions(+), 51 deletions(-)
drivers/staging/media/atomisp/pci/hmm/hmm_bo.c +6 -6
@@ -604,7 +604,7 @@ struct hmm_buffer_object *hmm_bo_device_search_vmap_start(return bo; } -static void free_pages_bulk_array (unsigned long nr_pages,struct page **page_array) +static void free_pages_bulk (unsigned long nr_pages,struct page **page_array) {unsigned long i;
@@ -615,7 +615,7 @@ static void free_pages_bulk_array(unsigned long nr_pages, struct page **page_arrstatic void free_private_bo_pages (struct hmm_buffer_object *bo) {set_pages_array_wb (bo->pages, bo->pgnr); -free_pages_bulk_array (bo->pgnr, bo->pages); +free_pages_bulk (bo->pgnr, bo->pages); }/*Allocate pages which will be used only by ISP*/
@@ -624,17 +624,17 @@ static int alloc_private_pages(struct hmm_buffer_object *bo)const gfp_t gfp = __GFP_NOWARN | __GFP_RECLAIM | __GFP_FS;int ret; - ret =alloc_pages_bulk_array (gfp, bo->pgnr, bo->pages); + ret =alloc_pages_bulk (gfp, bo->pgnr, bo->pages);if (ret != bo->pgnr) { -free_pages_bulk_array (ret, bo->pages); -dev_err (atomisp_dev,"alloc_pages_bulk_array() failed\n" ); +free_pages_bulk (ret, bo->pages); +dev_err (atomisp_dev,"alloc_pages_bulk() failed\n" );return -ENOMEM ; } ret =set_pages_array_uc (bo->pages, bo->pgnr);if (ret) {dev_err (atomisp_dev,"set pages uncacheable failed.\n" ); -free_pages_bulk_array (bo->pgnr, bo->pages); +free_pages_bulk (bo->pgnr, bo->pages);return ret; }
drivers/vfio/pci/mlx5/cmd.c +7 -7
@@ -408,7 +408,7 @@ void mlx5vf_free_data_buffer(struct mlx5_vhca_data_buffer *buf) buf->dma_dir, 0); } -/* Undo alloc_pages_bulk_array() */ +/* Undo alloc_pages_bulk() */ for_each_sgtable_page (&buf->table.sgt, &sg_iter,0 )__free_page (sg_page_iter_page (&sg_iter));sg_free_append_table (&buf->table);
@@ -431,8 +431,8 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,return -ENOMEM ; do { - filled = alloc_pages_bulk_array(GFP_KERNEL_ACCOUNT, to_fill, - page_list); + filled = alloc_pages_bulk(GFP_KERNEL_ACCOUNT, to_fill, + page_list); if (!filled) { ret = -ENOMEM; goto err;
@@ -1342,7 +1342,7 @@ static void free_recv_pages(struct mlx5_vhca_recv_buf *recv_buf) {int i; -/* Undo alloc_pages_bulk_array() */ +/* Undo alloc_pages_bulk() */ for (i =0 ; i < recv_buf->npages; i++)__free_page (recv_buf->page_list[i]);
@@ -1361,9 +1361,9 @@ static int alloc_recv_pages(struct mlx5_vhca_recv_buf *recv_buf,return -ENOMEM ;for (;;) { - filled =alloc_pages_bulk_array (GFP_KERNEL_ACCOUNT , - npages - done, - recv_buf->page_list + done); + filled =alloc_pages_bulk (GFP_KERNEL_ACCOUNT , + npages - done, + recv_buf->page_list + done);if (!filled) goto err;
drivers/vfio/pci/virtio/migrate.c +3 -3
@@ -77,8 +77,8 @@ static int virtiovf_add_migration_pages(struct virtiovf_data_buffer *buf,return -ENOMEM ; do { - filled = alloc_pages_bulk_array(GFP_KERNEL_ACCOUNT, to_fill, - page_list); + filled = alloc_pages_bulk(GFP_KERNEL_ACCOUNT, to_fill, + page_list); if (!filled) { ret = -ENOMEM; goto err;
@@ -112,7 +112,7 @@ static void virtiovf_free_data_buffer(struct virtiovf_data_buffer *buf) {struct sg_page_iter sg_iter; -/* Undo alloc_pages_bulk_array() */ +/* Undo alloc_pages_bulk() */ for_each_sgtable_page (&buf->table.sgt, &sg_iter,0 )__free_page (sg_page_iter_page (&sg_iter));sg_free_append_table (&buf->table);
fs/btrfs/extent_io.c +1 -1
@@ -632,7 +632,7 @@ int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array,for (allocated =0 ; allocated < nr_pages;) {unsigned int last = allocated; - allocated =alloc_pages_bulk_array (gfp, nr_pages, page_array); + allocated =alloc_pages_bulk (gfp, nr_pages, page_array);if (unlikely (allocated == last)) {/* No progress, fail and do cleanup. */ for (int i =0 ; i < allocated; i++) {
fs/erofs/zutil.c +2 -2
@@ -87,8 +87,8 @@ int z_erofs_gbuf_growsize(unsigned int nrpages) tmp_pages[j] = gbuf->pages[j];do { last = j; - j =alloc_pages_bulk_array (GFP_KERNEL , nrpages, - tmp_pages); + j =alloc_pages_bulk (GFP_KERNEL , nrpages, + tmp_pages);if (last == j) goto out; }while (j != nrpages);
fs/splice.c +1 -1
@@ -342,7 +342,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,return -ENOMEM ; pages = (struct page **)(bv + npages); - npages =alloc_pages_bulk_array (GFP_USER , npages, pages); + npages =alloc_pages_bulk (GFP_USER , npages, pages);if (!npages) {kfree (bv);return -ENOMEM ;
fs/xfs/xfs_buf.c +2 -2
@@ -395,8 +395,8 @@ xfs_buf_alloc_pages(for (;;) {long last = filled; - filled =alloc_pages_bulk_array (gfp_mask, bp->b_page_count, - bp->b_pages); + filled =alloc_pages_bulk (gfp_mask, bp->b_page_count, + bp->b_pages);if (filled == bp->b_page_count) {XFS_STATS_INC (bp->b_mount, xb_page_found);break ;
include/linux/gfp.h +7 -7
@@ -215,18 +215,18 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, struct page **page_array);#define __alloc_pages_bulk (...) alloc_hooks(alloc_pages_bulk_noprof(__VA_ARGS__)) -unsigned long alloc_pages_bulk_array_mempolicy_noprof (gfp_t gfp, +unsigned long alloc_pages_bulk_mempolicy_noprof (gfp_t gfp,unsigned long nr_pages,struct page **page_array); -#define alloc_pages_bulk_array_mempolicy (...) \ - alloc_hooks(alloc_pages_bulk_array_mempolicy_noprof(__VA_ARGS__)) +#define alloc_pages_bulk_mempolicy (...) \ + alloc_hooks(alloc_pages_bulk_mempolicy_noprof(__VA_ARGS__))/* Bulk allocate order-0 pages */ -#define alloc_pages_bulk_array (_gfp, _nr_pages, _page_array) \ +#define alloc_pages_bulk (_gfp, _nr_pages, _page_array) \ __alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, _page_array)static inline unsigned long -alloc_pages_bulk_array_node_noprof (gfp_t gfp,int nid,unsigned long nr_pages, +alloc_pages_bulk_node_noprof (gfp_t gfp,int nid,unsigned long nr_pages,struct page **page_array) {if (nid ==NUMA_NO_NODE )
@@ -235,8 +235,8 @@ alloc_pages_bulk_array_node_noprof(gfp_t gfp, int nid, unsigned long nr_pages,return alloc_pages_bulk_noprof (gfp, nid,NULL , nr_pages, page_array); } -#define alloc_pages_bulk_array_node (...) \ - alloc_hooks(alloc_pages_bulk_array_node_noprof(__VA_ARGS__)) +#define alloc_pages_bulk_node (...) \ + alloc_hooks(alloc_pages_bulk_node_noprof(__VA_ARGS__))static inline void warn_if_node_offline (int this_node,gfp_t gfp_mask) {
kernel/bpf/arena.c +1 -1
@@ -443,7 +443,7 @@ static long arena_alloc_pages(struct bpf_arena *arena, long uaddr, long page_cntreturn 0 ; } -/* zeroing is needed, since alloc_pages_bulk_array() only fills in non-zero entries */ +/* zeroing is needed, since alloc_pages_bulk() only fills in non-zero entries */ pages =kvcalloc (page_cnt,sizeof (struct page *),GFP_KERNEL );if (!pages)return 0 ;
lib/alloc_tag.c +2 -2
@@ -410,8 +410,8 @@ static int vm_module_tags_populate(void)unsigned long nr; more_pages =ALIGN (module_tags.size - phys_size,PAGE_SIZE ) >>PAGE_SHIFT ; - nr =alloc_pages_bulk_array_node (GFP_KERNEL | __GFP_NOWARN, -NUMA_NO_NODE , more_pages, next_page); + nr =alloc_pages_bulk_node (GFP_KERNEL | __GFP_NOWARN, +NUMA_NO_NODE , more_pages, next_page);if (nr < more_pages ||vmap_pages_range (addr, addr + (nr <<PAGE_SHIFT ),PAGE_KERNEL , next_page,PAGE_SHIFT ) <0 ) {
lib/kunit_iov_iter.c +1 -1
@@ -57,7 +57,7 @@ static void *__init iov_kunit_create_buffer(struct kunit *test,KUNIT_ASSERT_NOT_ERR_OR_NULL (test, pages); *ppages = pages; - got =alloc_pages_bulk_array (GFP_KERNEL , npages, pages); + got =alloc_pages_bulk (GFP_KERNEL , npages, pages);if (got != npages) {release_pages (pages, got);KUNIT_ASSERT_EQ (test, got, npages);
lib/test_vmalloc.c +1 -1
@@ -373,7 +373,7 @@ vm_map_ram_test(void)if (!pages)return -1 ; - nr_allocated =alloc_pages_bulk_array (GFP_KERNEL , map_nr_pages, pages); + nr_allocated =alloc_pages_bulk (GFP_KERNEL , map_nr_pages, pages);if (nr_allocated != map_nr_pages) goto cleanup;
mm/mempolicy.c +7 -7
@@ -2356,7 +2356,7 @@ struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order) }EXPORT_SYMBOL (folio_alloc_noprof); -static unsigned long alloc_pages_bulk_array_interleave (gfp_t gfp, +static unsigned long alloc_pages_bulk_interleave (gfp_t gfp,struct mempolicy *pol,unsigned long nr_pages,struct page **page_array) {
@@ -2391,7 +2391,7 @@ static unsigned long alloc_pages_bulk_array_interleave(gfp_t gfp,return total_allocated; } -static unsigned long alloc_pages_bulk_array_weighted_interleave (gfp_t gfp, +static unsigned long alloc_pages_bulk_weighted_interleave (gfp_t gfp,struct mempolicy *pol,unsigned long nr_pages,struct page **page_array) {
@@ -2506,7 +2506,7 @@ static unsigned long alloc_pages_bulk_array_weighted_interleave(gfp_t gfp,return total_allocated; } -static unsigned long alloc_pages_bulk_array_preferred_many (gfp_t gfp,int nid, +static unsigned long alloc_pages_bulk_preferred_many (gfp_t gfp,int nid,struct mempolicy *pol,unsigned long nr_pages,struct page **page_array) {
@@ -2532,7 +2532,7 @@ static unsigned long alloc_pages_bulk_array_preferred_many(gfp_t gfp, int nid,* It can accelerate memory allocation especially interleaving * allocate memory. */ -unsigned long alloc_pages_bulk_array_mempolicy_noprof (gfp_t gfp, +unsigned long alloc_pages_bulk_mempolicy_noprof (gfp_t gfp,unsigned long nr_pages,struct page **page_array) {struct mempolicy *pol = &default_policy;
@@ -2543,15 +2543,15 @@ unsigned long alloc_pages_bulk_array_mempolicy_noprof(gfp_t gfp, pol =get_task_policy (current);if (pol->mode ==MPOL_INTERLEAVE ) -return alloc_pages_bulk_array_interleave (gfp, pol, +return alloc_pages_bulk_interleave (gfp, pol, nr_pages, page_array);if (pol->mode ==MPOL_WEIGHTED_INTERLEAVE ) -return alloc_pages_bulk_array_weighted_interleave ( +return alloc_pages_bulk_weighted_interleave ( gfp, pol, nr_pages, page_array);if (pol->mode ==MPOL_PREFERRED_MANY ) -return alloc_pages_bulk_array_preferred_many (gfp, +return alloc_pages_bulk_preferred_many (gfp,numa_node_id (), pol, nr_pages, page_array); nid =numa_node_id ();
mm/vmalloc.c +2 -2
@@ -3560,11 +3560,11 @@ vm_area_alloc_pages(gfp_t gfp, int nid,* but mempolicy wants to alloc memory by interleaving. */ if (IS_ENABLED (CONFIG_NUMA ) && nid ==NUMA_NO_NODE ) - nr =alloc_pages_bulk_array_mempolicy_noprof (gfp, + nr =alloc_pages_bulk_mempolicy_noprof (gfp, nr_pages_request, pages + nr_allocated);else - nr =alloc_pages_bulk_array_node_noprof (gfp, nid, + nr =alloc_pages_bulk_node_noprof (gfp, nid, nr_pages_request, pages + nr_allocated);
net/core/page_pool.c +3 -4
@@ -532,12 +532,11 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool,if (unlikely (pool->alloc.count >0 ))return pool->alloc.cache[--pool->alloc.count]; -/* Mark empty alloc.cache slots "empty" for alloc_pages_bulk_array */ +/* Mark empty alloc.cache slots "empty" for alloc_pages_bulk */ memset (&pool->alloc.cache,0 ,sizeof (void *) * bulk); - nr_pages =alloc_pages_bulk_array_node (gfp, - pool->p.nid, bulk, - (struct page **)pool->alloc.cache); + nr_pages =alloc_pages_bulk_node (gfp, pool->p.nid, bulk, + (struct page **)pool->alloc.cache);if (unlikely (!nr_pages))return 0 ;
net/sunrpc/svc.c +2 -2
@@ -651,8 +651,8 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node)if (pages >RPCSVC_MAXPAGES ) pages =RPCSVC_MAXPAGES ; - ret =alloc_pages_bulk_array_node (GFP_KERNEL , node, pages, - rqstp->rq_pages); + ret =alloc_pages_bulk_node (GFP_KERNEL , node, pages, + rqstp->rq_pages);return ret == pages; }
net/sunrpc/svc_xprt.c +1 -2
@@ -671,8 +671,7 @@ static bool svc_alloc_arg(struct svc_rqst *rqstp) }for (filled =0 ; filled < pages; filled = ret) { - ret =alloc_pages_bulk_array (GFP_KERNEL , pages, - rqstp->rq_pages); + ret =alloc_pages_bulk (GFP_KERNEL , pages, rqstp->rq_pages);if (ret > filled)/* Made progress, don't sleep yet */ continue ;
Signature · 1 line
2.47.1
Re: [PATCH 2/2] mm: alloc_pages_bulk: rename API
Quoted 11 lines · Luiz Capitulino
The previous commit removed the
page_listargument fromalloc_pages_bulk_noprof()along with thealloc_pages_bulk_list()function.Now that only the
*_array()flavour of the API remains, we can do the following renaming (along with the_noprof()ones):alloc_pages_bulk_array -> alloc_pages_bulk alloc_pages_bulk_array_mempolicy -> alloc_pages_bulk_mempolicy alloc_pages_bulk_array_node -> alloc_pages_bulk_nodeSigned-off-by Luiz Capitulino <[email protected]>
Sounds reasonable to me
Interestingly, drivers/staging/media/atomisp/pci/hmm/hmm_bo.c has a free_pages_bulk_array() function -- which we should definitively leave alone for now :)
Signature · 3 lines
Cheers, David / dhildenb