• Peter Zijlstra's avatar
    sched/eevdf: Use sched_attr::sched_runtime to set request/slice suggestion · 857b158d
    Peter Zijlstra authored
    Allow applications to directly set a suggested request/slice length using
    sched_attr::sched_runtime.
    
    The implementation clamps the value to: 0.1[ms] <= slice <= 100[ms]
    which is 1/10 the size of HZ=1000 and 10 times the size of HZ=100.
    
    Applications should strive to use their periodic runtime at a high
    confidence interval (95%+) as the target slice. Using a smaller slice
    will introduce undue preemptions, while using a larger value will
    increase latency.
    
    For all the following examples assume a scheduling quantum of 8, and for
    consistency all examples have W=4:
    
      {A,B,C,D}(w=1,r=8):
    
      ABCD...
      +---+---+---+---
    
      t=0, V=1.5				t=1, V=3.5
      A  |------<				A          |------<
      B   |------<				B   |------<
      C    |------<				C    |------<
      D     |------<			D     |------<
      ---+*------+-------+---		---+--*----+-------+---
    
      t=2, V=5.5				t=3, V=7.5
      A          |------<			A          |------<
      B           |------<			B           |------<
      C    |------<				C            |------<
      D     |------<			D     |------<
      ---+----*--+-------+---		---+------*+-------+---
    
    Note: 4 identical tasks in FIFO order
    
    ~~~
    
      {A,B}(w=1,r=16) C(w=2,r=16)
    
      AACCBBCC...
      +---+---+---+---
    
      t=0, V=1.25				t=2, V=5.25
      A  |--------------<                   A                  |--------------<
      B   |--------------<                  B   |--------------<
      C    |------<                         C    |------<
      ---+*------+-------+---               ---+----*--+-------+---
    
      t=4, V=8.25				t=6, V=12.25
      A                  |--------------<   A                  |--------------<
      B   |--------------<                  B                   |--------------<
      C            |------<                 C            |------<
      ---+-------*-------+---               ---+-------+---*---+---
    
    Note: 1 heavy task -- because q=8, double r such that the deadline of the w=2
          task doesn't go below q.
    
    Note: observe the full schedule becomes: W*max(r_i/w_i) = 4*2q = 8q in length.
    
    Note: the period of the heavy task is half the full period at:
          W*(r_i/w_i) = 4*(2q/2) = 4q
    
    ~~~
    
      {A,C,D}(w=1,r=16) B(w=1,r=8):
    
      BAACCBDD...
      +---+---+---+---
    
      t=0, V=1.5				t=1, V=3.5
      A  |--------------<			A  |---------------<
      B   |------<				B           |------<
      C    |--------------<			C    |--------------<
      D     |--------------<		D     |--------------<
      ---+*------+-------+---		---+--*----+-------+---
    
      t=3, V=7.5				t=5, V=11.5
      A                  |---------------<  A                  |---------------<
      B           |------<                  B           |------<
      C    |--------------<                 C                    |--------------<
      D     |--------------<                D     |--------------<
      ---+------*+-------+---               ---+-------+--*----+---
    
      t=6, V=13.5
      A                  |---------------<
      B                   |------<
      C                    |--------------<
      D     |--------------<
      ---+-------+----*--+---
    
    Note: 1 short task -- again double r so that the deadline of the short task
          won't be below q. Made B short because its not the leftmost task, but is
          eligible with the 0,1,2,3 spread.
    
    Note: like with the heavy task, the period of the short task observes:
          W*(r_i/w_i) = 4*(1q/1) = 4q
    
    ~~~
    
      A(w=1,r=16) B(w=1,r=8) C(w=2,r=16)
    
      BCCAABCC...
      +---+---+---+---
    
      t=0, V=1.25				t=1, V=3.25
      A  |--------------<                   A  |--------------<
      B   |------<                          B           |------<
      C    |------<                         C    |------<
      ---+*------+-------+---               ---+--*----+-------+---
    
      t=3, V=7.25				t=5, V=11.25
      A  |--------------<                   A                  |--------------<
      B           |------<                  B           |------<
      C            |------<                 C            |------<
      ---+------*+-------+---               ---+-------+--*----+---
    
      t=6, V=13.25
      A                  |--------------<
      B                   |------<
      C            |------<
      ---+-------+----*--+---
    
    Note: 1 heavy and 1 short task -- combine them all.
    
    Note: both the short and heavy task end up with a period of 4q
    
    ~~~
    
      A(w=1,r=16) B(w=2,r=16) C(w=1,r=8)
    
      BBCAABBC...
      +---+---+---+---
    
      t=0, V=1				t=2, V=5
      A  |--------------<                   A  |--------------<
      B   |------<                          B           |------<
      C    |------<                         C    |------<
      ---+*------+-------+---               ---+----*--+-------+---
    
      t=3, V=7				t=5, V=11
      A  |--------------<                   A                  |--------------<
      B           |------<                  B           |------<
      C            |------<                 C            |------<
      ---+------*+-------+---               ---+-------+--*----+---
    
      t=7, V=15
      A                  |--------------<
      B                   |------<
      C            |------<
      ---+-------+------*+---
    
    Note: as before but permuted
    
    ~~~
    
    From all this it can be deduced that, for the steady state:
    
     - the total period (P) of a schedule is:	W*max(r_i/w_i)
     - the average period of a task is:		W*(r_i/w_i)
     - each task obtains the fair share:		w_i/W of each full period P
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Tested-by: default avatarValentin Schneider <vschneid@redhat.com>
    Link: https://lkml.kernel.org/r/20240727105030.842834421@infradead.org
    857b158d
syscalls.c 41.5 KB