lkml.org 
[lkml]   [2015]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 15/43] sched: Fix RLIMIT_RTTIME when PI-boosting to RT
    Date
    3.14-stable 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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/sched/core.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -2980,6 +2980,8 @@ void rt_mutex_setprio(struct task_struct
    } else {
    if (dl_prio(oldprio))
    p->dl.dl_boosted = 0;
    + if (rt_prio(oldprio))
    + p->rt.timeout = 0;
    p->sched_class = &fair_sched_class;
    }




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