lkml.org 
[lkml]   [2011]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [patch] sched: fix broken SCHED_RESET_ON_FORK handling
    From
    Date
    I knew that thing had been moved before.. see f83f9ac2.

    On Wed, 2011-07-27 at 17:14 +0200, Mike Galbraith wrote:
    > sched: fix broken SCHED_RESET_ON_FORK handling
    >
    > 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>
    > Cc: <stable@kernel.org>
    >
    > diff --git a/kernel/sched.c b/kernel/sched.c
    > index 0281f84..a3e65a0 100644
    > --- a/kernel/sched.c
    > +++ b/kernel/sched.c
    > @@ -2804,19 +2804,23 @@ 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
    > @@ -2825,11 +2829,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;
    >
    >
    >




    \
     
     \ /
      Last update: 2011-07-27 18:13    [W:0.026 / U:0.784 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site