• P
    sched/deadline: Fix deadline parameter modification handling · 40767b0d
    Peter Zijlstra 提交于
    Commit 67dfa1b7 ("sched/deadline: Implement cancel_dl_timer() to
    use in switched_from_dl()") removed the hrtimer_try_cancel() function
    call out from init_dl_task_timer(), which gets called from
    __setparam_dl().
    
    The result is that we can now re-init the timer while its active --
    this is bad and corrupts timer state.
    
    Furthermore; changing the parameters of an active deadline task is
    tricky in that you want to maintain guarantees, while immediately
    effective change would allow one to circumvent the CBS guarantees --
    this too is bad, as one (bad) task should not be able to affect the
    others.
    
    Rework things to avoid both problems. We only need to initialize the
    timer once, so move that to __sched_fork() for new tasks.
    
    Then make sure __setparam_dl() doesn't affect the current running
    state but only updates the parameters used to calculate the next
    scheduling period -- this guarantees the CBS functions as expected
    (albeit slightly pessimistic).
    
    This however means we need to make sure __dl_clear_params() needs to
    reset the active state otherwise new (and tasks flipping between
    classes) will not properly (re)compute their first instance.
    
    Todo: close class flipping CBS hole.
    Todo: implement delayed BW release.
    Reported-by: NLuca Abeni <luca.abeni@unitn.it>
    Acked-by: NJuri Lelli <juri.lelli@arm.com>
    Tested-by: NLuca Abeni <luca.abeni@unitn.it>
    Fixes: 67dfa1b7 ("sched/deadline: Implement cancel_dl_timer() to use in switched_from_dl()")
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: <stable@vger.kernel.org>
    Cc: Kirill Tkhai <tkhai@yandex.ru>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20150128140803.GF23038@twins.programming.kicks-ass.netSigned-off-by: NIngo Molnar <mingo@kernel.org>
    40767b0d
deadline.c 44.3 KB