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)
committerArve Hjønnevåg <arve@android.com>
Thu, 4 Feb 2010 04:48:13 +0000 (20:48 -0800)
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.

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

index 0d949c517412ee16822a5ca7d6e7c79218543741..79d527a99561dab918e81c5d2ea133a520047862 100644 (file)
@@ -79,6 +79,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;
@@ -1228,6 +1229,14 @@ static struct ctl_table vm_table[] = {
                .strategy       = &sysctl_intvec,
                .extra1         = &zero,
        },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "min_free_order_shift",
+               .data           = &min_free_order_shift,
+               .maxlen         = sizeof(min_free_order_shift),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
        {
                .ctl_name       = VM_PERCPU_PAGELIST_FRACTION,
                .procname       = "percpu_pagelist_fraction",
index 2bc2ac63f41ef8329774a5e444d0be8181ea83bd..70d43bf00dc6c74fc8757e3c88ce91eda06f1cc5 100644 (file)
@@ -122,6 +122,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;
@@ -1379,7 +1380,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;