mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-03 12:52:52 +00:00
mm, compaction: create compact_gap wrapper
Compaction uses a watermark gap of (2UL << order) pages at various places and it's not immediately obvious why. Abstract it through a compact_gap() wrapper to create a single place with a thorough explanation. [vbabka@suse.cz: clarify the comment of compact_gap()] Link: http://lkml.kernel.org/r/7b6aed1f-fdf8-2063-9ff4-bbe4de712d37@suse.cz Link: http://lkml.kernel.org/r/20160810091226.6709-9-vbabka@suse.cz Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Tested-by: Lorenzo Stoakes <lstoakes@gmail.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Rientjes <rientjes@google.com> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f2b8228c5f
commit
9861a62c33
3 changed files with 29 additions and 7 deletions
|
@ -58,6 +58,29 @@ enum compact_result {
|
|||
|
||||
struct alloc_context; /* in mm/internal.h */
|
||||
|
||||
/*
|
||||
* Number of free order-0 pages that should be available above given watermark
|
||||
* to make sure compaction has reasonable chance of not running out of free
|
||||
* pages that it needs to isolate as migration target during its work.
|
||||
*/
|
||||
static inline unsigned long compact_gap(unsigned int order)
|
||||
{
|
||||
/*
|
||||
* Although all the isolations for migration are temporary, compaction
|
||||
* free scanner may have up to 1 << order pages on its list and then
|
||||
* try to split an (order - 1) free page. At that point, a gap of
|
||||
* 1 << order might not be enough, so it's safer to require twice that
|
||||
* amount. Note that the number of pages on the list is also
|
||||
* effectively limited by COMPACT_CLUSTER_MAX, as that's the maximum
|
||||
* that the migrate scanner can have isolated on migrate list, and free
|
||||
* scanner is only invoked when the number of isolated free pages is
|
||||
* lower than that. But it's not worth to complicate the formula here
|
||||
* as a bigger gap for higher orders than strictly necessary can also
|
||||
* improve chances of compaction success.
|
||||
*/
|
||||
return 2UL << order;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPACTION
|
||||
extern int sysctl_compact_memory;
|
||||
extern int sysctl_compaction_handler(struct ctl_table *table, int write,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue