net dst: need linux/cache.h for ____cacheline_aligned_in_smp.
[pandora-kernel.git] / include / net / dst_ops.h
index d1ff9b7..51665b3 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _NET_DST_OPS_H
 #define _NET_DST_OPS_H
 #include <linux/types.h>
+#include <linux/percpu_counter.h>
+#include <linux/cache.h>
 
 struct dst_entry;
 struct kmem_cachep;
@@ -22,7 +24,41 @@ struct dst_ops {
        void                    (*update_pmtu)(struct dst_entry *dst, u32 mtu);
        int                     (*local_out)(struct sk_buff *skb);
 
-       atomic_t                entries;
        struct kmem_cache       *kmem_cachep;
+
+       struct percpu_counter   pcpuc_entries ____cacheline_aligned_in_smp;
 };
+
+static inline int dst_entries_get_fast(struct dst_ops *dst)
+{
+       return percpu_counter_read_positive(&dst->pcpuc_entries);
+}
+
+static inline int dst_entries_get_slow(struct dst_ops *dst)
+{
+       int res;
+
+       local_bh_disable();
+       res = percpu_counter_sum_positive(&dst->pcpuc_entries);
+       local_bh_enable();
+       return res;
+}
+
+static inline void dst_entries_add(struct dst_ops *dst, int val)
+{
+       local_bh_disable();
+       percpu_counter_add(&dst->pcpuc_entries, val);
+       local_bh_enable();
+}
+
+static inline int dst_entries_init(struct dst_ops *dst)
+{
+       return percpu_counter_init(&dst->pcpuc_entries, 0);
+}
+
+static inline void dst_entries_destroy(struct dst_ops *dst)
+{
+       percpu_counter_destroy(&dst->pcpuc_entries);
+}
+
 #endif