mm: sched: numa: Control enabling and disabling of NUMA balancing
[linux-3.10.git] / mm / mempolicy.c
index fd20e28..046308e 100644 (file)
@@ -2521,6 +2521,50 @@ void mpol_free_shared_policy(struct shared_policy *p)
        mutex_unlock(&p->mutex);
 }
 
+#ifdef CONFIG_NUMA_BALANCING
+static bool __initdata numabalancing_override;
+
+static void __init check_numabalancing_enable(void)
+{
+       bool numabalancing_default = false;
+
+       if (IS_ENABLED(CONFIG_NUMA_BALANCING_DEFAULT_ENABLED))
+               numabalancing_default = true;
+
+       if (nr_node_ids > 1 && !numabalancing_override) {
+               printk(KERN_INFO "Enabling automatic NUMA balancing. "
+                       "Configure with numa_balancing= or sysctl");
+               set_numabalancing_state(numabalancing_default);
+       }
+}
+
+static int __init setup_numabalancing(char *str)
+{
+       int ret = 0;
+       if (!str)
+               goto out;
+       numabalancing_override = true;
+
+       if (!strcmp(str, "enable")) {
+               set_numabalancing_state(true);
+               ret = 1;
+       } else if (!strcmp(str, "disable")) {
+               set_numabalancing_state(false);
+               ret = 1;
+       }
+out:
+       if (!ret)
+               printk(KERN_WARNING "Unable to parse numa_balancing=\n");
+
+       return ret;
+}
+__setup("numa_balancing=", setup_numabalancing);
+#else
+static inline void __init check_numabalancing_enable(void)
+{
+}
+#endif /* CONFIG_NUMA_BALANCING */
+
 /* assumes fs == KERNEL_DS */
 void __init numa_policy_init(void)
 {
@@ -2571,6 +2615,8 @@ void __init numa_policy_init(void)
 
        if (do_set_mempolicy(MPOL_INTERLEAVE, 0, &interleave_nodes))
                printk("numa_policy_init: interleaving failed\n");
+
+       check_numabalancing_enable();
 }
 
 /* Reset policy of current process to default */