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 |
