Skip to content

Commit

Permalink
sched: fix broken SCHED_RESET_ON_FORK handling
Browse files Browse the repository at this point in the history
Setting child->prio = current->normal_prio _after_ SCHED_RESET_ON_FORK has
been handled for an RT parent gives birth to a deranged mutant child with
non-RT policy, but RT prio and sched_class.

Move PI leakage protection up, always set priorities and weight, and if the
child is leaving RT class, reset rt_priority to the proper value.

Signed-off-by: Mike Galbraith <efault@gmx.de>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1311779695.8691.2.camel@marge.simson.net
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Mike Galbraith authored and Ingo Molnar committed Aug 14, 2011
1 parent 2c2efae commit c350a04
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -2843,20 +2843,24 @@ void sched_fork(struct task_struct *p)
*/
p->state = TASK_RUNNING;

/*
* Make sure we do not leak PI boosting priority to the child.
*/
p->prio = current->normal_prio;

/*
* Revert to default priority/policy on fork if requested.
*/
if (unlikely(p->sched_reset_on_fork)) {
if (p->policy == SCHED_FIFO || p->policy == SCHED_RR) {
if (task_has_rt_policy(p)) {
p->policy = SCHED_NORMAL;
p->normal_prio = p->static_prio;
}

if (PRIO_TO_NICE(p->static_prio) < 0) {
p->static_prio = NICE_TO_PRIO(0);
p->normal_prio = p->static_prio;
set_load_weight(p);
}
p->rt_priority = 0;
} else if (PRIO_TO_NICE(p->static_prio) < 0)
p->static_prio = NICE_TO_PRIO(0);

p->prio = p->normal_prio = __normal_prio(p);
set_load_weight(p);

/*
* We don't need the reset flag anymore after the fork. It has
Expand All @@ -2865,11 +2869,6 @@ void sched_fork(struct task_struct *p)
p->sched_reset_on_fork = 0;
}

/*
* Make sure we do not leak PI boosting priority to the child.
*/
p->prio = current->normal_prio;

if (!rt_prio(p->prio))
p->sched_class = &fair_sched_class;

Expand Down

0 comments on commit c350a04

Please sign in to comment.