• Luca Abeni's avatar
    sched/deadline: Avoid double-accounting in case of missed deadlines · 269ad801
    Luca Abeni authored
    The dl_runtime_exceeded() function is supposed to ckeck if
    a SCHED_DEADLINE task must be throttled, by checking if its
    current runtime is <= 0. However, it also checks if the
    scheduling deadline has been missed (the current time is
    larger than the current scheduling deadline), further
    decreasing the runtime if this happens.
    This "double accounting" is wrong:
    
    - In case of partitioned scheduling (or single CPU), this
      happens if task_tick_dl() has been called later than expected
      (due to small HZ values). In this case, the current runtime is
      also negative, and replenish_dl_entity() can take care of the
      deadline miss by recharging the current runtime to a value smaller
      than dl_runtime
    
    - In case of global scheduling on multiple CPUs, scheduling
      deadlines can be missed even if the task did not consume more
      runtime than expected, hence penalizing the task is wrong
    
    This patch fix this problem by throttling a SCHED_DEADLINE task
    only when its runtime becomes negative, and not modifying the runtime
    Signed-off-by: default avatarLuca Abeni <luca.abeni@unitn.it>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJuri Lelli <juri.lelli@gmail.com>
    Cc: <stable@vger.kernel.org>
    Cc: Dario Faggioli <raistlin@linux.it>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/1418813432-20797-3-git-send-email-luca.abeni@unitn.itSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    269ad801
deadline.c 44.3 KB