route: fix breakage after moving lwtunnel state
authorJiri Benc <jbenc@redhat.com>
Fri, 21 Aug 2015 10:41:14 +0000 (12:41 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 23 Aug 2015 23:51:17 +0000 (16:51 -0700)
__recnt and related fields need to be in its own cacheline for performance
reasons. Commit 61adedf3e3f1 ("route: move lwtunnel state to dst_entry")
broke that on 32bit archs, causing BUILD_BUG_ON in dst_hold to be triggered.

This patch fixes the breakage by moving the lwtunnel state to the end of
dst_entry on 32bit archs. Unfortunately, this makes it share the cacheline
with __refcnt and may affect performance, thus further patches may be
needed.

Reported-by: kbuild test robot <fengguang.wu@intel.com>
Fixes: 61adedf3e3f1 ("route: move lwtunnel state to dst_entry")
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dst.h

index 0a9a723f6c19ba28a268c0885c5a0b186bf45a4d..ef8f1d43a2033bc67ab3c8f3b08657191463654e 100644 (file)
@@ -44,7 +44,6 @@ struct dst_entry {
 #else
        void                    *__pad1;
 #endif
-       struct lwtunnel_state   *lwtstate;
        int                     (*input)(struct sk_buff *);
        int                     (*output)(struct sock *sk, struct sk_buff *skb);
 
@@ -85,11 +84,12 @@ struct dst_entry {
        __u32                   __pad2;
 #endif
 
+#ifdef CONFIG_64BIT
+       struct lwtunnel_state   *lwtstate;
        /*
         * Align __refcnt to a 64 bytes alignment
         * (L1_CACHE_SIZE would be too much)
         */
-#ifdef CONFIG_64BIT
        long                    __pad_to_align_refcnt[1];
 #endif
        /*
@@ -99,6 +99,9 @@ struct dst_entry {
        atomic_t                __refcnt;       /* client references    */
        int                     __use;
        unsigned long           lastuse;
+#ifndef CONFIG_64BIT
+       struct lwtunnel_state   *lwtstate;
+#endif
        union {
                struct dst_entry        *next;
                struct rtable __rcu     *rt_next;