mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
sched: loadavg: make calc_load_n() public
It's going to be used in a later patch. Keep the churn separate. Link: http://lkml.kernel.org/r/20180828172258.3185-6-hannes@cmpxchg.org Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Suren Baghdasaryan <surenb@google.com> Tested-by: Daniel Drake <drake@endlessm.com> Cc: Christopher Lameter <cl@linux.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Johannes Weiner <jweiner@fb.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Enderborg <peter.enderborg@sony.com> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Shakeel Butt <shakeelb@google.com> Cc: Tejun Heo <tj@kernel.org> Cc: Vinayak Menon <vinmenon@codeaurora.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8508cf3ffa
commit
5c54f5b9ed
@ -37,6 +37,9 @@ calc_load(unsigned long load, unsigned long exp, unsigned long active)
|
|||||||
return newload / FIXED_1;
|
return newload / FIXED_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern unsigned long calc_load_n(unsigned long load, unsigned long exp,
|
||||||
|
unsigned long active, unsigned int n);
|
||||||
|
|
||||||
#define LOAD_INT(x) ((x) >> FSHIFT)
|
#define LOAD_INT(x) ((x) >> FSHIFT)
|
||||||
#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
|
#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
|
||||||
|
|
||||||
|
@ -91,6 +91,75 @@ long calc_load_fold_active(struct rq *this_rq, long adjust)
|
|||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fixed_power_int - compute: x^n, in O(log n) time
|
||||||
|
*
|
||||||
|
* @x: base of the power
|
||||||
|
* @frac_bits: fractional bits of @x
|
||||||
|
* @n: power to raise @x to.
|
||||||
|
*
|
||||||
|
* By exploiting the relation between the definition of the natural power
|
||||||
|
* function: x^n := x*x*...*x (x multiplied by itself for n times), and
|
||||||
|
* the binary encoding of numbers used by computers: n := \Sum n_i * 2^i,
|
||||||
|
* (where: n_i \elem {0, 1}, the binary vector representing n),
|
||||||
|
* we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is
|
||||||
|
* of course trivially computable in O(log_2 n), the length of our binary
|
||||||
|
* vector.
|
||||||
|
*/
|
||||||
|
static unsigned long
|
||||||
|
fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n)
|
||||||
|
{
|
||||||
|
unsigned long result = 1UL << frac_bits;
|
||||||
|
|
||||||
|
if (n) {
|
||||||
|
for (;;) {
|
||||||
|
if (n & 1) {
|
||||||
|
result *= x;
|
||||||
|
result += 1UL << (frac_bits - 1);
|
||||||
|
result >>= frac_bits;
|
||||||
|
}
|
||||||
|
n >>= 1;
|
||||||
|
if (!n)
|
||||||
|
break;
|
||||||
|
x *= x;
|
||||||
|
x += 1UL << (frac_bits - 1);
|
||||||
|
x >>= frac_bits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* a1 = a0 * e + a * (1 - e)
|
||||||
|
*
|
||||||
|
* a2 = a1 * e + a * (1 - e)
|
||||||
|
* = (a0 * e + a * (1 - e)) * e + a * (1 - e)
|
||||||
|
* = a0 * e^2 + a * (1 - e) * (1 + e)
|
||||||
|
*
|
||||||
|
* a3 = a2 * e + a * (1 - e)
|
||||||
|
* = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
|
||||||
|
* = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
|
||||||
|
* = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
|
||||||
|
* = a0 * e^n + a * (1 - e^n)
|
||||||
|
*
|
||||||
|
* [1] application of the geometric series:
|
||||||
|
*
|
||||||
|
* n 1 - x^(n+1)
|
||||||
|
* S_n := \Sum x^i = -------------
|
||||||
|
* i=0 1 - x
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
calc_load_n(unsigned long load, unsigned long exp,
|
||||||
|
unsigned long active, unsigned int n)
|
||||||
|
{
|
||||||
|
return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NO_HZ_COMMON
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
/*
|
/*
|
||||||
* Handle NO_HZ for the global load-average.
|
* Handle NO_HZ for the global load-average.
|
||||||
@ -210,75 +279,6 @@ static long calc_load_nohz_fold(void)
|
|||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fixed_power_int - compute: x^n, in O(log n) time
|
|
||||||
*
|
|
||||||
* @x: base of the power
|
|
||||||
* @frac_bits: fractional bits of @x
|
|
||||||
* @n: power to raise @x to.
|
|
||||||
*
|
|
||||||
* By exploiting the relation between the definition of the natural power
|
|
||||||
* function: x^n := x*x*...*x (x multiplied by itself for n times), and
|
|
||||||
* the binary encoding of numbers used by computers: n := \Sum n_i * 2^i,
|
|
||||||
* (where: n_i \elem {0, 1}, the binary vector representing n),
|
|
||||||
* we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is
|
|
||||||
* of course trivially computable in O(log_2 n), the length of our binary
|
|
||||||
* vector.
|
|
||||||
*/
|
|
||||||
static unsigned long
|
|
||||||
fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n)
|
|
||||||
{
|
|
||||||
unsigned long result = 1UL << frac_bits;
|
|
||||||
|
|
||||||
if (n) {
|
|
||||||
for (;;) {
|
|
||||||
if (n & 1) {
|
|
||||||
result *= x;
|
|
||||||
result += 1UL << (frac_bits - 1);
|
|
||||||
result >>= frac_bits;
|
|
||||||
}
|
|
||||||
n >>= 1;
|
|
||||||
if (!n)
|
|
||||||
break;
|
|
||||||
x *= x;
|
|
||||||
x += 1UL << (frac_bits - 1);
|
|
||||||
x >>= frac_bits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* a1 = a0 * e + a * (1 - e)
|
|
||||||
*
|
|
||||||
* a2 = a1 * e + a * (1 - e)
|
|
||||||
* = (a0 * e + a * (1 - e)) * e + a * (1 - e)
|
|
||||||
* = a0 * e^2 + a * (1 - e) * (1 + e)
|
|
||||||
*
|
|
||||||
* a3 = a2 * e + a * (1 - e)
|
|
||||||
* = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
|
|
||||||
* = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
|
|
||||||
*
|
|
||||||
* ...
|
|
||||||
*
|
|
||||||
* an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
|
|
||||||
* = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
|
|
||||||
* = a0 * e^n + a * (1 - e^n)
|
|
||||||
*
|
|
||||||
* [1] application of the geometric series:
|
|
||||||
*
|
|
||||||
* n 1 - x^(n+1)
|
|
||||||
* S_n := \Sum x^i = -------------
|
|
||||||
* i=0 1 - x
|
|
||||||
*/
|
|
||||||
static unsigned long
|
|
||||||
calc_load_n(unsigned long load, unsigned long exp,
|
|
||||||
unsigned long active, unsigned int n)
|
|
||||||
{
|
|
||||||
return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NO_HZ can leave us missing all per-CPU ticks calling
|
* NO_HZ can leave us missing all per-CPU ticks calling
|
||||||
* calc_load_fold_active(), but since a NO_HZ CPU folds its delta into
|
* calc_load_fold_active(), but since a NO_HZ CPU folds its delta into
|
||||||
|
Loading…
Reference in New Issue
Block a user