|
@@ -892,8 +892,14 @@ static void task_numa_placement(struct task_struct *p)
|
|
|
|
|
|
/* Find the node with the highest number of faults */
|
|
|
for_each_online_node(nid) {
|
|
|
- unsigned long faults = p->numa_faults[nid];
|
|
|
+ unsigned long faults;
|
|
|
+
|
|
|
+ /* Decay existing window and copy faults since last scan */
|
|
|
p->numa_faults[nid] >>= 1;
|
|
|
+ p->numa_faults[nid] += p->numa_faults_buffer[nid];
|
|
|
+ p->numa_faults_buffer[nid] = 0;
|
|
|
+
|
|
|
+ faults = p->numa_faults[nid];
|
|
|
if (faults > max_faults) {
|
|
|
max_faults = faults;
|
|
|
max_nid = nid;
|
|
@@ -919,9 +925,13 @@ void task_numa_fault(int node, int pages, bool migrated)
|
|
|
if (unlikely(!p->numa_faults)) {
|
|
|
int size = sizeof(*p->numa_faults) * nr_node_ids;
|
|
|
|
|
|
- p->numa_faults = kzalloc(size, GFP_KERNEL|__GFP_NOWARN);
|
|
|
+ /* numa_faults and numa_faults_buffer share the allocation */
|
|
|
+ p->numa_faults = kzalloc(size * 2, GFP_KERNEL|__GFP_NOWARN);
|
|
|
if (!p->numa_faults)
|
|
|
return;
|
|
|
+
|
|
|
+ BUG_ON(p->numa_faults_buffer);
|
|
|
+ p->numa_faults_buffer = p->numa_faults + nr_node_ids;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -939,7 +949,7 @@ void task_numa_fault(int node, int pages, bool migrated)
|
|
|
|
|
|
task_numa_placement(p);
|
|
|
|
|
|
- p->numa_faults[node] += pages;
|
|
|
+ p->numa_faults_buffer[node] += pages;
|
|
|
}
|
|
|
|
|
|
static void reset_ptenuma_scan(struct task_struct *p)
|