diff options
Diffstat (limited to 'fs/bcachefs/mean_and_variance.c')
| -rw-r--r-- | fs/bcachefs/mean_and_variance.c | 28 | 
1 files changed, 18 insertions, 10 deletions
diff --git a/fs/bcachefs/mean_and_variance.c b/fs/bcachefs/mean_and_variance.c index bf0ef668fd38..0ea9f30803a2 100644 --- a/fs/bcachefs/mean_and_variance.c +++ b/fs/bcachefs/mean_and_variance.c @@ -103,14 +103,17 @@ EXPORT_SYMBOL_GPL(mean_and_variance_get_stddev);   * mean_and_variance_weighted_update() - exponentially weighted variant of mean_and_variance_update()   * @s: mean and variance number of samples and their sums   * @x: new value to include in the &mean_and_variance_weighted + * @initted: caller must track whether this is the first use or not + * @weight: ewma weight   *   * see linked pdf: function derived from equations 140-143 where alpha = 2^w.   * values are stored bitshifted for performance and added precision.   */ -void mean_and_variance_weighted_update(struct mean_and_variance_weighted *s, s64 x) +void mean_and_variance_weighted_update(struct mean_and_variance_weighted *s, +		s64 x, bool initted, u8 weight)  {  	// previous weighted variance. -	u8 w		= s->weight; +	u8 w		= weight;  	u64 var_w0	= s->variance;  	// new value weighted.  	s64 x_w		= x << w; @@ -119,45 +122,50 @@ void mean_and_variance_weighted_update(struct mean_and_variance_weighted *s, s64  	// new mean weighted.  	s64 u_w1	= s->mean + diff; -	if (!s->init) { +	if (!initted) {  		s->mean = x_w;  		s->variance = 0;  	} else {  		s->mean = u_w1;  		s->variance = ((var_w0 << w) - var_w0 + ((diff_w * (x_w - u_w1)) >> w)) >> w;  	} -	s->init = true;  }  EXPORT_SYMBOL_GPL(mean_and_variance_weighted_update);  /**   * mean_and_variance_weighted_get_mean() - get mean from @s   * @s: mean and variance number of samples and their sums + * @weight: ewma weight   */ -s64 mean_and_variance_weighted_get_mean(struct mean_and_variance_weighted s) +s64 mean_and_variance_weighted_get_mean(struct mean_and_variance_weighted s, +		u8 weight)  { -	return fast_divpow2(s.mean, s.weight); +	return fast_divpow2(s.mean, weight);  }  EXPORT_SYMBOL_GPL(mean_and_variance_weighted_get_mean);  /**   * mean_and_variance_weighted_get_variance() -- get variance from @s   * @s: mean and variance number of samples and their sums + * @weight: ewma weight   */ -u64 mean_and_variance_weighted_get_variance(struct mean_and_variance_weighted s) +u64 mean_and_variance_weighted_get_variance(struct mean_and_variance_weighted s, +		u8 weight)  {  	// always positive don't need fast divpow2 -	return s.variance >> s.weight; +	return s.variance >> weight;  }  EXPORT_SYMBOL_GPL(mean_and_variance_weighted_get_variance);  /**   * mean_and_variance_weighted_get_stddev() - get standard deviation from @s   * @s: mean and variance number of samples and their sums + * @weight: ewma weight   */ -u32 mean_and_variance_weighted_get_stddev(struct mean_and_variance_weighted s) +u32 mean_and_variance_weighted_get_stddev(struct mean_and_variance_weighted s, +		u8 weight)  { -	return int_sqrt64(mean_and_variance_weighted_get_variance(s)); +	return int_sqrt64(mean_and_variance_weighted_get_variance(s, weight));  }  EXPORT_SYMBOL_GPL(mean_and_variance_weighted_get_stddev);  |