diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cde5dac6229a..d295c9bc01a8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2214,7 +2214,7 @@ static void steal_suitable_fallback(struct zone *zone, struct page *page,  	 */  	boost_watermark(zone);  	if (alloc_flags & ALLOC_KSWAPD) -		wakeup_kswapd(zone, 0, 0, zone_idx(zone)); +		set_bit(ZONE_BOOSTED_WATERMARK, &zone->flags);  	/* We are not allowed to try stealing from the whole block */  	if (!whole_block) @@ -3102,6 +3102,12 @@ struct page *rmqueue(struct zone *preferred_zone,  	local_irq_restore(flags);  out: +	/* Separate test+clear to avoid unnecessary atomics */ +	if (test_bit(ZONE_BOOSTED_WATERMARK, &zone->flags)) { +		clear_bit(ZONE_BOOSTED_WATERMARK, &zone->flags); +		wakeup_kswapd(zone, 0, 0, zone_idx(zone)); +	} +  	VM_BUG_ON_PAGE(page && bad_range(zone, page), page);  	return page;  | 
