• 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
fair.c 205 KB