sched/numa: Select a preferred node with the most numa hinting faults
[firefly-linux-kernel-4.4.55.git] / kernel / sched / fair.c
index 0bb3e0aa110b21ea664a9c0a0f6224185c34fcd5..9efd34f63e8196c9ab56baa9fc3cdbf0e5185047 100644 (file)
@@ -879,7 +879,8 @@ static unsigned int task_scan_max(struct task_struct *p)
 
 static void task_numa_placement(struct task_struct *p)
 {
-       int seq;
+       int seq, nid, max_nid = -1;
+       unsigned long max_faults = 0;
 
        if (!p->mm)     /* for example, ksmd faulting in a user's mm */
                return;
@@ -889,7 +890,19 @@ static void task_numa_placement(struct task_struct *p)
        p->numa_scan_seq = seq;
        p->numa_scan_period_max = task_scan_max(p);
 
-       /* FIXME: Scheduling placement policy hints go here */
+       /* Find the node with the highest number of faults */
+       for_each_online_node(nid) {
+               unsigned long faults = p->numa_faults[nid];
+               p->numa_faults[nid] >>= 1;
+               if (faults > max_faults) {
+                       max_faults = faults;
+                       max_nid = nid;
+               }
+       }
+
+       /* Update the tasks preferred node if necessary */
+       if (max_faults && max_nid != p->numa_preferred_nid)
+               p->numa_preferred_nid = max_nid;
 }
 
 /*