|
@@ -1259,18 +1259,19 @@ static int task_numa_migrate(struct task_struct *p)
|
|
|
/* Attempt to migrate a task to a CPU on the preferred node. */
|
|
|
static void numa_migrate_preferred(struct task_struct *p)
|
|
|
{
|
|
|
- /* Success if task is already running on preferred CPU */
|
|
|
- p->numa_migrate_retry = 0;
|
|
|
- if (cpu_to_node(task_cpu(p)) == p->numa_preferred_nid)
|
|
|
+ /* This task has no NUMA fault statistics yet */
|
|
|
+ if (unlikely(p->numa_preferred_nid == -1 || !p->numa_faults))
|
|
|
return;
|
|
|
|
|
|
- /* This task has no NUMA fault statistics yet */
|
|
|
- if (unlikely(p->numa_preferred_nid == -1))
|
|
|
+ /* Periodically retry migrating the task to the preferred node */
|
|
|
+ p->numa_migrate_retry = jiffies + HZ;
|
|
|
+
|
|
|
+ /* Success if task is already running on preferred CPU */
|
|
|
+ if (cpu_to_node(task_cpu(p)) == p->numa_preferred_nid)
|
|
|
return;
|
|
|
|
|
|
/* Otherwise, try migrate to a CPU on the preferred node */
|
|
|
- if (task_numa_migrate(p) != 0)
|
|
|
- p->numa_migrate_retry = jiffies + HZ*5;
|
|
|
+ task_numa_migrate(p);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1629,8 +1630,11 @@ void task_numa_fault(int last_cpupid, int node, int pages, int flags)
|
|
|
|
|
|
task_numa_placement(p);
|
|
|
|
|
|
- /* Retry task to preferred node migration if it previously failed */
|
|
|
- if (p->numa_migrate_retry && time_after(jiffies, p->numa_migrate_retry))
|
|
|
+ /*
|
|
|
+ * Retry task to preferred node migration periodically, in case it
|
|
|
+ * case it previously failed, or the scheduler moved us.
|
|
|
+ */
|
|
|
+ if (time_after(jiffies, p->numa_migrate_retry))
|
|
|
numa_migrate_preferred(p);
|
|
|
|
|
|
if (migrated)
|