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, | |||
2214 | */ | 2214 | */ |
2215 | boost_watermark(zone); | 2215 | boost_watermark(zone); |
2216 | if (alloc_flags & ALLOC_KSWAPD) | 2216 | if (alloc_flags & ALLOC_KSWAPD) |
2217 | wakeup_kswapd(zone, 0, 0, zone_idx(zone)); | 2217 | set_bit(ZONE_BOOSTED_WATERMARK, &zone->flags); |
2218 | 2218 | ||
2219 | /* We are not allowed to try stealing from the whole block */ | 2219 | /* We are not allowed to try stealing from the whole block */ |
2220 | if (!whole_block) | 2220 | if (!whole_block) |
@@ -3102,6 +3102,12 @@ struct page *rmqueue(struct zone *preferred_zone, | |||
3102 | local_irq_restore(flags); | 3102 | local_irq_restore(flags); |
3103 | 3103 | ||
3104 | out: | 3104 | out: |
3105 | /* Separate test+clear to avoid unnecessary atomics */ | ||
3106 | if (test_bit(ZONE_BOOSTED_WATERMARK, &zone->flags)) { | ||
3107 | clear_bit(ZONE_BOOSTED_WATERMARK, &zone->flags); | ||
3108 | wakeup_kswapd(zone, 0, 0, zone_idx(zone)); | ||
3109 | } | ||
3110 | |||
3105 | VM_BUG_ON_PAGE(page && bad_range(zone, page), page); | 3111 | VM_BUG_ON_PAGE(page && bad_range(zone, page), page); |
3106 | return page; | 3112 | return page; |
3107 | 3113 | ||