|
@@ -91,6 +91,75 @@ long calc_load_fold_active(struct rq *this_rq, long adjust)
|
|
|
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
|
|
|
/*
|
|
|
* Handle NO_HZ for the global load-average.
|
|
@@ -210,75 +279,6 @@ static long calc_load_nohz_fold(void)
|
|
|
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
|
|
|
* calc_load_fold_active(), but since a NO_HZ CPU folds its delta into
|