• Martin Andersson's avatar
    [PATCH] sched: fix task interactivity calculation · 013d3868
    Martin Andersson authored
    Is a truncation error in kernel/sched.c triggered when the nice value is
    negative.  The affected code is used in the TASK_INTERACTIVE macro.
    
    The code is:
    #define SCALE(v1,v1_max,v2_max) \
    	(v1) * (v2_max) / (v1_max)
    
    which is used in this way:
    SCALE(TASK_NICE(p), 40, MAX_BONUS)
    
    Comments in the code says:
      * This part scales the interactivity limit depending on niceness.
      *
      * We scale it linearly, offset by the INTERACTIVE_DELTA delta.
      * Here are a few examples of different nice levels:
      *
      *  TASK_INTERACTIVE(-20): [1,1,1,1,1,1,1,1,1,0,0]
      *  TASK_INTERACTIVE(-10): [1,1,1,1,1,1,1,0,0,0,0]
      *  TASK_INTERACTIVE(  0): [1,1,1,1,0,0,0,0,0,0,0]
      *  TASK_INTERACTIVE( 10): [1,1,0,0,0,0,0,0,0,0,0]
      *  TASK_INTERACTIVE( 19): [0,0,0,0,0,0,0,0,0,0,0]
      *
      * (the X axis represents the possible -5 ... 0 ... +5 dynamic
      *  priority range a task can explore, a value of '1' means the
      *  task is rated interactive.)
    
    However, the current code does not scale it linearly and the result differs
    from the given examples.  If the mathematical function "floor" is used when
    the nice value is negative instead of the truncation one gets when using
    integer division, the result conforms to the documentation.
    
    Output of TASK_INTERACTIVE when using the kernel code:
    nice    dynamic priorities
    -20     1     1     1     1     1     1     1     1     1     0     0
    -19     1     1     1     1     1     1     1     1     0     0     0
    -18     1     1     1     1     1     1     1     1     0     0     0
    -17     1     1     1     1     1     1     1     1     0     0     0
    -16     1     1     1     1     1     1     1     1     0     0     0
    -15     1     1     1     1     1     1     1     0     0     0     0
    -14     1     1     1     1     1     1     1     0     0     0     0
    -13     1     1     1     1     1     1     1     0     0     0     0
    -12     1     1     1     1     1     1     1     0     0     0     0
    -11     1     1     1     1     1     1     0     0     0     0     0
    -10     1     1     1     1     1     1     0     0     0     0     0
      -9     1     1     1     1     1     1     0     0     0     0     0
      -8     1     1     1     1     1     1     0     0     0     0     0
      -7     1     1     1     1     1     0     0     0     0     0     0
      -6     1     1     1     1     1     0     0     0     0     0     0
      -5     1     1     1     1     1     0     0     0     0     0     0
      -4     1     1     1     1     1     0     0     0     0     0     0
      -3     1     1     1     1     0     0     0     0     0     0     0
      -2     1     1     1     1     0     0     0     0     0     0     0
      -1     1     1     1     1     0     0     0     0     0     0     0
      0      1     1     1     1     0     0     0     0     0     0     0
      1      1     1     1     1     0     0     0     0     0     0     0
      2      1     1     1     1     0     0     0     0     0     0     0
      3      1     1     1     1     0     0     0     0     0     0     0
      4      1     1     1     0     0     0     0     0     0     0     0
      5      1     1     1     0     0     0     0     0     0     0     0
      6      1     1     1     0     0     0     0     0     0     0     0
      7      1     1     1     0     0     0     0     0     0     0     0
      8      1     1     0     0     0     0     0     0     0     0     0
      9      1     1     0     0     0     0     0     0     0     0     0
    10      1     1     0     0     0     0     0     0     0     0     0
    11      1     1     0     0     0     0     0     0     0     0     0
    12      1     0     0     0     0     0     0     0     0     0     0
    13      1     0     0     0     0     0     0     0     0     0     0
    14      1     0     0     0     0     0     0     0     0     0     0
    15      1     0     0     0     0     0     0     0     0     0     0
    16      0     0     0     0     0     0     0     0     0     0     0
    17      0     0     0     0     0     0     0     0     0     0     0
    18      0     0     0     0     0     0     0     0     0     0     0
    19      0     0     0     0     0     0     0     0     0     0     0
    
    Output of TASK_INTERACTIVE when using "floor"
    nice    dynamic priorities
    -20     1     1     1     1     1     1     1     1     1     0     0
    -19     1     1     1     1     1     1     1     1     1     0     0
    -18     1     1     1     1     1     1     1     1     1     0     0
    -17     1     1     1     1     1     1     1     1     1     0     0
    -16     1     1     1     1     1     1     1     1     0     0     0
    -15     1     1     1     1     1     1     1     1     0     0     0
    -14     1     1     1     1     1     1     1     1     0     0     0
    -13     1     1     1     1     1     1     1     1     0     0     0
    -12     1     1     1     1     1     1     1     0     0     0     0
    -11     1     1     1     1     1     1     1     0     0     0     0
    -10     1     1     1     1     1     1     1     0     0     0     0
      -9     1     1     1     1     1     1     1     0     0     0     0
      -8     1     1     1     1     1     1     0     0     0     0     0
      -7     1     1     1     1     1     1     0     0     0     0     0
      -6     1     1     1     1     1     1     0     0     0     0     0
      -5     1     1     1     1     1     1     0     0     0     0     0
      -4     1     1     1     1     1     0     0     0     0     0     0
      -3     1     1     1     1     1     0     0     0     0     0     0
      -2     1     1     1     1     1     0     0     0     0     0     0
      -1     1     1     1     1     1     0     0     0     0     0     0
       0     1     1     1     1     0     0     0     0     0     0     0
       1     1     1     1     1     0     0     0     0     0     0     0
       2     1     1     1     1     0     0     0     0     0     0     0
       3     1     1     1     1     0     0     0     0     0     0     0
       4     1     1     1     0     0     0     0     0     0     0     0
       5     1     1     1     0     0     0     0     0     0     0     0
       6     1     1     1     0     0     0     0     0     0     0     0
       7     1     1     1     0     0     0     0     0     0     0     0
       8     1     1     0     0     0     0     0     0     0     0     0
       9     1     1     0     0     0     0     0     0     0     0     0
      10     1     1     0     0     0     0     0     0     0     0     0
      11     1     1     0     0     0     0     0     0     0     0     0
      12     1     0     0     0     0     0     0     0     0     0     0
      13     1     0     0     0     0     0     0     0     0     0     0
      14     1     0     0     0     0     0     0     0     0     0     0
      15     1     0     0     0     0     0     0     0     0     0     0
      16     0     0     0     0     0     0     0     0     0     0     0
      17     0     0     0     0     0     0     0     0     0     0     0
      18     0     0     0     0     0     0     0     0     0     0     0
      19     0     0     0     0     0     0     0     0     0     0     0
    Signed-off-by: default avatarMartin Andersson <martin.andersson@control.lth.se>
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Peter Williams <pwil3058@bigpond.net.au>
    Cc: Con Kolivas <kernel@kolivas.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    013d3868
sched.c 153 KB