|
@@ -5338,6 +5338,19 @@ static void task_move_group_fair(struct task_struct *p, int on_rq)
|
|
|
* to another cgroup's rq. This does somewhat interfere with the
|
|
|
* fair sleeper stuff for the first placement, but who cares.
|
|
|
*/
|
|
|
+ /*
|
|
|
+ * When !on_rq, vruntime of the task has usually NOT been normalized.
|
|
|
+ * But there are some cases where it has already been normalized:
|
|
|
+ *
|
|
|
+ * - Moving a forked child which is waiting for being woken up by
|
|
|
+ * wake_up_new_task().
|
|
|
+ *
|
|
|
+ * To prevent boost or penalty in the new cfs_rq caused by delta
|
|
|
+ * min_vruntime between the two cfs_rqs, we skip vruntime adjustment.
|
|
|
+ */
|
|
|
+ if (!on_rq && !p->se.sum_exec_runtime)
|
|
|
+ on_rq = 1;
|
|
|
+
|
|
|
if (!on_rq)
|
|
|
p->se.vruntime -= cfs_rq_of(&p->se)->min_vruntime;
|
|
|
set_task_rq(p, task_cpu(p));
|