• Yuyang Du's avatar
    sched/fair: Optimize ___update_sched_avg() · a481db34
    Yuyang Du authored
    The main PELT function ___update_load_avg(), which implements the
    accumulation and progression of the geometric average series, is
    implemented along the following lines for the scenario where the time
    delta spans all 3 possible sections (see figure below):
    
      1. add the remainder of the last incomplete period
      2. decay old sum
      3. accumulate new sum in full periods since last_update_time
      4. accumulate the current incomplete period
      5. update averages
    
    Or:
    
                d1          d2           d3
                ^           ^            ^
                |           |            |
              |<->|<----------------->|<--->|
      ... |---x---|------| ... |------|-----x (now)
    
      load_sum' = (load_sum + weight * scale * d1) * y^(p+1) +	(1,2)
    
                                            p
    	      weight * scale * 1024 * \Sum y^n +		(3)
                                           n=1
    
    	      weight * scale * d3 * y^0				(4)
    
      load_avg' = load_sum' / LOAD_AVG_MAX				(5)
    
    Where:
    
     d1 - is the delta part completing the remainder of the last
          incomplete period,
     d2 - is the delta part spannind complete periods, and
     d3 - is the delta part starting the current incomplete period.
    
    We can simplify the code in two steps; the first step is to separate
    the first term into new and old parts like:
    
      (load_sum + weight * scale * d1) * y^(p+1) = load_sum * y^(p+1) +
    					       weight * scale * d1 * y^(p+1)
    
    Once we've done that, its easy to see that all new terms carry the
    common factors:
    
      weight * scale
    
    If we factor those out, we arrive at the form:
    
      load_sum' = load_sum * y^(p+1) +
    
    	      weight * scale * (d1 * y^(p+1) +
    
    					 p
    			        1024 * \Sum y^n +
    					n=1
    
    				d3 * y^0)
    
    Which results in a simpler, smaller and faster implementation.
    Signed-off-by: default avatarYuyang Du <yuyang.du@intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: bsegall@google.com
    Cc: dietmar.eggemann@arm.com
    Cc: matt@codeblueprint.co.uk
    Cc: morten.rasmussen@arm.com
    Cc: pjt@google.com
    Cc: umgwanakikbuti@gmail.com
    Cc: vincent.guittot@linaro.org
    Link: http://lkml.kernel.org/r/1486935863-25251-3-git-send-email-yuyang.du@intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    a481db34
fair.c 250 KB