ipv6 fib: Make rt6_info{} more cache-line aware.
The head element of rt6_info{} is dst_entry{}, and IPv6 specific elements follow. Because elements at the end of dst_entry{} are frequently updated, it is not good to put frequently-used static elements, such as rt6i_idev, rt6i_dst or rt6i_flags in the same cache line. On the other hand, fib6_table, rt6i_node or rt6i_gateway are rarely used, so it is okay to stay in the same cache line. Let's rearrange rt6_info{}. Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
152102c7f2
commit
bd2c77a0a7
|
@ -88,34 +88,37 @@ struct rt6_info {
|
||||||
struct dst_entry dst;
|
struct dst_entry dst;
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
struct inet6_dev *rt6i_idev;
|
|
||||||
|
|
||||||
#define rt6i_dev u.dst.dev
|
#define rt6i_dev u.dst.dev
|
||||||
#define rt6i_nexthop u.dst.neighbour
|
#define rt6i_nexthop u.dst.neighbour
|
||||||
#define rt6i_expires u.dst.expires
|
#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 fib6_node *rt6i_node;
|
||||||
|
|
||||||
struct in6_addr rt6i_gateway;
|
struct in6_addr rt6i_gateway;
|
||||||
|
|
||||||
u32 rt6i_flags;
|
|
||||||
u32 rt6i_metric;
|
|
||||||
atomic_t rt6i_ref;
|
atomic_t rt6i_ref;
|
||||||
|
|
||||||
/* more non-fragment space at head required */
|
/* These are in a separate cache line. */
|
||||||
unsigned short rt6i_nfheader_len;
|
struct rt6key rt6i_dst ____cacheline_aligned_in_smp;
|
||||||
|
u32 rt6i_flags;
|
||||||
|
struct rt6key rt6i_src;
|
||||||
|
u32 rt6i_metric;
|
||||||
|
|
||||||
u8 rt6i_protocol;
|
struct inet6_dev *rt6i_idev;
|
||||||
|
|
||||||
struct fib6_table *rt6i_table;
|
|
||||||
|
|
||||||
struct rt6key rt6i_dst;
|
|
||||||
|
|
||||||
#ifdef CONFIG_XFRM
|
#ifdef CONFIG_XFRM
|
||||||
u32 rt6i_flow_cache_genid;
|
u32 rt6i_flow_cache_genid;
|
||||||
#endif
|
#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)
|
static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
|
||||||
|
|
Loading…
Reference in New Issue