diff options
Diffstat (limited to 'include/net/ip6_fib.h')
| -rw-r--r-- | include/net/ip6_fib.h | 29 | 
1 files changed, 16 insertions, 13 deletions
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 86f46c49e31..4b1dc1161c3 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -88,34 +88,37 @@ struct rt6_info {  		struct dst_entry	dst;  	} u; -	struct inet6_dev		*rt6i_idev; -  #define rt6i_dev			u.dst.dev  #define rt6i_nexthop			u.dst.neighbour  #define rt6i_expires			u.dst.expires +	/* +	 * Tail elements of dst_entry (__refcnt etc.) +	 * and these elements (rarely used in hot path) are in +	 * the same cache line. +	 */ +	struct fib6_table		*rt6i_table;  	struct fib6_node		*rt6i_node;  	struct in6_addr			rt6i_gateway; -	 -	u32				rt6i_flags; -	u32				rt6i_metric; -	atomic_t			rt6i_ref; -	/* more non-fragment space at head required */ -	unsigned short			rt6i_nfheader_len; - -	u8				rt6i_protocol; +	atomic_t			rt6i_ref; -	struct fib6_table		*rt6i_table; +	/* These are in a separate cache line. */ +	struct rt6key			rt6i_dst ____cacheline_aligned_in_smp; +	u32				rt6i_flags; +	struct rt6key			rt6i_src; +	u32				rt6i_metric; -	struct rt6key			rt6i_dst; +	struct inet6_dev		*rt6i_idev;  #ifdef CONFIG_XFRM  	u32				rt6i_flow_cache_genid;  #endif +	/* more non-fragment space at head required */ +	unsigned short			rt6i_nfheader_len; -	struct rt6key			rt6i_src; +	u8				rt6i_protocol;  };  static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)  |