diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-23 14:47:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-23 14:47:02 -0400 |
commit | 5f05647dd81c11a6a165ccc8f0c1370b16f3bcb0 (patch) | |
tree | 7851ef1c93aa1aba7ef327ca4b75fd35e6d10f29 /include/net/dst_ops.h | |
parent | 02f36038c568111ad4fc433f6fa760ff5e38fab4 (diff) | |
parent | ec37a48d1d16c30b655ac5280209edf52a6775d4 (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: (1699 commits)
bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
vlan: Calling vlan_hwaccel_do_receive() is always valid.
tproxy: use the interface primary IP address as a default value for --on-ip
tproxy: added IPv6 support to the socket match
cxgb3: function namespace cleanup
tproxy: added IPv6 support to the TPROXY target
tproxy: added IPv6 socket lookup function to nf_tproxy_core
be2net: Changes to use only priority codes allowed by f/w
tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
tproxy: added tproxy sockopt interface in the IPV6 layer
tproxy: added udp6_lib_lookup function
tproxy: added const specifiers to udp lookup functions
tproxy: split off ipv6 defragmentation to a separate module
l2tp: small cleanup
nf_nat: restrict ICMP translation for embedded header
can: mcp251x: fix generation of error frames
can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
can-raw: add msg_flags to distinguish local traffic
9p: client code cleanup
rds: make local functions/variables static
...
Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
drivers/net/wireless/ath/ath9k/debug.c as per David
Diffstat (limited to 'include/net/dst_ops.h')
-rw-r--r-- | include/net/dst_ops.h | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index d1ff9b7e99b8..1fa5306e3e23 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _NET_DST_OPS_H | 1 | #ifndef _NET_DST_OPS_H |
2 | #define _NET_DST_OPS_H | 2 | #define _NET_DST_OPS_H |
3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
4 | #include <linux/percpu_counter.h> | ||
4 | 5 | ||
5 | struct dst_entry; | 6 | struct dst_entry; |
6 | struct kmem_cachep; | 7 | struct kmem_cachep; |
@@ -22,7 +23,41 @@ struct dst_ops { | |||
22 | void (*update_pmtu)(struct dst_entry *dst, u32 mtu); | 23 | void (*update_pmtu)(struct dst_entry *dst, u32 mtu); |
23 | int (*local_out)(struct sk_buff *skb); | 24 | int (*local_out)(struct sk_buff *skb); |
24 | 25 | ||
25 | atomic_t entries; | ||
26 | struct kmem_cache *kmem_cachep; | 26 | struct kmem_cache *kmem_cachep; |
27 | |||
28 | struct percpu_counter pcpuc_entries ____cacheline_aligned_in_smp; | ||
27 | }; | 29 | }; |
30 | |||
31 | static inline int dst_entries_get_fast(struct dst_ops *dst) | ||
32 | { | ||
33 | return percpu_counter_read_positive(&dst->pcpuc_entries); | ||
34 | } | ||
35 | |||
36 | static inline int dst_entries_get_slow(struct dst_ops *dst) | ||
37 | { | ||
38 | int res; | ||
39 | |||
40 | local_bh_disable(); | ||
41 | res = percpu_counter_sum_positive(&dst->pcpuc_entries); | ||
42 | local_bh_enable(); | ||
43 | return res; | ||
44 | } | ||
45 | |||
46 | static inline void dst_entries_add(struct dst_ops *dst, int val) | ||
47 | { | ||
48 | local_bh_disable(); | ||
49 | percpu_counter_add(&dst->pcpuc_entries, val); | ||
50 | local_bh_enable(); | ||
51 | } | ||
52 | |||
53 | static inline int dst_entries_init(struct dst_ops *dst) | ||
54 | { | ||
55 | return percpu_counter_init(&dst->pcpuc_entries, 0); | ||
56 | } | ||
57 | |||
58 | static inline void dst_entries_destroy(struct dst_ops *dst) | ||
59 | { | ||
60 | percpu_counter_destroy(&dst->pcpuc_entries); | ||
61 | } | ||
62 | |||
28 | #endif | 63 | #endif |