]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/net/dst.h
[NET]: uninline dst_release
[linux-2.6-omap-h63xx.git] / include / net / dst.h
index 7a0b1bde8e28387663b3e22ff1e73855f3a7d199..002500e631f5a96787f035ade4a6c255aad74713 100644 (file)
@@ -52,11 +52,10 @@ struct dst_entry
        unsigned short          header_len;     /* more space at head required */
        unsigned short          trailer_len;    /* space to reserve at tail */
 
-       u32                     metrics[RTAX_MAX];
-       struct dst_entry        *path;
-
+       unsigned int            rate_tokens;
        unsigned long           rate_last;      /* rate limiting for ICMP */
-       unsigned long           rate_tokens;
+
+       struct dst_entry        *path;
 
        struct neighbour        *neighbour;
        struct hh_cache         *hh;
@@ -65,22 +64,27 @@ struct dst_entry
        int                     (*input)(struct sk_buff*);
        int                     (*output)(struct sk_buff*);
 
+       struct  dst_ops         *ops;
+
+       u32                     metrics[RTAX_MAX];
+
 #ifdef CONFIG_NET_CLS_ROUTE
        __u32                   tclassid;
 #endif
 
-       struct  dst_ops         *ops;
-               
-       unsigned long           lastuse;
+       /*
+        * __refcnt wants to be on a different cache line from
+        * input/output/ops or performance tanks badly
+        */
        atomic_t                __refcnt;       /* client references    */
        int                     __use;
+       unsigned long           lastuse;
        union {
                struct dst_entry *next;
                struct rtable    *rt_next;
                struct rt6_info   *rt6_next;
                struct dn_route  *dn_next;
        };
-       char                    info[0];
 };
 
 
@@ -90,7 +94,7 @@ struct dst_ops
        __be16                  protocol;
        unsigned                gc_thresh;
 
-       int                     (*gc)(void);
+       int                     (*gc)(struct dst_ops *ops);
        struct dst_entry *      (*check)(struct dst_entry *, __u32 cookie);
        void                    (*destroy)(struct dst_entry *);
        void                    (*ifdown)(struct dst_entry *,
@@ -98,10 +102,12 @@ struct dst_ops
        struct dst_entry *      (*negative_advice)(struct dst_entry *);
        void                    (*link_failure)(struct sk_buff *);
        void                    (*update_pmtu)(struct dst_entry *dst, u32 mtu);
+       int                     (*local_out)(struct sk_buff *skb);
        int                     entry_size;
 
        atomic_t                entries;
        struct kmem_cache               *kmem_cachep;
+       struct net              *dst_net;
 };
 
 #ifdef __KERNEL__
@@ -157,15 +163,7 @@ struct dst_entry * dst_clone(struct dst_entry * dst)
        return dst;
 }
 
-static inline
-void dst_release(struct dst_entry * dst)
-{
-       if (dst) {
-               WARN_ON(atomic_read(&dst->__refcnt) < 1);
-               smp_mb__before_atomic_dec();
-               atomic_dec(&dst->__refcnt);
-       }
-}
+extern void dst_release(struct dst_entry *dst);
 
 /* Children define the path of the packet through the
  * Linux networking.  Thus, destinations are stackable.
@@ -264,6 +262,12 @@ static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie)
 
 extern void            dst_init(void);
 
+/* Flags for xfrm_lookup flags argument. */
+enum {
+       XFRM_LOOKUP_WAIT = 1 << 0,
+       XFRM_LOOKUP_ICMP = 1 << 1,
+};
+
 struct flowi;
 #ifndef CONFIG_XFRM
 static inline int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,