|
@@ -2383,9 +2383,6 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
|
|
p->sched_class = &fair_sched_class;
|
|
p->sched_class = &fair_sched_class;
|
|
}
|
|
}
|
|
|
|
|
|
- if (p->sched_class->task_fork)
|
|
|
|
- p->sched_class->task_fork(p);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* The child is not yet in the pid-hash so no cgroup attach races,
|
|
* The child is not yet in the pid-hash so no cgroup attach races,
|
|
* and the cgroup is pinned to this child due to cgroup_fork()
|
|
* and the cgroup is pinned to this child due to cgroup_fork()
|
|
@@ -2394,7 +2391,13 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
|
|
* Silence PROVE_RCU.
|
|
* Silence PROVE_RCU.
|
|
*/
|
|
*/
|
|
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
|
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
|
- set_task_cpu(p, cpu);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We're setting the cpu for the first time, we don't migrate,
|
|
|
|
+ * so use __set_task_cpu().
|
|
|
|
+ */
|
|
|
|
+ __set_task_cpu(p, cpu);
|
|
|
|
+ if (p->sched_class->task_fork)
|
|
|
|
+ p->sched_class->task_fork(p);
|
|
raw_spin_unlock_irqrestore(&p->pi_lock, flags);
|
|
raw_spin_unlock_irqrestore(&p->pi_lock, flags);
|
|
|
|
|
|
#ifdef CONFIG_SCHED_INFO
|
|
#ifdef CONFIG_SCHED_INFO
|
|
@@ -2534,8 +2537,11 @@ void wake_up_new_task(struct task_struct *p)
|
|
* Fork balancing, do it here and not earlier because:
|
|
* Fork balancing, do it here and not earlier because:
|
|
* - cpus_allowed can change in the fork path
|
|
* - cpus_allowed can change in the fork path
|
|
* - any previously selected cpu might disappear through hotplug
|
|
* - any previously selected cpu might disappear through hotplug
|
|
|
|
+ *
|
|
|
|
+ * Use __set_task_cpu() to avoid calling sched_class::migrate_task_rq,
|
|
|
|
+ * as we're not fully set-up yet.
|
|
*/
|
|
*/
|
|
- set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0));
|
|
|
|
|
|
+ __set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0));
|
|
#endif
|
|
#endif
|
|
rq = __task_rq_lock(p, &rf);
|
|
rq = __task_rq_lock(p, &rf);
|
|
post_init_entity_util_avg(&p->se);
|
|
post_init_entity_util_avg(&p->se);
|