diff options
-rw-r--r-- | Documentation/sysctl/vm.txt | 11 | ||||
-rw-r--r-- | include/linux/compaction.h | 1 | ||||
-rw-r--r-- | kernel/sysctl.c | 9 | ||||
-rw-r--r-- | mm/compaction.c | 7 |
4 files changed, 28 insertions, 0 deletions
diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 902b4574acfb..9832ec52f859 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt | |||
@@ -21,6 +21,7 @@ Currently, these files are in /proc/sys/vm: | |||
21 | - admin_reserve_kbytes | 21 | - admin_reserve_kbytes |
22 | - block_dump | 22 | - block_dump |
23 | - compact_memory | 23 | - compact_memory |
24 | - compact_unevictable_allowed | ||
24 | - dirty_background_bytes | 25 | - dirty_background_bytes |
25 | - dirty_background_ratio | 26 | - dirty_background_ratio |
26 | - dirty_bytes | 27 | - dirty_bytes |
@@ -106,6 +107,16 @@ huge pages although processes will also directly compact memory as required. | |||
106 | 107 | ||
107 | ============================================================== | 108 | ============================================================== |
108 | 109 | ||
110 | compact_unevictable_allowed | ||
111 | |||
112 | Available only when CONFIG_COMPACTION is set. When set to 1, compaction is | ||
113 | allowed to examine the unevictable lru (mlocked pages) for pages to compact. | ||
114 | This should be used on systems where stalls for minor page faults are an | ||
115 | acceptable trade for large contiguous free memory. Set to 0 to prevent | ||
116 | compaction from moving pages that are unevictable. Default value is 1. | ||
117 | |||
118 | ============================================================== | ||
119 | |||
109 | dirty_background_bytes | 120 | dirty_background_bytes |
110 | 121 | ||
111 | Contains the amount of dirty memory at which the background kernel | 122 | Contains the amount of dirty memory at which the background kernel |
diff --git a/include/linux/compaction.h b/include/linux/compaction.h index a014559e4a49..aa8f61cf3a19 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h | |||
@@ -34,6 +34,7 @@ extern int sysctl_compaction_handler(struct ctl_table *table, int write, | |||
34 | extern int sysctl_extfrag_threshold; | 34 | extern int sysctl_extfrag_threshold; |
35 | extern int sysctl_extfrag_handler(struct ctl_table *table, int write, | 35 | extern int sysctl_extfrag_handler(struct ctl_table *table, int write, |
36 | void __user *buffer, size_t *length, loff_t *ppos); | 36 | void __user *buffer, size_t *length, loff_t *ppos); |
37 | extern int sysctl_compact_unevictable_allowed; | ||
37 | 38 | ||
38 | extern int fragmentation_index(struct zone *zone, unsigned int order); | 39 | extern int fragmentation_index(struct zone *zone, unsigned int order); |
39 | extern unsigned long try_to_compact_pages(gfp_t gfp_mask, unsigned int order, | 40 | extern unsigned long try_to_compact_pages(gfp_t gfp_mask, unsigned int order, |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8c0eabd41886..42b7fc2860c1 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -1335,6 +1335,15 @@ static struct ctl_table vm_table[] = { | |||
1335 | .extra1 = &min_extfrag_threshold, | 1335 | .extra1 = &min_extfrag_threshold, |
1336 | .extra2 = &max_extfrag_threshold, | 1336 | .extra2 = &max_extfrag_threshold, |
1337 | }, | 1337 | }, |
1338 | { | ||
1339 | .procname = "compact_unevictable_allowed", | ||
1340 | .data = &sysctl_compact_unevictable_allowed, | ||
1341 | .maxlen = sizeof(int), | ||
1342 | .mode = 0644, | ||
1343 | .proc_handler = proc_dointvec, | ||
1344 | .extra1 = &zero, | ||
1345 | .extra2 = &one, | ||
1346 | }, | ||
1338 | 1347 | ||
1339 | #endif /* CONFIG_COMPACTION */ | 1348 | #endif /* CONFIG_COMPACTION */ |
1340 | { | 1349 | { |
diff --git a/mm/compaction.c b/mm/compaction.c index a18201a8124e..570426edcadf 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -1047,6 +1047,12 @@ typedef enum { | |||
1047 | } isolate_migrate_t; | 1047 | } isolate_migrate_t; |
1048 | 1048 | ||
1049 | /* | 1049 | /* |
1050 | * Allow userspace to control policy on scanning the unevictable LRU for | ||
1051 | * compactable pages. | ||
1052 | */ | ||
1053 | int sysctl_compact_unevictable_allowed __read_mostly = 1; | ||
1054 | |||
1055 | /* | ||
1050 | * Isolate all pages that can be migrated from the first suitable block, | 1056 | * Isolate all pages that can be migrated from the first suitable block, |
1051 | * starting at the block pointed to by the migrate scanner pfn within | 1057 | * starting at the block pointed to by the migrate scanner pfn within |
1052 | * compact_control. | 1058 | * compact_control. |
@@ -1057,6 +1063,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, | |||
1057 | unsigned long low_pfn, end_pfn; | 1063 | unsigned long low_pfn, end_pfn; |
1058 | struct page *page; | 1064 | struct page *page; |
1059 | const isolate_mode_t isolate_mode = | 1065 | const isolate_mode_t isolate_mode = |
1066 | (sysctl_compact_unevictable_allowed ? ISOLATE_UNEVICTABLE : 0) | | ||
1060 | (cc->mode == MIGRATE_ASYNC ? ISOLATE_ASYNC_MIGRATE : 0); | 1067 | (cc->mode == MIGRATE_ASYNC ? ISOLATE_ASYNC_MIGRATE : 0); |
1061 | 1068 | ||
1062 | /* | 1069 | /* |