On Wed, 20 Jan 2016, Daniel Lezcano wrote:
[...]
One more comment:
+ /*
+ * If the mean value is null, just ignore this wakeup
+ * source.
+ */
+ mean = stats_mean(&w->stats);
+ if (!mean)
+ continue;
+
+ variance = stats_variance(&w->stats, mean);
+ /*
+ * We want to check the last interval is:
+ *
+ * mean - stddev < interval < mean + stddev
+ *
+ * That simplifies to:
+ *
+ * -stddev < interval - mean < stddev
+ *
+ * abs(interval - mean) < stddev
+ *
+ * The standard deviation is the sqrt of the variance:
+ *
+ * abs(interval - mean) < sqrt(variance)
+ *
+ * and we want to prevent to do an sqrt, so we square
+ * the equation:
+ *
+ * (interval - mean)^2 < variance
+ *
+ * So if the latest value of the stats complies with
+ * this condition, then the wakeup source is
+ * considered predictable and can be used to predict
+ * the next event.
+ */
+ interval = w->stats.values[w->stats.w_ptr];
+ if ((u64)((interval - mean) * (interval - mean)) > variance)
+ continue;
+
+ /*
+ * Let's compute the next event: the wakeup source is
+ * considered predictable, we add the average interval
+ * time added to the latest interruption event time.
+ */
+ next = ktime_add_us(w->timestamp, stats_mean(&w->stats));
You don't need to call stats_mean() again as you have it in the 'mean'
variable already.