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)
+ 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)
+ * 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'