|
@@ -1609,9 +1609,11 @@ static void update_task_scan_period(struct task_struct *p,
|
|
|
/*
|
|
|
* If there were no record hinting faults then either the task is
|
|
|
* completely idle or all activity is areas that are not of interest
|
|
|
- * to automatic numa balancing. Scan slower
|
|
|
+ * to automatic numa balancing. Related to that, if there were failed
|
|
|
+ * migration then it implies we are migrating too quickly or the local
|
|
|
+ * node is overloaded. In either case, scan slower
|
|
|
*/
|
|
|
- if (local + shared == 0) {
|
|
|
+ if (local + shared == 0 || p->numa_faults_locality[2]) {
|
|
|
p->numa_scan_period = min(p->numa_scan_period_max,
|
|
|
p->numa_scan_period << 1);
|
|
|
|
|
@@ -2080,6 +2082,8 @@ void task_numa_fault(int last_cpupid, int mem_node, int pages, int flags)
|
|
|
|
|
|
if (migrated)
|
|
|
p->numa_pages_migrated += pages;
|
|
|
+ if (flags & TNF_MIGRATE_FAIL)
|
|
|
+ p->numa_faults_locality[2] += pages;
|
|
|
|
|
|
p->numa_faults[task_faults_idx(NUMA_MEMBUF, mem_node, priv)] += pages;
|
|
|
p->numa_faults[task_faults_idx(NUMA_CPUBUF, cpu_node, priv)] += pages;
|