numa: add a sysctl for numa_balancing
authorAndi Kleen <ak@linux.intel.com>
Thu, 23 Jan 2014 23:53:13 +0000 (15:53 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Feb 2014 21:55:36 +0000 (13:55 -0800)
commit 54a43d54988a3731d644fdeb7a1d6f46b4ac64c7 upstream.

Add a working sysctl to enable/disable automatic numa memory balancing
at runtime.

This allows us to track down performance problems with this feature and
is generally a good idea.

This was possible earlier through debugfs, but only with special
debugging options set.  Also fix the boot message.

[akpm@linux-foundation.org: s/sched_numa_balancing/sysctl_numa_balancing/]
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/sched/sysctl.h
kernel/sched/core.c
kernel/sysctl.c
mm/mempolicy.c

index 41467f8ff8ec8c7c5766021abe00e358f63e93cc..e3347c518a9ad52e5e59b639d11f25ba525ad3e2 100644 (file)
@@ -100,4 +100,8 @@ extern int sched_rt_handler(struct ctl_table *table, int write,
                void __user *buffer, size_t *lenp,
                loff_t *ppos);
 
+extern int sysctl_numa_balancing(struct ctl_table *table, int write,
+                                void __user *buffer, size_t *lenp,
+                                loff_t *ppos);
+
 #endif /* _SCHED_SYSCTL_H */
index a88f4a485c5e5f92190dd5bf784600d79d5f8f18..c67751034bc92197c50f14ea1f7239341b013462 100644 (file)
@@ -1763,7 +1763,29 @@ void set_numabalancing_state(bool enabled)
        numabalancing_enabled = enabled;
 }
 #endif /* CONFIG_SCHED_DEBUG */
-#endif /* CONFIG_NUMA_BALANCING */
+
+#ifdef CONFIG_PROC_SYSCTL
+int sysctl_numa_balancing(struct ctl_table *table, int write,
+                        void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table t;
+       int err;
+       int state = numabalancing_enabled;
+
+       if (write && !capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
+       t = *table;
+       t.data = &state;
+       err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
+       if (err < 0)
+               return err;
+       if (write)
+               set_numabalancing_state(state);
+       return err;
+}
+#endif
+#endif
 
 /*
  * fork()/clone()-time setup:
index 34a604726d0b7c87b4b112a3f4ab9e1a6902ffcb..06962ba94a66c108e155d7214724f3f983dd22e4 100644 (file)
@@ -398,6 +398,15 @@ static struct ctl_table kern_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
+       {
+               .procname       = "numa_balancing",
+               .data           = NULL, /* filled in by handler */
+               .maxlen         = sizeof(unsigned int),
+               .mode           = 0644,
+               .proc_handler   = sysctl_numa_balancing,
+               .extra1         = &zero,
+               .extra2         = &one,
+       },
 #endif /* CONFIG_NUMA_BALANCING */
 #endif /* CONFIG_SCHED_DEBUG */
        {
index e1bd99778b9dfcefc1f8aa6a70a087e7f40ffea4..98001112bbbb2f77a782f43daf60a398ac166283 100644 (file)
@@ -2668,7 +2668,7 @@ static void __init check_numabalancing_enable(void)
 
        if (nr_node_ids > 1 && !numabalancing_override) {
                printk(KERN_INFO "Enabling automatic NUMA balancing. "
-                       "Configure with numa_balancing= or sysctl");
+                       "Configure with numa_balancing= or the kernel.numa_balancing sysctl");
                set_numabalancing_state(numabalancing_default);
        }
 }