net: force dst_default_metrics to const section
While investigating on network performance problems, I found this little gem : $ nm -v vmlinux | grep -1 dst_default_metrics ffffffff82736540 b busy.46605 ffffffff82736560 B dst_default_metrics ffffffff82736598 b dst_busy_list Apparently, declaring a const array without initializer put it in (writeable) bss section, in middle of possibly often dirtied cache lines. Since we really want dst_default_metrics be const to avoid any possible false sharing and catch any buggy writes, I force a null initializer. ffffffff818a4c20 R dst_default_metrics Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0c03eca3d9
commit
a37e6e3449
|
@ -110,7 +110,7 @@ struct dst_entry {
|
|||
};
|
||||
|
||||
extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
|
||||
extern const u32 dst_default_metrics[RTAX_MAX];
|
||||
extern const u32 dst_default_metrics[];
|
||||
|
||||
#define DST_METRICS_READ_ONLY 0x1UL
|
||||
#define __DST_METRICS_PTR(Y) \
|
||||
|
|
|
@ -149,7 +149,15 @@ int dst_discard(struct sk_buff *skb)
|
|||
}
|
||||
EXPORT_SYMBOL(dst_discard);
|
||||
|
||||
const u32 dst_default_metrics[RTAX_MAX];
|
||||
const u32 dst_default_metrics[RTAX_MAX + 1] = {
|
||||
/* This initializer is needed to force linker to place this variable
|
||||
* into const section. Otherwise it might end into bss section.
|
||||
* We really want to avoid false sharing on this variable, and catch
|
||||
* any writes on it.
|
||||
*/
|
||||
[RTAX_MAX] = 0xdeadbeef,
|
||||
};
|
||||
|
||||
|
||||
void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
|
||||
int initial_ref, int initial_obsolete, unsigned short flags)
|
||||
|
|
Loading…
Reference in New Issue