Commit a37e6e344910a43b9ebc2bbf29a029f5ea942598
Committed by
David S. Miller
1 parent
0c03eca3d9
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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>
Showing 2 changed files with 10 additions and 2 deletions Side-by-side Diff
include/net/dst.h
... | ... | @@ -110,7 +110,7 @@ |
110 | 110 | }; |
111 | 111 | |
112 | 112 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); |
113 | -extern const u32 dst_default_metrics[RTAX_MAX]; | |
113 | +extern const u32 dst_default_metrics[]; | |
114 | 114 | |
115 | 115 | #define DST_METRICS_READ_ONLY 0x1UL |
116 | 116 | #define __DST_METRICS_PTR(Y) \ |
net/core/dst.c
... | ... | @@ -149,7 +149,15 @@ |
149 | 149 | } |
150 | 150 | EXPORT_SYMBOL(dst_discard); |
151 | 151 | |
152 | -const u32 dst_default_metrics[RTAX_MAX]; | |
152 | +const u32 dst_default_metrics[RTAX_MAX + 1] = { | |
153 | + /* This initializer is needed to force linker to place this variable | |
154 | + * into const section. Otherwise it might end into bss section. | |
155 | + * We really want to avoid false sharing on this variable, and catch | |
156 | + * any writes on it. | |
157 | + */ | |
158 | + [RTAX_MAX] = 0xdeadbeef, | |
159 | +}; | |
160 | + | |
153 | 161 | |
154 | 162 | void *dst_alloc(struct dst_ops *ops, struct net_device *dev, |
155 | 163 | int initial_ref, int initial_obsolete, unsigned short flags) |