Blame view
net/core/sysctl_net_core.c
5.75 KB
1da177e4c 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 Linux-2.6.12-rc2 |
10 |
#include <linux/module.h> |
20380731b [NET]: Fix sparse... |
11 |
#include <linux/socket.h> |
a37ae4086 [NET]: Don't decl... |
12 |
#include <linux/netdevice.h> |
3fff4c42b printk: Remove ra... |
13 |
#include <linux/ratelimit.h> |
fec5e652e rfs: Receive Flow... |
14 |
#include <linux/vmalloc.h> |
33eb9cfc7 [NET]: Isolate th... |
15 |
#include <linux/init.h> |
5a0e3ad6a include cleanup: ... |
16 |
#include <linux/slab.h> |
7426a5645 net: fix compile ... |
17 |
#include <linux/kmemleak.h> |
3fff4c42b printk: Remove ra... |
18 |
|
63d819cae sysctl: fix spars... |
19 |
#include <net/ip.h> |
20380731b [NET]: Fix sparse... |
20 |
#include <net/sock.h> |
c5c177b4a net: Kill ratelim... |
21 |
#include <net/net_ratelimit.h> |
1da177e4c Linux-2.6.12-rc2 |
22 |
|
4691236ce net: check net.co... |
23 |
static int zero = 0; |
cdda88912 net: avoid to han... |
24 |
static int one = 1; |
4691236ce net: check net.co... |
25 |
static int ushort_max = USHRT_MAX; |
cdda88912 net: avoid to han... |
26 |
|
fec5e652e 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 rps: add __rcu an... |
42 43 |
orig_sock_table = rcu_dereference_protected(rps_sock_flow_table, lockdep_is_held(&sock_flow_mutex)); |
fec5e652e 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 net: use jump_lab... |
75 |
if (sock_table) |
c5905afb0 static keys: Intr... |
76 |
static_key_slow_inc(&rps_needed); |
adc9300e7 net: use jump_lab... |
77 |
if (orig_sock_table) { |
c5905afb0 static keys: Intr... |
78 |
static_key_slow_dec(&rps_needed); |
adc9300e7 net: use jump_lab... |
79 80 81 |
synchronize_rcu(); vfree(orig_sock_table); } |
fec5e652e rfs: Receive Flow... |
82 83 84 85 86 87 88 89 |
} } mutex_unlock(&sock_flow_mutex); return ret; } #endif /* CONFIG_RPS */ |
33eb9cfc7 [NET]: Isolate th... |
90 |
static struct ctl_table net_core_table[] = { |
1da177e4c Linux-2.6.12-rc2 |
91 92 |
#ifdef CONFIG_NET { |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 96 |
.procname = "wmem_max", .data = &sysctl_wmem_max, .maxlen = sizeof(int), .mode = 0644, |
cdda88912 net: avoid to han... |
97 98 |
.proc_handler = proc_dointvec_minmax, .extra1 = &one, |
1da177e4c Linux-2.6.12-rc2 |
99 100 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 104 |
.procname = "rmem_max", .data = &sysctl_rmem_max, .maxlen = sizeof(int), .mode = 0644, |
cdda88912 net: avoid to han... |
105 106 |
.proc_handler = proc_dointvec_minmax, .extra1 = &one, |
1da177e4c Linux-2.6.12-rc2 |
107 108 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
109 110 111 112 |
.procname = "wmem_default", .data = &sysctl_wmem_default, .maxlen = sizeof(int), .mode = 0644, |
cdda88912 net: avoid to han... |
113 114 |
.proc_handler = proc_dointvec_minmax, .extra1 = &one, |
1da177e4c Linux-2.6.12-rc2 |
115 116 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
117 118 119 120 |
.procname = "rmem_default", .data = &sysctl_rmem_default, .maxlen = sizeof(int), .mode = 0644, |
cdda88912 net: avoid to han... |
121 122 |
.proc_handler = proc_dointvec_minmax, .extra1 = &one, |
1da177e4c Linux-2.6.12-rc2 |
123 124 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
125 126 127 128 |
.procname = "dev_weight", .data = &weight_p, .maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
129 |
.proc_handler = proc_dointvec |
1da177e4c Linux-2.6.12-rc2 |
130 131 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
132 133 134 135 |
.procname = "netdev_max_backlog", .data = &netdev_max_backlog, .maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
136 |
.proc_handler = proc_dointvec |
1da177e4c Linux-2.6.12-rc2 |
137 |
}, |
0a14842f5 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 Linux-2.6.12-rc2 |
147 |
{ |
3b098e2d7 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 Linux-2.6.12-rc2 |
155 |
.procname = "message_cost", |
717115e1a printk ratelimiti... |
156 |
.data = &net_ratelimit_state.interval, |
1da177e4c Linux-2.6.12-rc2 |
157 158 |
.maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
159 |
.proc_handler = proc_dointvec_jiffies, |
1da177e4c Linux-2.6.12-rc2 |
160 161 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
162 |
.procname = "message_burst", |
717115e1a printk ratelimiti... |
163 |
.data = &net_ratelimit_state.burst, |
1da177e4c Linux-2.6.12-rc2 |
164 165 |
.maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
166 |
.proc_handler = proc_dointvec, |
1da177e4c Linux-2.6.12-rc2 |
167 168 |
}, { |
1da177e4c Linux-2.6.12-rc2 |
169 170 171 172 |
.procname = "optmem_max", .data = &sysctl_optmem_max, .maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
173 |
.proc_handler = proc_dointvec |
1da177e4c Linux-2.6.12-rc2 |
174 |
}, |
fec5e652e 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 Linux-2.6.12-rc2 |
183 184 |
#endif /* CONFIG_NET */ { |
51b0bdedb [NET]: Separate t... |
185 186 187 188 |
.procname = "netdev_budget", .data = &netdev_budget, .maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
189 |
.proc_handler = proc_dointvec |
51b0bdedb [NET]: Separate t... |
190 |
}, |
a2a316fd0 [NET]: Replace CO... |
191 |
{ |
a2a316fd0 [NET]: Replace CO... |
192 193 194 195 |
.procname = "warnings", .data = &net_msg_warn, .maxlen = sizeof(int), .mode = 0644, |
6d9f239a1 net: '&' redux |
196 |
.proc_handler = proc_dointvec |
a2a316fd0 [NET]: Replace CO... |
197 |
}, |
f8572d8f2 sysctl net: Remov... |
198 |
{ } |
1da177e4c Linux-2.6.12-rc2 |
199 |
}; |
33eb9cfc7 [NET]: Isolate th... |
200 |
|
d5a4502e9 netns: Register n... |
201 202 |
static struct ctl_table netns_core_table[] = { { |
d5a4502e9 netns: Register n... |
203 204 205 206 |
.procname = "somaxconn", .data = &init_net.core.sysctl_somaxconn, .maxlen = sizeof(int), .mode = 0644, |
4691236ce net: check net.co... |
207 208 209 |
.extra1 = &zero, .extra2 = &ushort_max, .proc_handler = proc_dointvec_minmax |
d5a4502e9 netns: Register n... |
210 |
}, |
f8572d8f2 sysctl net: Remov... |
211 |
{ } |
d5a4502e9 netns: Register n... |
212 |
}; |
024626e36 [NET] sysctl: mak... |
213 |
static __net_init int sysctl_core_net_init(struct net *net) |
33eb9cfc7 [NET]: Isolate th... |
214 |
{ |
d5a4502e9 netns: Register n... |
215 |
struct ctl_table *tbl; |
024626e36 [NET] sysctl: mak... |
216 |
|
8efa6e93c [NETNS]: Introduc... |
217 |
net->core.sysctl_somaxconn = SOMAXCONN; |
b8e1f9b5c [NET] sysctl: mak... |
218 |
|
d5a4502e9 netns: Register n... |
219 |
tbl = netns_core_table; |
09ad9bc75 net: use net_eq t... |
220 |
if (!net_eq(net, &init_net)) { |
d5a4502e9 netns: Register n... |
221 |
tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL); |
024626e36 [NET] sysctl: mak... |
222 223 |
if (tbl == NULL) goto err_dup; |
d5a4502e9 netns: Register n... |
224 |
tbl[0].data = &net->core.sysctl_somaxconn; |
464dc801c 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 [NET] sysctl: mak... |
230 |
} |
ec8f23ce0 net: Convert all ... |
231 |
net->core.sysctl_hdr = register_net_sysctl(net, "net/core", tbl); |
8efa6e93c [NETNS]: Introduc... |
232 |
if (net->core.sysctl_hdr == NULL) |
024626e36 [NET] sysctl: mak... |
233 |
goto err_reg; |
33eb9cfc7 [NET]: Isolate th... |
234 |
|
024626e36 [NET] sysctl: mak... |
235 236 237 |
return 0; err_reg: |
d5a4502e9 netns: Register n... |
238 |
if (tbl != netns_core_table) |
024626e36 [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 [NETNS]: Introduc... |
247 248 |
tbl = net->core.sysctl_hdr->ctl_table_arg; unregister_net_sysctl_table(net->core.sysctl_hdr); |
d5a4502e9 netns: Register n... |
249 |
BUG_ON(tbl == netns_core_table); |
024626e36 [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 net: Kill registe... |
260 |
register_net_sysctl(&init_net, "net/core", net_core_table); |
024626e36 [NET] sysctl: mak... |
261 |
return register_pernet_subsys(&sysctl_core_ops); |
33eb9cfc7 [NET]: Isolate th... |
262 |
} |
b27aeadb5 netns xfrm: per-n... |
263 |
fs_initcall(sysctl_core_init); |