From: Mel Gorman <mgorman@suse.de>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Andrea Arcangeli <aarcange@redhat.com>,
Ingo Molnar <mingo@kernel.org>
Cc: Rik van Riel <riel@redhat.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Hugh Dickins <hughd@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Paul Turner <pjt@google.com>,
Lee Schermerhorn <Lee.Schermerhorn@hp.com>,
Alex Shi <lkml.alex@gmail.com>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
Aneesh Kumar <aneesh.kumar@linux.vnet.ibm.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Linux-MM <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>, Mel Gorman <mgorman@suse.de>
Subject: [PATCH 39/40] mm: sched: numa: Control enabling and disabling of NUMA balancing
Date: Thu, 22 Nov 2012 19:25:52 +0000 [thread overview]
Message-ID: <1353612353-1576-40-git-send-email-mgorman@suse.de> (raw)
In-Reply-To: <1353612353-1576-1-git-send-email-mgorman@suse.de>
This patch adds Kconfig options and kernel parameters to allow the
enabling and disabling of automatic NUMA balancing. The existance
of such a switch was and is very important when debugging problems
related to transparent hugepages and we should have the same for
automatic NUMA placement.
Signed-off-by: Mel Gorman <mgorman@suse.de>
---
Documentation/kernel-parameters.txt | 3 +++
include/linux/sched.h | 4 +++
init/Kconfig | 8 ++++++
kernel/sched/core.c | 48 ++++++++++++++++++++++++-----------
kernel/sched/fair.c | 3 +++
kernel/sched/features.h | 6 +++--
mm/mempolicy.c | 46 +++++++++++++++++++++++++++++++++
7 files changed, 101 insertions(+), 17 deletions(-)
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 9776f06..d984acb 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -403,6 +403,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
atkbd.softrepeat= [HW]
Use software keyboard repeat
+ balancenuma= [KNL,X86] Enable or disable automatic NUMA balancing.
+ Allowed values are enable and disable
+
baycom_epp= [HW,AX25]
Format: <io>,<mode>
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 1068afd..2669bdd 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1563,10 +1563,14 @@ struct task_struct {
#ifdef CONFIG_BALANCE_NUMA
extern void task_numa_fault(int node, int pages, bool migrated);
+extern void set_balancenuma_state(bool enabled);
#else
static inline void task_numa_fault(int node, int pages, bool migrated)
{
}
+static inline void set_balancenuma_state(bool enabled)
+{
+}
#endif
/*
diff --git a/init/Kconfig b/init/Kconfig
index 6897a05..4cccc00f 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -720,6 +720,14 @@ config ARCH_USES_NUMA_PROT_NONE
depends on ARCH_WANTS_PROT_NUMA_PROT_NONE
depends on BALANCE_NUMA
+config BALANCE_NUMA_DEFAULT_ENABLED
+ bool "Automatically enable NUMA aware memory/task placement"
+ default y
+ depends on BALANCE_NUMA
+ help
+ If set, autonumic NUMA balancing will be enabled if running on a NUMA
+ machine.
+
config BALANCE_NUMA
bool "Memory placement aware NUMA scheduler"
default n
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index a59d869..4841f4f 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -192,23 +192,10 @@ static void sched_feat_disable(int i) { };
static void sched_feat_enable(int i) { };
#endif /* HAVE_JUMP_LABEL */
-static ssize_t
-sched_feat_write(struct file *filp, const char __user *ubuf,
- size_t cnt, loff_t *ppos)
+static int sched_feat_set(char *cmp)
{
- char buf[64];
- char *cmp;
- int neg = 0;
int i;
-
- if (cnt > 63)
- cnt = 63;
-
- if (copy_from_user(&buf, ubuf, cnt))
- return -EFAULT;
-
- buf[cnt] = 0;
- cmp = strstrip(buf);
+ int neg = 0;
if (strncmp(cmp, "NO_", 3) == 0) {
neg = 1;
@@ -228,6 +215,27 @@ sched_feat_write(struct file *filp, const char __user *ubuf,
}
}
+ return i;
+}
+
+static ssize_t
+sched_feat_write(struct file *filp, const char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ char buf[64];
+ char *cmp;
+ int i;
+
+ if (cnt > 63)
+ cnt = 63;
+
+ if (copy_from_user(&buf, ubuf, cnt))
+ return -EFAULT;
+
+ buf[cnt] = 0;
+ cmp = strstrip(buf);
+
+ i = sched_feat_set(cmp);
if (i == __SCHED_FEAT_NR)
return -EINVAL;
@@ -1549,6 +1557,16 @@ static void __sched_fork(struct task_struct *p)
#endif /* CONFIG_BALANCE_NUMA */
}
+#ifdef CONFIG_BALANCE_NUMA
+void set_balancenuma_state(bool enabled)
+{
+ if (enabled)
+ sched_feat_set("NUMA");
+ else
+ sched_feat_set("NO_NUMA");
+}
+#endif /* CONFIG_BALANCE_NUMA */
+
/*
* fork()/clone()-time setup:
*/
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c1be907..b4bc459 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -811,6 +811,9 @@ void task_numa_fault(int node, int pages, bool migrated)
{
struct task_struct *p = current;
+ if (!sched_feat_numa(NUMA))
+ return;
+
/* FIXME: Allocate task-specific structure for placement policy here */
/*
diff --git a/kernel/sched/features.h b/kernel/sched/features.h
index 7cfd289..d402368 100644
--- a/kernel/sched/features.h
+++ b/kernel/sched/features.h
@@ -63,8 +63,10 @@ SCHED_FEAT(RT_RUNTIME_SHARE, true)
SCHED_FEAT(LB_MIN, false)
/*
- * Apply the automatic NUMA scheduling policy
+ * Apply the automatic NUMA scheduling policy. Enabled automatically
+ * at runtime if running on a NUMA machine. Can be controlled via
+ * balancenuma=
*/
#ifdef CONFIG_BALANCE_NUMA
-SCHED_FEAT(NUMA, true)
+SCHED_FEAT(NUMA, false)
#endif
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index fd20e28..56ad9bf 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -2521,6 +2521,50 @@ void mpol_free_shared_policy(struct shared_policy *p)
mutex_unlock(&p->mutex);
}
+#ifdef CONFIG_BALANCE_NUMA
+static bool __initdata balancenuma_override;
+
+static void __init check_balancenuma_enable(void)
+{
+ bool balancenuma_default = false;
+
+ if (IS_ENABLED(CONFIG_BALANCE_NUMA_DEFAULT_ENABLED))
+ balancenuma_default = true;
+
+ if (nr_node_ids > 1 && !balancenuma_override) {
+ printk(KERN_INFO "Enabling automatic NUMA balancing. "
+ "Configure with balancenuma= or sysctl");
+ set_balancenuma_state(balancenuma_default);
+ }
+}
+
+static int __init setup_balancenuma(char *str)
+{
+ int ret = 0;
+ if (!str)
+ goto out;
+ balancenuma_override = true;
+
+ if (!strcmp(str, "enable")) {
+ set_balancenuma_state(true);
+ ret = 1;
+ } else if (!strcmp(str, "disable")) {
+ set_balancenuma_state(false);
+ ret = 1;
+ }
+out:
+ if (!ret)
+ printk(KERN_WARNING "Unable to parse balancenuma=\n");
+
+ return ret;
+}
+__setup("balancenuma=", setup_balancenuma);
+#else
+static inline void __init check_balancenuma_enable(void)
+{
+}
+#endif /* CONFIG_BALANCE_NUMA */
+
/* 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_balancenuma_enable();
}
/* Reset policy of current process to default */
--
1.7.9.2
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-11-22 19:27 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-22 19:25 [PATCH 00/40] Automatic NUMA Balancing V5 Mel Gorman
2012-11-22 19:25 ` [PATCH 01/40] x86: mm: only do a local tlb flush in ptep_set_access_flags() Mel Gorman
2012-11-22 19:25 ` [PATCH 02/40] x86: mm: drop TLB flush from ptep_set_access_flags Mel Gorman
2012-11-22 20:56 ` Alan Cox
2012-11-23 9:09 ` Mel Gorman
2012-11-23 9:53 ` Borislav Petkov
2012-11-22 19:25 ` [PATCH 03/40] mm,generic: only flush the local TLB in ptep_set_access_flags Mel Gorman
2012-11-22 19:25 ` [PATCH 04/40] x86/mm: Introduce pte_accessible() Mel Gorman
2012-11-22 19:25 ` [PATCH 05/40] mm: Only flush the TLB when clearing an accessible pte Mel Gorman
2012-11-22 19:25 ` [PATCH 06/40] mm: Count the number of pages affected in change_protection() Mel Gorman
2012-11-22 19:25 ` [PATCH 07/40] mm: Optimize the TLB flush of sys_mprotect() and change_protection() users Mel Gorman
2012-11-22 19:25 ` [PATCH 08/40] mm: compaction: Move migration fail/success stats to migrate.c Mel Gorman
2012-11-22 19:25 ` [PATCH 09/40] mm: migrate: Add a tracepoint for migrate_pages Mel Gorman
2012-11-22 19:25 ` [PATCH 10/40] mm: compaction: Add scanned and isolated counters for compaction Mel Gorman
2012-11-22 19:25 ` [PATCH 11/40] mm: numa: define _PAGE_NUMA Mel Gorman
2012-11-22 19:25 ` [PATCH 12/40] mm: numa: pte_numa() and pmd_numa() Mel Gorman
2012-11-22 19:25 ` [PATCH 13/40] mm: numa: Support NUMA hinting page faults from gup/gup_fast Mel Gorman
2012-11-22 19:25 ` [PATCH 14/40] mm: numa: split_huge_page: transfer the NUMA type from the pmd to the pte Mel Gorman
2012-11-22 19:25 ` [PATCH 15/40] mm: numa: Create basic numa page hinting infrastructure Mel Gorman
2012-11-22 19:25 ` [PATCH 16/40] mm: mempolicy: Make MPOL_LOCAL a real policy Mel Gorman
2012-11-22 19:25 ` [PATCH 17/40] mm: mempolicy: Add MPOL_MF_NOOP Mel Gorman
2012-11-22 19:25 ` [PATCH 18/40] mm: mempolicy: Check for misplaced page Mel Gorman
2012-11-22 19:25 ` [PATCH 19/40] mm: migrate: Introduce migrate_misplaced_page() Mel Gorman
2012-11-22 19:25 ` [PATCH 20/40] mm: mempolicy: Use _PAGE_NUMA to migrate pages Mel Gorman
2012-11-22 19:25 ` [PATCH 21/40] mm: mempolicy: Add MPOL_MF_LAZY Mel Gorman
2012-11-22 19:25 ` [PATCH 22/40] mm: mempolicy: Implement change_prot_numa() in terms of change_protection() Mel Gorman
2012-11-22 19:25 ` [PATCH 23/40] mm: mempolicy: Hide MPOL_NOOP and MPOL_MF_LAZY from userspace for now Mel Gorman
2012-11-22 19:25 ` [PATCH 24/40] mm: numa: Add fault driven placement and migration Mel Gorman
2012-11-22 19:25 ` [PATCH 25/40] mm: sched: numa: Implement constant, per task Working Set Sampling (WSS) rate Mel Gorman
2012-11-22 19:25 ` [PATCH 26/40] sched, numa, mm: Count WS scanning against present PTEs, not virtual memory ranges Mel Gorman
2012-11-22 19:25 ` [PATCH 27/40] mm: sched: numa: Implement slow start for working set sampling Mel Gorman
2012-11-22 19:25 ` [PATCH 28/40] mm: numa: Add pte updates, hinting and migration stats Mel Gorman
2012-11-22 19:25 ` [PATCH 29/40] mm: numa: Migrate on reference policy Mel Gorman
2012-11-22 19:25 ` [PATCH 30/40] mm: numa: Migrate pages handled during a pmd_numa hinting fault Mel Gorman
2012-11-22 19:25 ` [PATCH 31/40] mm: numa: Structures for Migrate On Fault per NUMA migration rate limiting Mel Gorman
2012-11-22 19:25 ` [PATCH 32/40] mm: numa: Rate limit the amount of memory that is migrated between nodes Mel Gorman
2012-11-22 19:25 ` [PATCH 33/40] mm: numa: Rate limit setting of pte_numa if node is saturated Mel Gorman
2012-11-22 19:25 ` [PATCH 34/40] sched: numa: Slowly increase the scanning period as NUMA faults are handled Mel Gorman
2012-11-22 19:25 ` [PATCH 35/40] mm: numa: Introduce last_nid to the page frame Mel Gorman
2012-11-22 19:25 ` [PATCH 36/40] mm: numa: Use a two-stage filter to restrict pages being migrated for unlikely task<->node relationships Mel Gorman
2012-11-22 19:25 ` [PATCH 37/40] mm: numa: Add THP migration for the NUMA working set scanning fault case Mel Gorman
2012-11-23 10:43 ` [PATCH] mm: numa: Add THP migration for the NUMA working set scanning fault case -fixes Mel Gorman
2012-11-22 19:25 ` [PATCH 38/40] mm: sched: Adapt the scanning rate if a NUMA hinting fault does not migrate Mel Gorman
2012-11-22 19:25 ` Mel Gorman [this message]
2012-11-22 19:25 ` [PATCH 40/40] mm: sched: numa: Delay PTE scanning until a task is scheduled on a new node Mel Gorman
2012-11-26 14:58 ` [PATCH 00/41] Automatic NUMA Balancing V6 Mel Gorman
2012-11-28 13:49 ` [PATCH 00/45] Automatic NUMA Balancing V7 Mel Gorman
2012-11-30 11:33 ` [PATCH 00/46] Automatic NUMA Balancing V8 Mel Gorman
2012-11-30 11:41 ` Results for balancenuma v8, autonuma-v28fast and numacore-20121126 Mel Gorman
2012-11-30 16:09 ` Rik van Riel
2012-12-07 10:45 ` [PATCH 00/45] Automatic NUMA Balancing V7 Srikar Dronamraju
2012-12-10 9:07 ` Mel Gorman
2012-12-10 9:42 ` Srikar Dronamraju
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1353612353-1576-40-git-send-email-mgorman@suse.de \
--to=mgorman@suse.de \
--cc=Lee.Schermerhorn@hp.com \
--cc=a.p.zijlstra@chello.nl \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lkml.alex@gmail.com \
--cc=mingo@kernel.org \
--cc=pjt@google.com \
--cc=riel@redhat.com \
--cc=srikar@linux.vnet.ibm.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).