vmscan: kswapd carefully call compaction
With CONFIG_COMPACTION enabled, kswapd does not try to free contiguous free pages, even when it is woken for a higher order request. This could be bad for eg. jumbo frame network allocations, which are done from interrupt context and cannot compact memory themselves. Higher than before allocation failure rates in the network receive path have been observed in kernels with compaction enabled. Teach kswapd to defragment the memory zones in a node, but only if required and compaction is not deferred in a zone. [akpm@linux-foundation.org: reduce scope of zones_need_compaction] Signed-off-by: Rik van Riel <riel@redhat.com> Acked-by: Mel Gorman <mel@csn.ul.ie> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Hillf Danton <dhillf@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
fe2c2a1066
commit
7be62de99a
10
mm/vmscan.c
10
mm/vmscan.c
@@ -2919,6 +2919,8 @@ out:
|
||||
* and it is potentially going to sleep here.
|
||||
*/
|
||||
if (order) {
|
||||
int zones_need_compaction = 1;
|
||||
|
||||
for (i = 0; i <= end_zone; i++) {
|
||||
struct zone *zone = pgdat->node_zones + i;
|
||||
|
||||
@@ -2939,9 +2941,17 @@ out:
|
||||
goto loop_again;
|
||||
}
|
||||
|
||||
/* Check if the memory needs to be defragmented. */
|
||||
if (zone_watermark_ok(zone, order,
|
||||
low_wmark_pages(zone), *classzone_idx, 0))
|
||||
zones_need_compaction = 0;
|
||||
|
||||
/* If balanced, clear the congested flag */
|
||||
zone_clear_flag(zone, ZONE_CONGESTED);
|
||||
}
|
||||
|
||||
if (zones_need_compaction)
|
||||
compact_pgdat(pgdat, order);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user