From: Johannes Berg Date: Mon, 1 Apr 2013 22:31:05 +0000 (+0200) Subject: properly backport EWMA functions X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=564c5f598ef19738028f8098db5df74f7f017744;p=openwrt%2Fstaging%2Fblogic.git properly backport EWMA functions Signed-off-by: Johannes Berg --- diff --git a/compat/compat/Kconfig b/compat/compat/Kconfig index 8d2b3f2071d2..958d8ac2f666 100644 --- a/compat/compat/Kconfig +++ b/compat/compat/Kconfig @@ -80,3 +80,10 @@ config BACKPORT_OPTION_BT_SOCK_CREATE_NEEDS_KERN bool # FIXME: REDHAT_6_0 also requires this default y if !BACKPORT_KERNEL_2_6_33 + +config BACKPORT_BUILD_AVERAGE + bool + default y if !AVERAGE && BACKPORT_AVERAGE + +config BACKPORT_AVERAGE + bool diff --git a/compat/compat/Makefile b/compat/compat/Makefile index 9b337fe0e803..20a94265304a 100644 --- a/compat/compat/Makefile +++ b/compat/compat/Makefile @@ -31,7 +31,7 @@ compat-$(CPTCFG_BACKPORT_KERNEL_2_6_34) += compat-2.6.34.o compat-$(CPTCFG_BACKPORT_KERNEL_2_6_35) += compat-2.6.35.o compat-$(CPTCFG_BACKPORT_KERNEL_2_6_36) += compat-2.6.36.o compat-$(CPTCFG_BACKPORT_KERNEL_2_6_37) += compat-2.6.37.o -compat-$(CPTCFG_BACKPORT_KERNEL_2_6_38) += compat-2.6.38.o +compat-$(CPTCFG_BACKPORT_BUILD_AVERAGE) += average.o compat-$(CPTCFG_BACKPORT_KERNEL_2_6_39) += compat-2.6.39.o kstrtox.o compat-$(CPTCFG_BACKPORT_KERNEL_3_0) += compat-3.0.o compat-$(CPTCFG_BACKPORT_KERNEL_3_1) += compat-3.1.o diff --git a/compat/compat/average.c b/compat/compat/average.c new file mode 100644 index 000000000000..37cbfd6bdc7e --- /dev/null +++ b/compat/compat/average.c @@ -0,0 +1,50 @@ +/* + * Copyright 2010 Hauke Mehrtens + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Compatibility file for Linux wireless for kernels 2.6.38. + */ + +#include +#include +#include + +/** + * ewma_init() - Initialize EWMA parameters + * @avg: Average structure + * @factor: Factor to use for the scaled up internal value. The maximum value + * of averages can be ULONG_MAX/(factor*weight). + * @weight: Exponential weight, or decay rate. This defines how fast the + * influence of older values decreases. Has to be bigger than 1. + * + * Initialize the EWMA parameters for a given struct ewma @avg. + */ +void ewma_init(struct ewma *avg, unsigned long factor, unsigned long weight) +{ + WARN_ON(weight <= 1 || factor == 0); + avg->internal = 0; + avg->weight = weight; + avg->factor = factor; +} +EXPORT_SYMBOL_GPL(ewma_init); + +/** + * ewma_add() - Exponentially weighted moving average (EWMA) + * @avg: Average structure + * @val: Current value + * + * Add a sample to the average. + */ +struct ewma *ewma_add(struct ewma *avg, unsigned long val) +{ + avg->internal = avg->internal ? + (((avg->internal * (avg->weight - 1)) + + (val * avg->factor)) / avg->weight) : + (val * avg->factor); + return avg; +} +EXPORT_SYMBOL_GPL(ewma_add); + diff --git a/compat/compat/compat-2.6.38.c b/compat/compat/compat-2.6.38.c deleted file mode 100644 index 0074ac625223..000000000000 --- a/compat/compat/compat-2.6.38.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2010 Hauke Mehrtens - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Compatibility file for Linux wireless for kernels 2.6.38. - */ - -#include -#include -#include - -/** - * ewma_init() - Initialize EWMA parameters - * @avg: Average structure - * @factor: Factor to use for the scaled up internal value. The maximum value - * of averages can be ULONG_MAX/(factor*weight). - * @weight: Exponential weight, or decay rate. This defines how fast the - * influence of older values decreases. Has to be bigger than 1. - * - * Initialize the EWMA parameters for a given struct ewma @avg. - */ -void ewma_init(struct ewma *avg, unsigned long factor, unsigned long weight) -{ - WARN_ON(weight <= 1 || factor == 0); - avg->internal = 0; - avg->weight = weight; - avg->factor = factor; -} -EXPORT_SYMBOL_GPL(ewma_init); - -/** - * ewma_add() - Exponentially weighted moving average (EWMA) - * @avg: Average structure - * @val: Current value - * - * Add a sample to the average. - */ -struct ewma *ewma_add(struct ewma *avg, unsigned long val) -{ - avg->internal = avg->internal ? - (((avg->internal * (avg->weight - 1)) + - (val * avg->factor)) / avg->weight) : - (val * avg->factor); - return avg; -} -EXPORT_SYMBOL_GPL(ewma_add); - diff --git a/compat/include/linux/average.h b/compat/include/linux/average.h index ece86ca3a971..fb0f3975bcac 100644 --- a/compat/include/linux/average.h +++ b/compat/include/linux/average.h @@ -2,4 +2,33 @@ #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,37)) #include_next +#else +/* Exponentially weighted moving average (EWMA) */ + +/* For more documentation see lib/average.c */ + +struct ewma { + unsigned long internal; + unsigned long factor; + unsigned long weight; +}; + +#define ewma_init LINUX_BACKPORT(ewma_init) +extern void ewma_init(struct ewma *avg, unsigned long factor, + unsigned long weight); + +#define ewma_add LINUX_BACKPORT(ewma_add) +extern struct ewma *ewma_add(struct ewma *avg, unsigned long val); + +#define ewma_read LINUX_BACKPORT(ewma_read) +/** + * ewma_read() - Get average value + * @avg: Average structure + * + * Returns the average value held in @avg. + */ +static inline unsigned long ewma_read(const struct ewma *avg) +{ + return DIV_ROUND_CLOSEST(avg->internal, avg->factor); +} #endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,37)) */ diff --git a/compat/include/linux/compat-2.6.38.h b/compat/include/linux/compat-2.6.38.h index 58ec64e5675b..4a823108c4d6 100644 --- a/compat/include/linux/compat-2.6.38.h +++ b/compat/include/linux/compat-2.6.38.h @@ -56,35 +56,6 @@ static inline void qdisc_bstats_update(struct Qdisc *sch, #define max_segs max_hw_segs -/* Exponentially weighted moving average (EWMA) */ - -/* For more documentation see lib/average.c */ - -struct ewma { - unsigned long internal; - unsigned long factor; - unsigned long weight; -}; - -#define ewma_init LINUX_BACKPORT(ewma_init) -extern void ewma_init(struct ewma *avg, unsigned long factor, - unsigned long weight); - -#define ewma_add LINUX_BACKPORT(ewma_add) -extern struct ewma *ewma_add(struct ewma *avg, unsigned long val); - -#define ewma_read LINUX_BACKPORT(ewma_read) -/** - * ewma_read() - Get average value - * @avg: Average structure - * - * Returns the average value held in @avg. - */ -static inline unsigned long ewma_read(const struct ewma *avg) -{ - return DIV_ROUND_CLOSEST(avg->internal, avg->factor); -} - #define pr_warn pr_warning #define create_freezable_workqueue create_freezeable_workqueue