Blame view

net/core/sysctl_net_core.c 5.75 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /* -*- linux-c -*-
   * sysctl_net_core.c: sysctl interface to net core subsystem.
   *
   * Begun April 1, 1996, Mike Shaver.
   * Added /proc/sys/net/core directory entry (empty =) ). [MS]
   */
  
  #include <linux/mm.h>
  #include <linux/sysctl.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
  #include <linux/module.h>
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
11
  #include <linux/socket.h>
a37ae4086   Pavel Emelyanov   [NET]: Don't decl...
12
  #include <linux/netdevice.h>
3fff4c42b   Ingo Molnar   printk: Remove ra...
13
  #include <linux/ratelimit.h>
fec5e652e   Tom Herbert   rfs: Receive Flow...
14
  #include <linux/vmalloc.h>
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
15
  #include <linux/init.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
16
  #include <linux/slab.h>
7426a5645   Shan Wei   net: fix compile ...
17
  #include <linux/kmemleak.h>
3fff4c42b   Ingo Molnar   printk: Remove ra...
18

63d819cae   Hannes Eder   sysctl: fix spars...
19
  #include <net/ip.h>
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
20
  #include <net/sock.h>
c5c177b4a   David S. Miller   net: Kill ratelim...
21
  #include <net/net_ratelimit.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22

4691236ce   Roman Gushchin   net: check net.co...
23
  static int zero = 0;
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
24
  static int one = 1;
4691236ce   Roman Gushchin   net: check net.co...
25
  static int ushort_max = USHRT_MAX;
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
26

fec5e652e   Tom Herbert   rfs: Receive Flow...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  #ifdef CONFIG_RPS
  static int rps_sock_flow_sysctl(ctl_table *table, int write,
  				void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	unsigned int orig_size, size;
  	int ret, i;
  	ctl_table tmp = {
  		.data = &size,
  		.maxlen = sizeof(size),
  		.mode = table->mode
  	};
  	struct rps_sock_flow_table *orig_sock_table, *sock_table;
  	static DEFINE_MUTEX(sock_flow_mutex);
  
  	mutex_lock(&sock_flow_mutex);
6e3f7faf3   Eric Dumazet   rps: add __rcu an...
42
43
  	orig_sock_table = rcu_dereference_protected(rps_sock_flow_table,
  					lockdep_is_held(&sock_flow_mutex));
fec5e652e   Tom Herbert   rfs: Receive Flow...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  	size = orig_size = orig_sock_table ? orig_sock_table->mask + 1 : 0;
  
  	ret = proc_dointvec(&tmp, write, buffer, lenp, ppos);
  
  	if (write) {
  		if (size) {
  			if (size > 1<<30) {
  				/* Enforce limit to prevent overflow */
  				mutex_unlock(&sock_flow_mutex);
  				return -EINVAL;
  			}
  			size = roundup_pow_of_two(size);
  			if (size != orig_size) {
  				sock_table =
  				    vmalloc(RPS_SOCK_FLOW_TABLE_SIZE(size));
  				if (!sock_table) {
  					mutex_unlock(&sock_flow_mutex);
  					return -ENOMEM;
  				}
  
  				sock_table->mask = size - 1;
  			} else
  				sock_table = orig_sock_table;
  
  			for (i = 0; i < size; i++)
  				sock_table->ents[i] = RPS_NO_CPU;
  		} else
  			sock_table = NULL;
  
  		if (sock_table != orig_sock_table) {
  			rcu_assign_pointer(rps_sock_flow_table, sock_table);
adc9300e7   Eric Dumazet   net: use jump_lab...
75
  			if (sock_table)
c5905afb0   Ingo Molnar   static keys: Intr...
76
  				static_key_slow_inc(&rps_needed);
adc9300e7   Eric Dumazet   net: use jump_lab...
77
  			if (orig_sock_table) {
c5905afb0   Ingo Molnar   static keys: Intr...
78
  				static_key_slow_dec(&rps_needed);
adc9300e7   Eric Dumazet   net: use jump_lab...
79
80
81
  				synchronize_rcu();
  				vfree(orig_sock_table);
  			}
fec5e652e   Tom Herbert   rfs: Receive Flow...
82
83
84
85
86
87
88
89
  		}
  	}
  
  	mutex_unlock(&sock_flow_mutex);
  
  	return ret;
  }
  #endif /* CONFIG_RPS */
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
90
  static struct ctl_table net_core_table[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
  #ifdef CONFIG_NET
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
  		.procname	= "wmem_max",
  		.data		= &sysctl_wmem_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
97
98
  		.proc_handler	= proc_dointvec_minmax,
  		.extra1		= &one,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
  		.procname	= "rmem_max",
  		.data		= &sysctl_rmem_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
105
106
  		.proc_handler	= proc_dointvec_minmax,
  		.extra1		= &one,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
  		.procname	= "wmem_default",
  		.data		= &sysctl_wmem_default,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
113
114
  		.proc_handler	= proc_dointvec_minmax,
  		.extra1		= &one,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
  		.procname	= "rmem_default",
  		.data		= &sysctl_rmem_default,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
cdda88912   bingtian.ly@taobao.com   net: avoid to han...
121
122
  		.proc_handler	= proc_dointvec_minmax,
  		.extra1		= &one,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
  		.procname	= "dev_weight",
  		.data		= &weight_p,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
129
  		.proc_handler	= proc_dointvec
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
134
135
  		.procname	= "netdev_max_backlog",
  		.data		= &netdev_max_backlog,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
136
  		.proc_handler	= proc_dointvec
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  	},
0a14842f5   Eric Dumazet   net: filter: Just...
138
139
140
141
142
143
144
145
146
  #ifdef CONFIG_BPF_JIT
  	{
  		.procname	= "bpf_jit_enable",
  		.data		= &bpf_jit_enable,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  	{
3b098e2d7   Eric Dumazet   net: Consistent s...
148
149
150
151
152
153
154
  		.procname	= "netdev_tstamp_prequeue",
  		.data		= &netdev_tstamp_prequeue,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
  		.procname	= "message_cost",
717115e1a   Dave Young   printk ratelimiti...
156
  		.data		= &net_ratelimit_state.interval,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
159
  		.proc_handler	= proc_dointvec_jiffies,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
  		.procname	= "message_burst",
717115e1a   Dave Young   printk ratelimiti...
163
  		.data		= &net_ratelimit_state.burst,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
166
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
172
  		.procname	= "optmem_max",
  		.data		= &sysctl_optmem_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
173
  		.proc_handler	= proc_dointvec
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  	},
fec5e652e   Tom Herbert   rfs: Receive Flow...
175
176
177
178
179
180
181
182
  #ifdef CONFIG_RPS
  	{
  		.procname	= "rps_sock_flow_entries",
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= rps_sock_flow_sysctl
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  #endif /* CONFIG_NET */
  	{
51b0bdedb   Stephen Hemminger   [NET]: Separate t...
185
186
187
188
  		.procname	= "netdev_budget",
  		.data		= &netdev_budget,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
189
  		.proc_handler	= proc_dointvec
51b0bdedb   Stephen Hemminger   [NET]: Separate t...
190
  	},
a2a316fd0   Stephen Hemminger   [NET]: Replace CO...
191
  	{
a2a316fd0   Stephen Hemminger   [NET]: Replace CO...
192
193
194
195
  		.procname	= "warnings",
  		.data		= &net_msg_warn,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
196
  		.proc_handler	= proc_dointvec
a2a316fd0   Stephen Hemminger   [NET]: Replace CO...
197
  	},
f8572d8f2   Eric W. Biederman   sysctl net: Remov...
198
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  };
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
200

d5a4502e9   Pavel Emelyanov   netns: Register n...
201
202
  static struct ctl_table netns_core_table[] = {
  	{
d5a4502e9   Pavel Emelyanov   netns: Register n...
203
204
205
206
  		.procname	= "somaxconn",
  		.data		= &init_net.core.sysctl_somaxconn,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
4691236ce   Roman Gushchin   net: check net.co...
207
208
209
  		.extra1		= &zero,
  		.extra2		= &ushort_max,
  		.proc_handler	= proc_dointvec_minmax
d5a4502e9   Pavel Emelyanov   netns: Register n...
210
  	},
f8572d8f2   Eric W. Biederman   sysctl net: Remov...
211
  	{ }
d5a4502e9   Pavel Emelyanov   netns: Register n...
212
  };
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
213
  static __net_init int sysctl_core_net_init(struct net *net)
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
214
  {
d5a4502e9   Pavel Emelyanov   netns: Register n...
215
  	struct ctl_table *tbl;
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
216

8efa6e93c   Pavel Emelyanov   [NETNS]: Introduc...
217
  	net->core.sysctl_somaxconn = SOMAXCONN;
b8e1f9b5c   Pavel Emelyanov   [NET] sysctl: mak...
218

d5a4502e9   Pavel Emelyanov   netns: Register n...
219
  	tbl = netns_core_table;
09ad9bc75   Octavian Purdila   net: use net_eq t...
220
  	if (!net_eq(net, &init_net)) {
d5a4502e9   Pavel Emelyanov   netns: Register n...
221
  		tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL);
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
222
223
  		if (tbl == NULL)
  			goto err_dup;
d5a4502e9   Pavel Emelyanov   netns: Register n...
224
  		tbl[0].data = &net->core.sysctl_somaxconn;
464dc801c   Eric W. Biederman   net: Don't export...
225
226
227
228
229
  
  		/* Don't export any sysctls to unprivileged users */
  		if (net->user_ns != &init_user_ns) {
  			tbl[0].procname = NULL;
  		}
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
230
  	}
ec8f23ce0   Eric W. Biederman   net: Convert all ...
231
  	net->core.sysctl_hdr = register_net_sysctl(net, "net/core", tbl);
8efa6e93c   Pavel Emelyanov   [NETNS]: Introduc...
232
  	if (net->core.sysctl_hdr == NULL)
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
233
  		goto err_reg;
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
234

024626e36   Pavel Emelyanov   [NET] sysctl: mak...
235
236
237
  	return 0;
  
  err_reg:
d5a4502e9   Pavel Emelyanov   netns: Register n...
238
  	if (tbl != netns_core_table)
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
239
240
241
242
243
244
245
246
  		kfree(tbl);
  err_dup:
  	return -ENOMEM;
  }
  
  static __net_exit void sysctl_core_net_exit(struct net *net)
  {
  	struct ctl_table *tbl;
8efa6e93c   Pavel Emelyanov   [NETNS]: Introduc...
247
248
  	tbl = net->core.sysctl_hdr->ctl_table_arg;
  	unregister_net_sysctl_table(net->core.sysctl_hdr);
d5a4502e9   Pavel Emelyanov   netns: Register n...
249
  	BUG_ON(tbl == netns_core_table);
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
250
251
252
253
254
255
256
257
258
259
  	kfree(tbl);
  }
  
  static __net_initdata struct pernet_operations sysctl_core_ops = {
  	.init = sysctl_core_net_init,
  	.exit = sysctl_core_net_exit,
  };
  
  static __init int sysctl_core_init(void)
  {
434447579   Eric W. Biederman   net: Kill registe...
260
  	register_net_sysctl(&init_net, "net/core", net_core_table);
024626e36   Pavel Emelyanov   [NET] sysctl: mak...
261
  	return register_pernet_subsys(&sysctl_core_ops);
33eb9cfc7   Pavel Emelyanov   [NET]: Isolate th...
262
  }
b27aeadb5   Alexey Dobriyan   netns xfrm: per-n...
263
  fs_initcall(sysctl_core_init);