mm: Add min_free_order_shift tunable.
authorArve Hjønnevåg <arve@android.com>
Tue, 17 Feb 2009 22:51:02 +0000 (14:51 -0800)
committerColin Cross <ccross@android.com>
Thu, 30 Sep 2010 00:49:04 +0000 (17:49 -0700)
By default the kernel tries to keep half as much memory free at each
order as it does for one order below. This can be too agressive when
running without swap.

Change-Id: I5efc1a0b50f41ff3ac71e92d2efd175dedd54ead
Signed-off-by: Arve Hjønnevåg <arve@android.com>
kernel/sysctl.c
mm/page_alloc.c

index f88552c6d2275be1216187f07b1e0e1b22b93af2..aadaee9bcb187b747358db0a69a244b6b92995c8 100644 (file)
@@ -94,6 +94,7 @@ extern char core_pattern[];
 extern unsigned int core_pipe_limit;
 extern int pid_max;
 extern int min_free_kbytes;
+extern int min_free_order_shift;
 extern int pid_max_min, pid_max_max;
 extern int sysctl_drop_caches;
 extern int percpu_pagelist_fraction;
@@ -1156,6 +1157,13 @@ static struct ctl_table vm_table[] = {
                .proc_handler   = min_free_kbytes_sysctl_handler,
                .extra1         = &zero,
        },
+       {
+               .procname       = "min_free_order_shift",
+               .data           = &min_free_order_shift,
+               .maxlen         = sizeof(min_free_order_shift),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
        {
                .procname       = "percpu_pagelist_fraction",
                .data           = &percpu_pagelist_fraction,
index a8cfa9cc6e86e5d6912a39bc3f5c9d18fb97b7cf..17ce3faeecca0dd6a4203fa9aa870c6744cae735 100644 (file)
@@ -166,6 +166,7 @@ static char * const zone_names[MAX_NR_ZONES] = {
 };
 
 int min_free_kbytes = 1024;
+int min_free_order_shift = 1;
 
 static unsigned long __meminitdata nr_kernel_pages;
 static unsigned long __meminitdata nr_all_pages;
@@ -1477,7 +1478,7 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                free_pages -= z->free_area[o].nr_free << o;
 
                /* Require fewer higher order pages to be free */
-               min >>= 1;
+               min >>= min_free_order_shift;
 
                if (free_pages <= min)
                        return 0;