lkml.org 
[lkml]   [2011]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] sched: leave sched_setscheduler earlier if possible.
    From
    Date
    sched_setscheduler (in sched.c) is called in order of changing the
    scheduling policy and/or the real-time priority of a task. Thus,
    if we find out that neither of those are actually being modified, it
    is possible to return earlier and save the overhead of a full
    deactivate+activate cycle of the task in question.

    Beside that, if we have more than one SCHED_FIFO task with the same
    priority on the same rq (which means they share the same priority queue)
    having one of them changing its position in the priority queue because of
    a sched_setscheduler (as it happens by means of the deactivate+activate)
    that does not actually change the priority violates POSIX which states,
    for SCHED_FIFO:

    "If a thread whose policy or priority has been modified by
    pthread_setschedprio() is a running thread or is runnable, the effect on
    its position in the thread list depends on the direction of the
    modification, as follows: a. <...> b. If the priority is unchanged, the
    thread does not change position in the thread list. c. <...>"

    (http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html)

    Signed-off-by: Dario Faggioli <raistlin@linux.it>
    ---
    kernel/sched.c | 10 ++++++++++
    1 files changed, 10 insertions(+), 0 deletions(-)

    diff --git a/kernel/sched.c b/kernel/sched.c
    index c5ae6bc..d73bbc5 100644
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -4998,6 +4998,16 @@ recheck:
    return -EINVAL;
    }

    + /*
    + * If not changing anything there's no need to proceed further
    + */
    + if (unlikely(policy == p->policy && (!rt_policy(policy) ||
    + param->sched_priority == p->rt_priority))) {
    + __task_rq_unlock(rq);
    + raw_spin_unlock_irqrestore(&p->pi_lock, flags);
    + return 0;
    + }
    +
    #ifdef CONFIG_RT_GROUP_SCHED
    if (user) {
    /*
    --
    1.7.4.1
    --
    <<This happens because I choose it to happen!>> (Raistlin Majere)
    ----------------------------------------------------------------------
    Dario Faggioli, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy)
    http://retis.sssup.it/people/faggioli -- dario.faggioli@jabber.org

    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2011-03-24 15:03    [W:0.021 / U:32.296 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site