• Peter Zijlstra's avatar
    sched,dl: Fix sched class hopping CBS hole · a649f237
    Peter Zijlstra authored
    We still have a few pending issues with the deadline code, one of which
    is that switching between scheduling classes can 'leak' CBS state.
    
    Close the hole by retaining the current CBS state when leaving
    SCHED_DEADLINE and unconditionally programming the deadline timer.
    The timer will then reset the CBS state if the task is still
    !SCHED_DEADLINE by the time it hits.
    
    If the task left SCHED_DEADLINE it will not call task_dead_dl() and
    we'll not cancel the hrtimer, leaving us a pending timer in free
    space. Avoid this by giving the timer a task reference, this avoids
    littering the task exit path for this rather uncommon case.
    
    In order to do this, I had to move dl_task_offline_migration() below
    the replenishment, such that the task_rq()->lock fully covers that.
    While doing this, I noticed that it (was) buggy in assuming a task is
    enqueued and or we need to enqueue the task now. Fixing this means
    select_task_rq_dl() might encounter an offline rq -- look into that.
    
    As a result this kills cancel_dl_timer() which included a rq->lock
    break.
    
    Fixes: 40767b0d ("sched/deadline: Fix deadline parameter modification handling")
    Cc: Wanpeng Li <wanpeng.li@linux.intel.com>
    Cc: Luca Abeni <luca.abeni@unitn.it>
    Cc: Juri Lelli <juri.lelli@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: ktkhai@parallels.com
    Cc: rostedt@goodmis.org
    Cc: juri.lelli@gmail.com
    Cc: pang.xunlei@linaro.org
    Cc: oleg@redhat.com
    Cc: wanpeng.li@linux.intel.com
    Cc: Luca Abeni <luca.abeni@unitn.it>
    Cc: Juri Lelli <juri.lelli@arm.com>
    Cc: umgwanakikbuti@gmail.com
    Link: http://lkml.kernel.org/r/20150611124743.574192138@infradead.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    a649f237
deadline.c 46.5 KB