sched/fair: Optimize ___update_sched_avg()
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: 
Yuyang Du <yuyang.du@intel.com>
Signed-off-by: 
Peter 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.com
Signed-off-by: 
Ingo Molnar <mingo@kernel.org>
Loading
Please register or sign in to comment