• xiaofeng.yan's avatar
    sched/deadline: Fix a precision problem in the microseconds range · 177ef2a6
    xiaofeng.yan authored
    An overrun could happen in function start_hrtick_dl()
    when a task with SCHED_DEADLINE runs in the microseconds
    range.
    
    For example, if a task with SCHED_DEADLINE has the following parameters:
    
      Task  runtime  deadline  period
       P1   200us     500us    500us
    
    The deadline and period from task P1 are less than 1ms.
    
    In order to achieve microsecond precision, we need to enable HRTICK feature
    by the next command:
    
      PC#echo "HRTICK" > /sys/kernel/debug/sched_features
      PC#trace-cmd record -e sched_switch &
      PC#./schedtool -E -t 200000:500000:500000 -e ./test
    
    The binary test is in an endless while(1) loop here.
    Some pieces of trace.dat are as follows:
    
      <idle>-0   157.603157: sched_switch: :R ==> 2481:4294967295: test
      test-2481  157.603203: sched_switch:  2481:R ==> 0:120: swapper/2
      <idle>-0   157.605657: sched_switch:  :R ==> 2481:4294967295: test
      test-2481  157.608183: sched_switch:  2481:R ==> 2483:120: trace-cmd
      trace-cmd-2483 157.609656: sched_switch:2483:R==>2481:4294967295: test
    
    We can get the runtime of P1 from the information above:
    
      runtime = 157.608183 - 157.605657
      runtime = 0.002526(2.526ms)
    
    The correct runtime should be less than or equal to 200us at some point.
    
    The problem is caused by a conditional judgment "delta > 10000"
    in function start_hrtick_dl().
    
    Because no hrtimer start up to control the rest of runtime
    when the reset of runtime is less than 10us.
    
    So the process will continue to run until tick-period is coming.
    
    Move the code with the limit of the least time slice
    from hrtick_start_fair() to hrtick_start() because the
    EDF schedule class also needs this function in start_hrtick_dl().
    
    To fix this problem, we call hrtimer_start() unconditionally in
    start_hrtick_dl(), and make sure the scheduling slice won't be smaller
    than 10us in hrtimer_start().
    Signed-off-by: default avatarXiaofeng Yan <xiaofeng.yan@huawei.com>
    Reviewed-by: default avatarLi Zefan <lizefan@huawei.com>
    Acked-by: default avatarJuri Lelli <juri.lelli@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/1409022941-5880-1-git-send-email-xiaofeng.yan@huawei.com
    [ Massaged the changelog and the code. ]
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    177ef2a6
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt/kvm Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...
REPORTING-BUGS Loading commit data...