[PATCH 24/24] mm, page_alloc: Do not lookup pcp migratetype during bulk free

From: Mel Gorman
Date: Tue Apr 12 2016 - 06:14:44 EST


During bulk free, the pcp type of the page is known as it was removed
from a specific list. It only needs to be rechecked if an isolated
pageblock exists. This patch removes an unnecessary variable in
the process. The impact is that the round-robin freeing of PCP
lists is distorted when an isolated pageblock is encountered but
that is a rare and harmless corner-case.

The impact on the page allocator microbench of the bulk free patches is
visible for higher batch counts when the bulk free paths are hit.

pagealloc
4.6.0-rc3 4.6.0-rc3
cpuset-v2r2 micro-v2r2
Min free-odr0-1 191.00 ( 0.00%) 195.00 ( -2.09%)
Min free-odr0-2 136.00 ( 0.00%) 136.00 ( 0.00%)
Min free-odr0-4 107.00 ( 0.00%) 107.00 ( 0.00%)
Min free-odr0-8 95.00 ( 0.00%) 95.00 ( 0.00%)
Min free-odr0-16 87.00 ( 0.00%) 87.00 ( 0.00%)
Min free-odr0-32 82.00 ( 0.00%) 82.00 ( 0.00%)
Min free-odr0-64 80.00 ( 0.00%) 80.00 ( 0.00%)
Min free-odr0-128 79.00 ( 0.00%) 79.00 ( 0.00%)
Min free-odr0-256 94.00 ( 0.00%) 97.00 ( -3.19%)
Min free-odr0-512 112.00 ( 0.00%) 109.00 ( 2.68%)
Min free-odr0-1024 118.00 ( 0.00%) 118.00 ( 0.00%)
Min free-odr0-2048 123.00 ( 0.00%) 121.00 ( 1.63%)
Min free-odr0-4096 127.00 ( 0.00%) 125.00 ( 1.57%)
Min free-odr0-8192 129.00 ( 0.00%) 127.00 ( 1.55%)
Min free-odr0-16384 128.00 ( 0.00%) 127.00 ( 0.78%)

It's tiny but the patches are trivial.

Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx>
---
mm/page_alloc.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 1b1553c1156c..4d4079309760 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -876,7 +876,7 @@ static void free_pcppages_bulk(struct zone *zone, int count,
*/
do {
batch_free++;
- if (++migratetype == MIGRATE_PCPTYPES)
+ if (++migratetype >= MIGRATE_PCPTYPES)
migratetype = 0;
list = &pcp->lists[migratetype];
} while (list_empty(list));
@@ -886,21 +886,16 @@ static void free_pcppages_bulk(struct zone *zone, int count,
batch_free = count;

do {
- int mt; /* migratetype of the to-be-freed page */
-
page = list_last_entry(list, struct page, lru);
/* must delete as __free_one_page list manipulates */
list_del(&page->lru);

- mt = get_pcppage_migratetype(page);
- /* MIGRATE_ISOLATE page should not go to pcplists */
- VM_BUG_ON_PAGE(is_migrate_isolate(mt), page);
/* Pageblock could have been isolated meanwhile */
if (unlikely(isolated_pageblocks))
- mt = get_pageblock_migratetype(page);
+ migratetype = get_pageblock_migratetype(page);

- __free_one_page(page, page_to_pfn(page), zone, 0, mt);
- trace_mm_page_pcpu_drain(page, 0, mt);
+ __free_one_page(page, page_to_pfn(page), zone, 0, migratetype);
+ trace_mm_page_pcpu_drain(page, 0, migratetype);
} while (--count && --batch_free && !list_empty(list));
}
spin_unlock(&zone->lock);
--
2.6.4