|
@@ -1436,8 +1436,15 @@ static int task_numa_migrate(struct task_struct *p)
|
|
|
/* Try to find a spot on the preferred nid. */
|
|
|
task_numa_find_cpu(&env, taskimp, groupimp);
|
|
|
|
|
|
- /* No space available on the preferred nid. Look elsewhere. */
|
|
|
- if (env.best_cpu == -1) {
|
|
|
+ /*
|
|
|
+ * Look at other nodes in these cases:
|
|
|
+ * - there is no space available on the preferred_nid
|
|
|
+ * - the task is part of a numa_group that is interleaved across
|
|
|
+ * multiple NUMA nodes; in order to better consolidate the group,
|
|
|
+ * we need to check other locations.
|
|
|
+ */
|
|
|
+ if (env.best_cpu == -1 || (p->numa_group &&
|
|
|
+ nodes_weight(p->numa_group->active_nodes) > 1)) {
|
|
|
for_each_online_node(nid) {
|
|
|
if (nid == env.src_nid || nid == p->numa_preferred_nid)
|
|
|
continue;
|