|
@@ -61,6 +61,8 @@ struct dst_entry
|
|
|
struct hh_cache *hh;
|
|
|
#ifdef CONFIG_XFRM
|
|
|
struct xfrm_state *xfrm;
|
|
|
+#else
|
|
|
+ void *__pad1;
|
|
|
#endif
|
|
|
int (*input)(struct sk_buff*);
|
|
|
int (*output)(struct sk_buff*);
|
|
@@ -71,8 +73,20 @@ struct dst_entry
|
|
|
|
|
|
#ifdef CONFIG_NET_CLS_ROUTE
|
|
|
__u32 tclassid;
|
|
|
+#else
|
|
|
+ __u32 __pad2;
|
|
|
#endif
|
|
|
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Align __refcnt to a 64 bytes alignment
|
|
|
+ * (L1_CACHE_SIZE would be too much)
|
|
|
+ */
|
|
|
+#ifdef CONFIG_64BIT
|
|
|
+ long __pad_to_align_refcnt[2];
|
|
|
+#else
|
|
|
+ long __pad_to_align_refcnt[1];
|
|
|
+#endif
|
|
|
/*
|
|
|
* __refcnt wants to be on a different cache line from
|
|
|
* input/output/ops or performance tanks badly
|
|
@@ -157,6 +171,11 @@ dst_metric_locked(struct dst_entry *dst, int metric)
|
|
|
|
|
|
static inline void dst_hold(struct dst_entry * dst)
|
|
|
{
|
|
|
+ /*
|
|
|
+ * If your kernel compilation stops here, please check
|
|
|
+ * __pad_to_align_refcnt declaration in struct dst_entry
|
|
|
+ */
|
|
|
+ BUILD_BUG_ON(offsetof(struct dst_entry, __refcnt) & 63);
|
|
|
atomic_inc(&dst->__refcnt);
|
|
|
}
|
|
|
|