diff options
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 |