Commit bd2c77a0 authored by YOSHIFUJI Hideaki / 吉藤英明's avatar YOSHIFUJI Hideaki / 吉藤英明 Committed by David S. Miller

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: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 152102c7
...@@ -88,34 +88,37 @@ struct rt6_info { ...@@ -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;
/* more non-fragment space at head required */ atomic_t rt6i_ref;
unsigned short rt6i_nfheader_len;
u8 rt6i_protocol;
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 #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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment