lkml.org 
[lkml]   [2015]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.2 149/221] sched: Fix RLIMIT_RTTIME when PI-boosting to RT
    3.2.69-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Brian Silverman <brian@peloton-tech.com>

    commit 746db9443ea57fd9c059f62c4bfbf41cf224fe13 upstream.

    When non-realtime tasks get priority-inheritance boosted to a realtime
    scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
    counter used for checking this (the same one used for SCHED_RR
    timeslices) was not getting reset. This meant that tasks running with a
    non-realtime scheduling class which are repeatedly boosted to a realtime
    one, but never block while they are running realtime, eventually hit the
    timeout without ever running for a time over the limit. This patch
    resets the realtime timeslice counter when un-PI-boosting from an RT to
    a non-RT scheduling class.

    I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
    mutex which induces priority boosting and spins while boosted that gets
    killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
    applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
    does happen eventually with PREEMPT_VOLUNTARY kernels.

    Signed-off-by: Brian Silverman <brian@peloton-tech.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: austin@peloton-tech.com
    Link: http://lkml.kernel.org/r/1424305436-6716-1-git-send-email-brian@peloton-tech.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    [bwh: Backported to 3.2: adjust filename, context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -5224,8 +5224,11 @@ void rt_mutex_setprio(struct task_struct

    if (rt_prio(prio))
    p->sched_class = &rt_sched_class;
    - else
    + else {
    + if (rt_prio(oldprio))
    + p->rt.timeout = 0;
    p->sched_class = &fair_sched_class;
    + }

    p->prio = prio;



    \
     
     \ /
      Last update: 2015-05-05 04:01    [W:6.114 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site