diff options
author | Mel Gorman <mel@csn.ul.ie> | 2010-05-24 17:32:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-25 11:06:59 -0400 |
commit | 5e7719058079a1423ccce56148b0aaa56b2df821 (patch) | |
tree | 3666cb3d5540dcaa3d8e7df8c293a0ad603a181c /mm/compaction.c | |
parent | 56de7263fcf3eb10c8dcdf8d59a9cec831795f3f (diff) |
mm: compaction: add a tunable that decides when memory should be compacted and when it should be reclaimed
The kernel applies some heuristics when deciding if memory should be
compacted or reclaimed to satisfy a high-order allocation. One of these
is based on the fragmentation. If the index is below 500, memory will not
be compacted. This choice is arbitrary and not based on data. To help
optimise the system and set a sensible default for this value, this patch
adds a sysctl extfrag_threshold. The kernel will only compact memory if
the fragmentation index is above the extfrag_threshold.
[randy.dunlap@oracle.com: Fix build errors when proc fs is not configured]
Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/compaction.c')
-rw-r--r-- | mm/compaction.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index 9583e193dc47..94cce51b0b35 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -433,6 +433,8 @@ static unsigned long compact_zone_order(struct zone *zone, | |||
433 | return compact_zone(zone, &cc); | 433 | return compact_zone(zone, &cc); |
434 | } | 434 | } |
435 | 435 | ||
436 | int sysctl_extfrag_threshold = 500; | ||
437 | |||
436 | /** | 438 | /** |
437 | * try_to_compact_pages - Direct compact to satisfy a high-order allocation | 439 | * try_to_compact_pages - Direct compact to satisfy a high-order allocation |
438 | * @zonelist: The zonelist used for the current allocation | 440 | * @zonelist: The zonelist used for the current allocation |
@@ -491,7 +493,7 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist, | |||
491 | * Only compact if a failure would be due to fragmentation. | 493 | * Only compact if a failure would be due to fragmentation. |
492 | */ | 494 | */ |
493 | fragindex = fragmentation_index(zone, order); | 495 | fragindex = fragmentation_index(zone, order); |
494 | if (fragindex >= 0 && fragindex <= 500) | 496 | if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold) |
495 | continue; | 497 | continue; |
496 | 498 | ||
497 | if (fragindex == -1 && zone_watermark_ok(zone, order, watermark, 0, 0)) { | 499 | if (fragindex == -1 && zone_watermark_ok(zone, order, watermark, 0, 0)) { |
@@ -572,6 +574,14 @@ int sysctl_compaction_handler(struct ctl_table *table, int write, | |||
572 | return 0; | 574 | return 0; |
573 | } | 575 | } |
574 | 576 | ||
577 | int sysctl_extfrag_handler(struct ctl_table *table, int write, | ||
578 | void __user *buffer, size_t *length, loff_t *ppos) | ||
579 | { | ||
580 | proc_dointvec_minmax(table, write, buffer, length, ppos); | ||
581 | |||
582 | return 0; | ||
583 | } | ||
584 | |||
575 | #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) | 585 | #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) |
576 | ssize_t sysfs_compact_node(struct sys_device *dev, | 586 | ssize_t sysfs_compact_node(struct sys_device *dev, |
577 | struct sysdev_attribute *attr, | 587 | struct sysdev_attribute *attr, |