Message ID | f6505442-98a9-12e4-b2cd-0fa83874c159@suse.cz (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Oct 19, 2017 at 03:42:12PM +0200, Vlastimil Babka wrote: > From b002266c1a826805a50087db851f93e7a87ceb2f Mon Sep 17 00:00:00 2001 > From: Vlastimil Babka <vbabka@suse.cz> > Date: Tue, 17 Oct 2017 16:03:02 +0200 > Subject: [PATCH] mm, page_alloc: simplify list handling in rmqueue_bulk() > > The rmqueue_bulk() function fills an empty pcplist with pages from the free > list. It tries to preserve increasing order by pfn to the caller, because it > leads to better performance with some I/O controllers, as explained in > e084b2d95e48 ("page-allocator: preserve PFN ordering when __GFP_COLD is set"). > > To preserve the order, it's sufficient to add pages to the tail of the list > as they are retrieved. The current code instead adds to the head of the list, > but then updates the list head pointer to the last added page, in each step. > This does result in the same order, but is needlessly confusing and potentially > wasteful, with no apparent benefit. This patch simplifies the code and adjusts > comment accordingly. > > Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Acked-by: Mel Gorman <mgorman@techsingularity.net>
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3e60d8a37e3f..4e1b3c686cc2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2330,16 +2330,16 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, continue; /* - * Split buddy pages returned by expand() are received here - * in physical page order. The page is added to the callers and - * list and the list head then moves forward. From the callers - * perspective, the linked list is ordered by page number in - * some conditions. This is useful for IO devices that can - * merge IO requests if the physical pages are ordered - * properly. + * Split buddy pages returned by expand() are received here in + * physical page order. The page is added to the tail of + * caller's list. From the callers perspective, the linked list + * is ordered by page number under some conditions. This is + * useful for IO devices that can forward direction from the + * head, thus also in the physical page order. This is useful + * for IO devices that can merge IO requests if the physical + * pages are ordered properly. */ - list_add(&page->lru, list); - list = &page->lru; + list_add_tail(&page->lru, list); alloced++; if (is_migrate_cma(get_pcppage_migratetype(page))) __mod_zone_page_state(zone, NR_FREE_CMA_PAGES,