aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2014-01-23 18:53:13 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-23 19:36:51 -0500
commit54a43d54988a3731d644fdeb7a1d6f46b4ac64c7 (patch)
tree87dc618d08b23d042e3ea01b3acbc56a0358cbdb
parent5e270e254885893f8c82ab9b91caa648af3690df (diff)
numa: add a sysctl for numa_balancing
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>
-rw-r--r--include/linux/sched/sysctl.h4
-rw-r--r--kernel/sched/core.c24
-rw-r--r--kernel/sysctl.c9
-rw-r--r--mm/mempolicy.c2
4 files changed, 37 insertions, 2 deletions
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index 31e0193cb0c5..b13cf430764f 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -99,4 +99,8 @@ extern int sched_rt_handler(struct ctl_table *table, int write,
99 void __user *buffer, size_t *lenp, 99 void __user *buffer, size_t *lenp,
100 loff_t *ppos); 100 loff_t *ppos);
101 101
102extern int sysctl_numa_balancing(struct ctl_table *table, int write,
103 void __user *buffer, size_t *lenp,
104 loff_t *ppos);
105
102#endif /* _SCHED_SYSCTL_H */ 106#endif /* _SCHED_SYSCTL_H */
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4d6964e49711..7fea865a810d 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1770,7 +1770,29 @@ void set_numabalancing_state(bool enabled)
1770 numabalancing_enabled = enabled; 1770 numabalancing_enabled = enabled;
1771} 1771}
1772#endif /* CONFIG_SCHED_DEBUG */ 1772#endif /* CONFIG_SCHED_DEBUG */
1773#endif /* CONFIG_NUMA_BALANCING */ 1773
1774#ifdef CONFIG_PROC_SYSCTL
1775int sysctl_numa_balancing(struct ctl_table *table, int write,
1776 void __user *buffer, size_t *lenp, loff_t *ppos)
1777{
1778 struct ctl_table t;
1779 int err;
1780 int state = numabalancing_enabled;
1781
1782 if (write && !capable(CAP_SYS_ADMIN))
1783 return -EPERM;
1784
1785 t = *table;
1786 t.data = &state;
1787 err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
1788 if (err < 0)
1789 return err;
1790 if (write)
1791 set_numabalancing_state(state);
1792 return err;
1793}
1794#endif
1795#endif
1774 1796
1775/* 1797/*
1776 * fork()/clone()-time setup: 1798 * fork()/clone()-time setup:
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 332cefcdb04b..693eac39c202 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -389,6 +389,15 @@ static struct ctl_table kern_table[] = {
389 .mode = 0644, 389 .mode = 0644,
390 .proc_handler = proc_dointvec, 390 .proc_handler = proc_dointvec,
391 }, 391 },
392 {
393 .procname = "numa_balancing",
394 .data = NULL, /* filled in by handler */
395 .maxlen = sizeof(unsigned int),
396 .mode = 0644,
397 .proc_handler = sysctl_numa_balancing,
398 .extra1 = &zero,
399 .extra2 = &one,
400 },
392#endif /* CONFIG_NUMA_BALANCING */ 401#endif /* CONFIG_NUMA_BALANCING */
393#endif /* CONFIG_SCHED_DEBUG */ 402#endif /* CONFIG_SCHED_DEBUG */
394 { 403 {
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 0cd2c4d4e270..947293e76533 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -2668,7 +2668,7 @@ static void __init check_numabalancing_enable(void)
2668 2668
2669 if (nr_node_ids > 1 && !numabalancing_override) { 2669 if (nr_node_ids > 1 && !numabalancing_override) {
2670 printk(KERN_INFO "Enabling automatic NUMA balancing. " 2670 printk(KERN_INFO "Enabling automatic NUMA balancing. "
2671 "Configure with numa_balancing= or sysctl"); 2671 "Configure with numa_balancing= or the kernel.numa_balancing sysctl");
2672 set_numabalancing_state(numabalancing_default); 2672 set_numabalancing_state(numabalancing_default);
2673 } 2673 }
2674} 2674}