On 04/15/2016 11:07 AM, Mel Gorman wrote: > When bulk freeing pages from the per-cpu lists the zone is checked > for isolated pageblocks on every release. This patch checks it once > per drain. Technically this is race-prone but so is the existing > code. No, existing code is protected by zone->lock. Both checking and manipulating the variable zone->nr_isolate_pageblock should happen under the lock, as correct accounting depends on it. Luckily, the patch could be simply fixed by removing last changelog sentence and: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 49aabfb39ff1..7de04bdd8c67 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -831,9 +831,10 @@ static void free_pcppages_bulk(struct zone *zone, int count, int batch_free = 0; int to_free = count; unsigned long nr_scanned; - bool isolated_pageblocks = has_isolate_pageblock(zone); + bool isolated_pageblocks; spin_lock(&zone->lock); + isolated_pageblocks = has_isolate_pageblock(zone); nr_scanned = zone_page_state(zone, NR_PAGES_SCANNED); if (nr_scanned) __mod_zone_page_state(zone, NR_PAGES_SCANNED, -nr_scanned); > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> > --- > mm/page_alloc.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 4a364e318873..835a1c434832 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -831,6 +831,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, > int batch_free = 0; > int to_free = count; > unsigned long nr_scanned; > + bool isolated_pageblocks = has_isolate_pageblock(zone); > > spin_lock(&zone->lock); > nr_scanned = zone_page_state(zone, NR_PAGES_SCANNED); > @@ -870,7 +871,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, > /* 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(has_isolate_pageblock(zone))) > + if (unlikely(isolated_pageblocks)) > mt = get_pageblock_migratetype(page); > > __free_one_page(page, page_to_pfn(page), zone, 0, mt); > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>