Skip to content

Commit 18fd64d

Browse files
xli98davem330
authored andcommitted
netns-ipv4: reorganize netns_ipv4 fast path variables
Reorganize fast path variables on tx-txrx-rx order. Fastpath cacheline ends after sysctl_tcp_rmem. There are only read-only variables here. (write is on the control path and not considered in this case) Below data generated with pahole on x86 architecture. Fast path variables span cache lines before change: 4 Fast path variables span cache lines after change: 2 Suggested-by: Eric Dumazet <[email protected]> Reviewed-by: Wei Wang <[email protected]> Reviewed-by: David Ahern <[email protected]> Signed-off-by: Coco Li <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Reviewed-by: Shakeel Butt <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent aeb9ce0 commit 18fd64d

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

include/net/netns/ipv4.h

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,38 @@ struct inet_timewait_death_row {
4242
struct tcp_fastopen_context;
4343

4444
struct netns_ipv4 {
45+
/* Cacheline organization can be found documented in
46+
* Documentation/networking/net_cachelines/netns_ipv4_sysctl.rst.
47+
* Please update the document when adding new fields.
48+
*/
49+
50+
/* TX readonly hotpath cache lines */
51+
__cacheline_group_begin(netns_ipv4_read_tx);
52+
u8 sysctl_tcp_early_retrans;
53+
u8 sysctl_tcp_tso_win_divisor;
54+
u8 sysctl_tcp_tso_rtt_log;
55+
u8 sysctl_tcp_autocorking;
56+
int sysctl_tcp_min_snd_mss;
57+
unsigned int sysctl_tcp_notsent_lowat;
58+
int sysctl_tcp_limit_output_bytes;
59+
int sysctl_tcp_min_rtt_wlen;
60+
int sysctl_tcp_wmem[3];
61+
u8 sysctl_ip_fwd_use_pmtu;
62+
__cacheline_group_end(netns_ipv4_read_tx);
63+
64+
/* TXRX readonly hotpath cache lines */
65+
__cacheline_group_begin(netns_ipv4_read_txrx);
66+
u8 sysctl_tcp_moderate_rcvbuf;
67+
__cacheline_group_end(netns_ipv4_read_txrx);
68+
69+
/* RX readonly hotpath cache line */
70+
__cacheline_group_begin(netns_ipv4_read_rx);
71+
u8 sysctl_ip_early_demux;
72+
u8 sysctl_tcp_early_demux;
73+
int sysctl_tcp_reordering;
74+
int sysctl_tcp_rmem[3];
75+
__cacheline_group_end(netns_ipv4_read_rx);
76+
4577
struct inet_timewait_death_row tcp_death_row;
4678
struct udp_table *udp_table;
4779

@@ -96,17 +128,14 @@ struct netns_ipv4 {
96128

97129
u8 sysctl_ip_default_ttl;
98130
u8 sysctl_ip_no_pmtu_disc;
99-
u8 sysctl_ip_fwd_use_pmtu;
100131
u8 sysctl_ip_fwd_update_priority;
101132
u8 sysctl_ip_nonlocal_bind;
102133
u8 sysctl_ip_autobind_reuse;
103134
/* Shall we try to damage output packets if routing dev changes? */
104135
u8 sysctl_ip_dynaddr;
105-
u8 sysctl_ip_early_demux;
106136
#ifdef CONFIG_NET_L3_MASTER_DEV
107137
u8 sysctl_raw_l3mdev_accept;
108138
#endif
109-
u8 sysctl_tcp_early_demux;
110139
u8 sysctl_udp_early_demux;
111140

112141
u8 sysctl_nexthop_compat_mode;
@@ -119,7 +148,6 @@ struct netns_ipv4 {
119148
u8 sysctl_tcp_mtu_probing;
120149
int sysctl_tcp_mtu_probe_floor;
121150
int sysctl_tcp_base_mss;
122-
int sysctl_tcp_min_snd_mss;
123151
int sysctl_tcp_probe_threshold;
124152
u32 sysctl_tcp_probe_interval;
125153

@@ -135,17 +163,14 @@ struct netns_ipv4 {
135163
u8 sysctl_tcp_backlog_ack_defer;
136164
u8 sysctl_tcp_pingpong_thresh;
137165

138-
int sysctl_tcp_reordering;
139166
u8 sysctl_tcp_retries1;
140167
u8 sysctl_tcp_retries2;
141168
u8 sysctl_tcp_orphan_retries;
142169
u8 sysctl_tcp_tw_reuse;
143170
int sysctl_tcp_fin_timeout;
144-
unsigned int sysctl_tcp_notsent_lowat;
145171
u8 sysctl_tcp_sack;
146172
u8 sysctl_tcp_window_scaling;
147173
u8 sysctl_tcp_timestamps;
148-
u8 sysctl_tcp_early_retrans;
149174
u8 sysctl_tcp_recovery;
150175
u8 sysctl_tcp_thin_linear_timeouts;
151176
u8 sysctl_tcp_slow_start_after_idle;
@@ -161,21 +186,13 @@ struct netns_ipv4 {
161186
u8 sysctl_tcp_frto;
162187
u8 sysctl_tcp_nometrics_save;
163188
u8 sysctl_tcp_no_ssthresh_metrics_save;
164-
u8 sysctl_tcp_moderate_rcvbuf;
165-
u8 sysctl_tcp_tso_win_divisor;
166189
u8 sysctl_tcp_workaround_signed_windows;
167-
int sysctl_tcp_limit_output_bytes;
168190
int sysctl_tcp_challenge_ack_limit;
169-
int sysctl_tcp_min_rtt_wlen;
170191
u8 sysctl_tcp_min_tso_segs;
171-
u8 sysctl_tcp_tso_rtt_log;
172-
u8 sysctl_tcp_autocorking;
173192
u8 sysctl_tcp_reflect_tos;
174193
int sysctl_tcp_invalid_ratelimit;
175194
int sysctl_tcp_pacing_ss_ratio;
176195
int sysctl_tcp_pacing_ca_ratio;
177-
int sysctl_tcp_wmem[3];
178-
int sysctl_tcp_rmem[3];
179196
unsigned int sysctl_tcp_child_ehash_entries;
180197
unsigned long sysctl_tcp_comp_sack_delay_ns;
181198
unsigned long sysctl_tcp_comp_sack_slack_ns;

net/core/net_namespace.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,11 +1099,56 @@ static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid,
10991099
rtnl_set_sk_err(net, RTNLGRP_NSID, err);
11001100
}
11011101

1102+
#ifdef CONFIG_NET_NS
1103+
static void __init netns_ipv4_struct_check(void)
1104+
{
1105+
/* TX readonly hotpath cache lines */
1106+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1107+
sysctl_tcp_early_retrans);
1108+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1109+
sysctl_tcp_tso_win_divisor);
1110+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1111+
sysctl_tcp_tso_rtt_log);
1112+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1113+
sysctl_tcp_autocorking);
1114+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1115+
sysctl_tcp_min_snd_mss);
1116+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1117+
sysctl_tcp_notsent_lowat);
1118+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1119+
sysctl_tcp_limit_output_bytes);
1120+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1121+
sysctl_tcp_min_rtt_wlen);
1122+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1123+
sysctl_tcp_wmem);
1124+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_tx,
1125+
sysctl_ip_fwd_use_pmtu);
1126+
CACHELINE_ASSERT_GROUP_SIZE(struct netns_ipv4, netns_ipv4_read_tx, 33);
1127+
1128+
/* TXRX readonly hotpath cache lines */
1129+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_txrx,
1130+
sysctl_tcp_moderate_rcvbuf);
1131+
CACHELINE_ASSERT_GROUP_SIZE(struct netns_ipv4, netns_ipv4_read_txrx, 1);
1132+
1133+
/* RX readonly hotpath cache line */
1134+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_rx,
1135+
sysctl_ip_early_demux);
1136+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_rx,
1137+
sysctl_tcp_early_demux);
1138+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_rx,
1139+
sysctl_tcp_reordering);
1140+
CACHELINE_ASSERT_GROUP_MEMBER(struct netns_ipv4, netns_ipv4_read_rx,
1141+
sysctl_tcp_rmem);
1142+
CACHELINE_ASSERT_GROUP_SIZE(struct netns_ipv4, netns_ipv4_read_rx, 18);
1143+
}
1144+
#endif
1145+
11021146
void __init net_ns_init(void)
11031147
{
11041148
struct net_generic *ng;
11051149

11061150
#ifdef CONFIG_NET_NS
1151+
netns_ipv4_struct_check();
11071152
net_cachep = kmem_cache_create("net_namespace", sizeof(struct net),
11081153
SMP_CACHE_BYTES,
11091154
SLAB_PANIC|SLAB_ACCOUNT, NULL);

0 commit comments

Comments
 (0)