diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-06 15:30:19 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-06 15:30:19 -0500 |
commit | abb359450f20c32ae03039d8736f12b1d561caf5 (patch) | |
tree | 6e8723885feb66a138f19f0ff31615dc13a8d859 /lib | |
parent | cb600d2f83c854ec3d6660063e4466431999489b (diff) | |
parent | 4e3dbdb1392a83bd21a6ff8f6bc785495058d37c (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1436 commits)
cassini: Use local-mac-address prom property for Cassini MAC address
net: remove the duplicate #ifdef __KERNEL__
net: bridge: check the length of skb after nf_bridge_maybe_copy_header()
netconsole: clarify stopping message
netconsole: don't announce stopping if nothing happened
cnic: Fix the type field in SPQ messages
netfilter: fix export secctx error handling
netfilter: fix the race when initializing nf_ct_expect_hash_rnd
ipv4: IP defragmentation must be ECN aware
net: r6040: Return proper error for r6040_init_one
dcb: use after free in dcb_flushapp()
dcb: unlock on error in dcbnl_ieee_get()
net: ixp4xx_eth: Return proper error for eth_init_one
include/linux/if_ether.h: Add #define ETH_P_LINK_CTL for HPNA and wlan local tunnel
net: add POLLPRI to sock_def_readable()
af_unix: Avoid socket->sk NULL OOPS in stream connect security hooks.
net_sched: pfifo_head_drop problem
mac80211: remove stray extern
mac80211: implement off-channel TX using hw r-o-c offload
mac80211: implement hardware offload for remain-on-channel
...
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig | 3 | ||||
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/average.c | 61 | ||||
-rw-r--r-- | lib/nlattr.c | 22 |
4 files changed, 77 insertions, 11 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index fa9bf2c0619..3116aa631af 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
@@ -210,4 +210,7 @@ config GENERIC_ATOMIC64 | |||
210 | config LRU_CACHE | 210 | config LRU_CACHE |
211 | tristate | 211 | tristate |
212 | 212 | ||
213 | config AVERAGE | ||
214 | bool | ||
215 | |||
213 | endmenu | 216 | endmenu |
diff --git a/lib/Makefile b/lib/Makefile index 9e2db72d128..d7b6e30a3a1 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -106,6 +106,8 @@ obj-$(CONFIG_GENERIC_ATOMIC64) += atomic64.o | |||
106 | 106 | ||
107 | obj-$(CONFIG_ATOMIC64_SELFTEST) += atomic64_test.o | 107 | obj-$(CONFIG_ATOMIC64_SELFTEST) += atomic64_test.o |
108 | 108 | ||
109 | obj-$(CONFIG_AVERAGE) += average.o | ||
110 | |||
109 | hostprogs-y := gen_crc32table | 111 | hostprogs-y := gen_crc32table |
110 | clean-files := crc32table.h | 112 | clean-files := crc32table.h |
111 | 113 | ||
diff --git a/lib/average.c b/lib/average.c new file mode 100644 index 00000000000..5576c284149 --- /dev/null +++ b/lib/average.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * lib/average.c | ||
3 | * | ||
4 | * This source code is licensed under the GNU General Public License, | ||
5 | * Version 2. See the file COPYING for more details. | ||
6 | */ | ||
7 | |||
8 | #include <linux/module.h> | ||
9 | #include <linux/average.h> | ||
10 | #include <linux/bug.h> | ||
11 | #include <linux/log2.h> | ||
12 | |||
13 | /** | ||
14 | * DOC: Exponentially Weighted Moving Average (EWMA) | ||
15 | * | ||
16 | * These are generic functions for calculating Exponentially Weighted Moving | ||
17 | * Averages (EWMA). We keep a structure with the EWMA parameters and a scaled | ||
18 | * up internal representation of the average value to prevent rounding errors. | ||
19 | * The factor for scaling up and the exponential weight (or decay rate) have to | ||
20 | * be specified thru the init fuction. The structure should not be accessed | ||
21 | * directly but only thru the helper functions. | ||
22 | */ | ||
23 | |||
24 | /** | ||
25 | * ewma_init() - Initialize EWMA parameters | ||
26 | * @avg: Average structure | ||
27 | * @factor: Factor to use for the scaled up internal value. The maximum value | ||
28 | * of averages can be ULONG_MAX/(factor*weight). For performance reasons | ||
29 | * factor has to be a power of 2. | ||
30 | * @weight: Exponential weight, or decay rate. This defines how fast the | ||
31 | * influence of older values decreases. For performance reasons weight has | ||
32 | * to be a power of 2. | ||
33 | * | ||
34 | * Initialize the EWMA parameters for a given struct ewma @avg. | ||
35 | */ | ||
36 | void ewma_init(struct ewma *avg, unsigned long factor, unsigned long weight) | ||
37 | { | ||
38 | WARN_ON(!is_power_of_2(weight) || !is_power_of_2(factor)); | ||
39 | |||
40 | avg->weight = ilog2(weight); | ||
41 | avg->factor = ilog2(factor); | ||
42 | avg->internal = 0; | ||
43 | } | ||
44 | EXPORT_SYMBOL(ewma_init); | ||
45 | |||
46 | /** | ||
47 | * ewma_add() - Exponentially weighted moving average (EWMA) | ||
48 | * @avg: Average structure | ||
49 | * @val: Current value | ||
50 | * | ||
51 | * Add a sample to the average. | ||
52 | */ | ||
53 | struct ewma *ewma_add(struct ewma *avg, unsigned long val) | ||
54 | { | ||
55 | avg->internal = avg->internal ? | ||
56 | (((avg->internal << avg->weight) - avg->internal) + | ||
57 | (val << avg->factor)) >> avg->weight : | ||
58 | (val << avg->factor); | ||
59 | return avg; | ||
60 | } | ||
61 | EXPORT_SYMBOL(ewma_add); | ||
diff --git a/lib/nlattr.c b/lib/nlattr.c index c4706eb98d3..00e8a02681a 100644 --- a/lib/nlattr.c +++ b/lib/nlattr.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/types.h> | 15 | #include <linux/types.h> |
16 | #include <net/netlink.h> | 16 | #include <net/netlink.h> |
17 | 17 | ||
18 | static u16 nla_attr_minlen[NLA_TYPE_MAX+1] __read_mostly = { | 18 | static const u16 nla_attr_minlen[NLA_TYPE_MAX+1] = { |
19 | [NLA_U8] = sizeof(u8), | 19 | [NLA_U8] = sizeof(u8), |
20 | [NLA_U16] = sizeof(u16), | 20 | [NLA_U16] = sizeof(u16), |
21 | [NLA_U32] = sizeof(u32), | 21 | [NLA_U32] = sizeof(u32), |
@@ -23,7 +23,7 @@ static u16 nla_attr_minlen[NLA_TYPE_MAX+1] __read_mostly = { | |||
23 | [NLA_NESTED] = NLA_HDRLEN, | 23 | [NLA_NESTED] = NLA_HDRLEN, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | static int validate_nla(struct nlattr *nla, int maxtype, | 26 | static int validate_nla(const struct nlattr *nla, int maxtype, |
27 | const struct nla_policy *policy) | 27 | const struct nla_policy *policy) |
28 | { | 28 | { |
29 | const struct nla_policy *pt; | 29 | const struct nla_policy *pt; |
@@ -115,10 +115,10 @@ static int validate_nla(struct nlattr *nla, int maxtype, | |||
115 | * | 115 | * |
116 | * Returns 0 on success or a negative error code. | 116 | * Returns 0 on success or a negative error code. |
117 | */ | 117 | */ |
118 | int nla_validate(struct nlattr *head, int len, int maxtype, | 118 | int nla_validate(const struct nlattr *head, int len, int maxtype, |
119 | const struct nla_policy *policy) | 119 | const struct nla_policy *policy) |
120 | { | 120 | { |
121 | struct nlattr *nla; | 121 | const struct nlattr *nla; |
122 | int rem, err; | 122 | int rem, err; |
123 | 123 | ||
124 | nla_for_each_attr(nla, head, len, rem) { | 124 | nla_for_each_attr(nla, head, len, rem) { |
@@ -173,10 +173,10 @@ nla_policy_len(const struct nla_policy *p, int n) | |||
173 | * | 173 | * |
174 | * Returns 0 on success or a negative error code. | 174 | * Returns 0 on success or a negative error code. |
175 | */ | 175 | */ |
176 | int nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, int len, | 176 | int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head, |
177 | const struct nla_policy *policy) | 177 | int len, const struct nla_policy *policy) |
178 | { | 178 | { |
179 | struct nlattr *nla; | 179 | const struct nlattr *nla; |
180 | int rem, err; | 180 | int rem, err; |
181 | 181 | ||
182 | memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); | 182 | memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); |
@@ -191,7 +191,7 @@ int nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, int len, | |||
191 | goto errout; | 191 | goto errout; |
192 | } | 192 | } |
193 | 193 | ||
194 | tb[type] = nla; | 194 | tb[type] = (struct nlattr *)nla; |
195 | } | 195 | } |
196 | } | 196 | } |
197 | 197 | ||
@@ -212,14 +212,14 @@ errout: | |||
212 | * | 212 | * |
213 | * Returns the first attribute in the stream matching the specified type. | 213 | * Returns the first attribute in the stream matching the specified type. |
214 | */ | 214 | */ |
215 | struct nlattr *nla_find(struct nlattr *head, int len, int attrtype) | 215 | struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype) |
216 | { | 216 | { |
217 | struct nlattr *nla; | 217 | const struct nlattr *nla; |
218 | int rem; | 218 | int rem; |
219 | 219 | ||
220 | nla_for_each_attr(nla, head, len, rem) | 220 | nla_for_each_attr(nla, head, len, rem) |
221 | if (nla_type(nla) == attrtype) | 221 | if (nla_type(nla) == attrtype) |
222 | return nla; | 222 | return (struct nlattr *)nla; |
223 | 223 | ||
224 | return NULL; | 224 | return NULL; |
225 | } | 225 | } |