mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
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]>
This commit is contained in:
parent
ab21588487
commit
7db8889ab0
4 changed files with 73 additions and 5 deletions
|
|
@ -118,8 +118,14 @@ struct compact_control {
|
|||
unsigned long nr_freepages; /* Number of isolated free pages */
|
||||
unsigned long nr_migratepages; /* Number of pages to migrate */
|
||||
unsigned long free_pfn; /* isolate_freepages search base */
|
||||
unsigned long start_free_pfn; /* where we started the search */
|
||||
unsigned long migrate_pfn; /* isolate_migratepages search base */
|
||||
bool sync; /* Synchronous migration */
|
||||
bool wrapped; /* Order > 0 compactions are
|
||||
incremental, once free_pfn
|
||||
and migrate_pfn meet, we restart
|
||||
from the top of the zone;
|
||||
remember we wrapped around. */
|
||||
|
||||
int order; /* order a direct compactor needs */
|
||||
int migratetype; /* MOVABLE, RECLAIMABLE etc */
|
||||
|
|
|
|||
Loading…
Reference in a new issue