]> Git Repo - linux.git/commit
mm: have order > 0 compaction start off where it left
authorRik van Riel <[email protected]>
Tue, 31 Jul 2012 23:43:12 +0000 (16:43 -0700)
committerLinus Torvalds <[email protected]>
Wed, 1 Aug 2012 01:42:43 +0000 (18:42 -0700)
commit7db8889ab05b57200158432755af318fb68854a2
treedfce0ce79909bc102465d871dc7b949fa9525e85
parentab2158848775c7918288f2c423d3e4dbbc7d34eb
mm: have order > 0 compaction start off where it left

Order > 0 compaction stops when enough free pages of the correct page
order have been coalesced.  When doing subsequent higher order
allocations, it is possible for compaction to be invoked many times.

However, the compaction code always starts out looking for things to
compact at the start of the zone, and for free pages to compact things to
at the end of the zone.

This can cause quadratic behaviour, with isolate_freepages starting at the
end of the zone each time, even though previous invocations of the
compaction code already filled up all free memory on that end of the zone.

This can cause isolate_freepages to take enormous amounts of CPU with
certain workloads on larger memory systems.

The obvious solution is to have isolate_freepages remember where it left
off last time, and continue at that point the next time it gets invoked
for an order > 0 compaction.  This could cause compaction to fail if
cc->free_pfn and cc->migrate_pfn are close together initially, in that
case we restart from the end of the zone and try once more.

Forced full (order == -1) compactions are left alone.

[[email protected]: checkpatch fixes]
[[email protected]: s/laste/last/, use 80 cols]
Signed-off-by: Rik van Riel <[email protected]>
Reported-by: Jim Schutt <[email protected]>
Tested-by: Jim Schutt <[email protected]>
Cc: Minchan Kim <[email protected]>
Reviewed-by: KAMEZAWA Hiroyuki <[email protected]>
Acked-by: Mel Gorman <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
include/linux/mmzone.h
mm/compaction.c
mm/internal.h
mm/page_alloc.c
This page took 0.0572 seconds and 4 git commands to generate.