aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2013-10-07 06:28:58 -0400
committerIngo Molnar <mingo@kernel.org>2013-10-09 06:40:23 -0400
commit688b7585d16ab57a17aa4422a3b290b3a55fa679 (patch)
tree2a016719cf05336bf49db699a9268dae6b99310f
parentf809ca9a554dda49fb264c79e31c722e0b063ff8 (diff)
sched/numa: Select a preferred node with the most numa hinting faults
This patch selects a preferred node for a task to run on based on the NUMA hinting faults. This information is later used to migrate tasks towards the node during balancing. Signed-off-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1381141781-10992-21-git-send-email-mgorman@suse.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--include/linux/sched.h1
-rw-r--r--kernel/sched/core.c1
-rw-r--r--kernel/sched/fair.c17
3 files changed, 17 insertions, 2 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index a810e95bca2b..b1fc75e7187b 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1344,6 +1344,7 @@ struct task_struct {
1344 struct callback_head numa_work; 1344 struct callback_head numa_work;
1345 1345
1346 unsigned long *numa_faults; 1346 unsigned long *numa_faults;
1347 int numa_preferred_nid;
1347#endif /* CONFIG_NUMA_BALANCING */ 1348#endif /* CONFIG_NUMA_BALANCING */
1348 1349
1349 struct rcu_head rcu; 1350 struct rcu_head rcu;
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 6808d35fd7ed..d15cd70f85b5 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1633,6 +1633,7 @@ static void __sched_fork(struct task_struct *p)
1633 p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0; 1633 p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0;
1634 p->numa_migrate_seq = p->mm ? p->mm->numa_scan_seq - 1 : 0; 1634 p->numa_migrate_seq = p->mm ? p->mm->numa_scan_seq - 1 : 0;
1635 p->numa_scan_period = sysctl_numa_balancing_scan_delay; 1635 p->numa_scan_period = sysctl_numa_balancing_scan_delay;
1636 p->numa_preferred_nid = -1;
1636 p->numa_work.next = &p->numa_work; 1637 p->numa_work.next = &p->numa_work;
1637 p->numa_faults = NULL; 1638 p->numa_faults = NULL;
1638#endif /* CONFIG_NUMA_BALANCING */ 1639#endif /* CONFIG_NUMA_BALANCING */
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 0bb3e0aa110b..9efd34f63e81 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -879,7 +879,8 @@ static unsigned int task_scan_max(struct task_struct *p)
879 879
880static void task_numa_placement(struct task_struct *p) 880static void task_numa_placement(struct task_struct *p)
881{ 881{
882 int seq; 882 int seq, nid, max_nid = -1;
883 unsigned long max_faults = 0;
883 884
884 if (!p->mm) /* for example, ksmd faulting in a user's mm */ 885 if (!p->mm) /* for example, ksmd faulting in a user's mm */
885 return; 886 return;
@@ -889,7 +890,19 @@ static void task_numa_placement(struct task_struct *p)
889 p->numa_scan_seq = seq; 890 p->numa_scan_seq = seq;
890 p->numa_scan_period_max = task_scan_max(p); 891 p->numa_scan_period_max = task_scan_max(p);
891 892
892 /* FIXME: Scheduling placement policy hints go here */ 893 /* Find the node with the highest number of faults */
894 for_each_online_node(nid) {
895 unsigned long faults = p->numa_faults[nid];
896 p->numa_faults[nid] >>= 1;
897 if (faults > max_faults) {
898 max_faults = faults;
899 max_nid = nid;
900 }
901 }
902
903 /* Update the tasks preferred node if necessary */
904 if (max_faults && max_nid != p->numa_preferred_nid)
905 p->numa_preferred_nid = max_nid;
893} 906}
894 907
895/* 908/*