Thread (15 messages) flat view 15 messages, 5 authors, 2021-03-12

Re: [PATCH 2/5] mm/page_alloc: Add a bulk page allocator

From: Mel Gorman <hidden>
Date: 2021-03-10 11:40:44
Also in: linux-mm, linux-nfs, lkml

On Wed, Mar 10, 2021 at 01:04:17PM +0200, Shay Agroskin wrote:
Mel Gorman [off-list ref] writes:
quoted
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index 8572a1474e16..4903d1cc48dc 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -515,6 +515,10 @@ static inline int arch_make_page_accessible(struct
page *page)
 }
 #endif
  +int __alloc_pages_bulk_nodemask(gfp_t gfp_mask, int preferred_nid,
+				nodemask_t *nodemask, int nr_pages,
+				struct list_head *list);
+
 struct page *
 __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int
preferred_nid,
 							nodemask_t  *nodemask);
@@ -525,6 +529,14 @@ __alloc_pages(gfp_t gfp_mask, unsigned int order,
int preferred_nid)
 	return __alloc_pages_nodemask(gfp_mask, order,  preferred_nid, NULL);
 }
+/* Bulk allocate order-0 pages */
+static inline unsigned long
+alloc_pages_bulk(gfp_t gfp_mask, unsigned long nr_pages, struct
list_head *list)
+{
+	return __alloc_pages_bulk_nodemask(gfp_mask, numa_mem_id(), NULL,
+							nr_pages, list);
Is the second line indentation intentional ? Why not align it to the first
argument (gfp_mask) ?
No particular reason. I usually pick this as it's visually clearer to me
that it's part of the same line when the multi-line is part of an if block.
quoted
+}
+
 /*
  * Allocate pages, preferring the node given as nid. The node   must be
valid and
  * online. For more general interface, see alloc_pages_node().
@@ -594,6 +606,7 @@ void * __meminit alloc_pages_exact_nid(int nid,
size_t size, gfp_t gfp_mask);
   extern void __free_pages(struct page *page, unsigned int  order);
 extern void free_pages(unsigned long addr, unsigned int order);
+extern void free_pages_bulk(struct list_head *list);
 struct page_frag_cache;
 extern void __page_frag_cache_drain(struct page *page, unsigned  int
count);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 3e4b29ee2b1e..ff1e55793786 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -4436,6 +4436,21 @@ static void wake_all_kswapds(unsigned int order,
gfp_t gfp_mask,
 	}
 }
...
+/*
+ * This is a batched version of the page allocator that attempts to
+ * allocate nr_pages quickly from the preferred zone and add them to
list.
+ */
+int __alloc_pages_bulk_nodemask(gfp_t gfp_mask, int preferred_nid,
+			nodemask_t *nodemask, int nr_pages,
+			struct list_head *alloc_list)
+{
+	struct page *page;
+	unsigned long flags;
+	struct zone *zone;
+	struct zoneref *z;
+	struct per_cpu_pages *pcp;
+	struct list_head *pcp_list;
+	struct alloc_context ac;
+	gfp_t alloc_mask;
+	unsigned int alloc_flags;
+	int alloced = 0;
Does alloced count the number of allocated pages ?
Yes.
Do you mind renaming it to 'allocated' ?
I will if there is another version as I do not feel particularly strongly
about alloced vs allocated. alloc was to match the function name and I
don't think the change makes it much clearer.

quoted
<SNIP>
+	/* Attempt the batch allocation */
+	local_irq_save(flags);
+	pcp = &this_cpu_ptr(zone->pageset)->pcp;
+	pcp_list = &pcp->lists[ac.migratetype];
+
+	while (alloced < nr_pages) {
+		page = __rmqueue_pcplist(zone, ac.migratetype, alloc_flags,
+ pcp, pcp_list);
Same indentation comment as before
Again, simple personal perference to avoid any possibility it's mixed
up with a later line. There has not been consistent code styling
enforcement of what indentation style should be used for a multi-line
within mm/page_alloc.c

-- 
Mel Gorman
SUSE Labs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help