On Wed, Mar 10, 2021 at 01:04:17PM +0200, Shay Agroskin wrote: > > Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> writes: > > > > > 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. > > +} > > + > > /* > > * 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. > > <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