2 * sysctl_net_core.c: sysctl interface to net core subsystem.
4 * Begun April 1, 1996, Mike Shaver.
5 * Added /proc/sys/net/core directory entry (empty =) ). [MS]
9 #include <linux/sysctl.h>
10 #include <linux/module.h>
11 #include <linux/socket.h>
12 #include <linux/netdevice.h>
13 #include <linux/ratelimit.h>
14 #include <linux/vmalloc.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
20 #include <net/net_ratelimit.h>
23 static int ushort_max = USHRT_MAX;
26 static int rps_sock_flow_sysctl(ctl_table *table, int write,
27 void __user *buffer, size_t *lenp, loff_t *ppos)
29 unsigned int orig_size, size;
33 .maxlen = sizeof(size),
36 struct rps_sock_flow_table *orig_sock_table, *sock_table;
37 static DEFINE_MUTEX(sock_flow_mutex);
39 mutex_lock(&sock_flow_mutex);
41 orig_sock_table = rcu_dereference_protected(rps_sock_flow_table,
42 lockdep_is_held(&sock_flow_mutex));
43 size = orig_size = orig_sock_table ? orig_sock_table->mask + 1 : 0;
45 ret = proc_dointvec(&tmp, write, buffer, lenp, ppos);
50 /* Enforce limit to prevent overflow */
51 mutex_unlock(&sock_flow_mutex);
54 size = roundup_pow_of_two(size);
55 if (size != orig_size) {
57 vmalloc(RPS_SOCK_FLOW_TABLE_SIZE(size));
59 mutex_unlock(&sock_flow_mutex);
63 sock_table->mask = size - 1;
65 sock_table = orig_sock_table;
67 for (i = 0; i < size; i++)
68 sock_table->ents[i] = RPS_NO_CPU;
72 if (sock_table != orig_sock_table) {
73 rcu_assign_pointer(rps_sock_flow_table, sock_table);
75 vfree(orig_sock_table);
79 mutex_unlock(&sock_flow_mutex);
83 #endif /* CONFIG_RPS */
85 static struct ctl_table net_core_table[] = {
88 .procname = "wmem_max",
89 .data = &sysctl_wmem_max,
90 .maxlen = sizeof(int),
92 .proc_handler = proc_dointvec
95 .procname = "rmem_max",
96 .data = &sysctl_rmem_max,
97 .maxlen = sizeof(int),
99 .proc_handler = proc_dointvec
102 .procname = "wmem_default",
103 .data = &sysctl_wmem_default,
104 .maxlen = sizeof(int),
106 .proc_handler = proc_dointvec
109 .procname = "rmem_default",
110 .data = &sysctl_rmem_default,
111 .maxlen = sizeof(int),
113 .proc_handler = proc_dointvec
116 .procname = "dev_weight",
118 .maxlen = sizeof(int),
120 .proc_handler = proc_dointvec
123 .procname = "netdev_max_backlog",
124 .data = &netdev_max_backlog,
125 .maxlen = sizeof(int),
127 .proc_handler = proc_dointvec
129 #ifdef CONFIG_BPF_JIT
131 .procname = "bpf_jit_enable",
132 .data = &bpf_jit_enable,
133 .maxlen = sizeof(int),
135 .proc_handler = proc_dointvec
139 .procname = "netdev_tstamp_prequeue",
140 .data = &netdev_tstamp_prequeue,
141 .maxlen = sizeof(int),
143 .proc_handler = proc_dointvec
146 .procname = "message_cost",
147 .data = &net_ratelimit_state.interval,
148 .maxlen = sizeof(int),
150 .proc_handler = proc_dointvec_jiffies,
153 .procname = "message_burst",
154 .data = &net_ratelimit_state.burst,
155 .maxlen = sizeof(int),
157 .proc_handler = proc_dointvec,
160 .procname = "optmem_max",
161 .data = &sysctl_optmem_max,
162 .maxlen = sizeof(int),
164 .proc_handler = proc_dointvec
168 .procname = "rps_sock_flow_entries",
169 .maxlen = sizeof(int),
171 .proc_handler = rps_sock_flow_sysctl
174 #endif /* CONFIG_NET */
176 .procname = "netdev_budget",
177 .data = &netdev_budget,
178 .maxlen = sizeof(int),
180 .proc_handler = proc_dointvec
183 .procname = "warnings",
184 .data = &net_msg_warn,
185 .maxlen = sizeof(int),
187 .proc_handler = proc_dointvec
192 static struct ctl_table netns_core_table[] = {
194 .procname = "somaxconn",
195 .data = &init_net.core.sysctl_somaxconn,
196 .maxlen = sizeof(int),
199 .extra2 = &ushort_max,
200 .proc_handler = proc_dointvec_minmax
205 __net_initdata struct ctl_path net_core_path[] = {
206 { .procname = "net", },
207 { .procname = "core", },
211 static __net_init int sysctl_core_net_init(struct net *net)
213 struct ctl_table *tbl;
215 net->core.sysctl_somaxconn = SOMAXCONN;
217 tbl = netns_core_table;
218 if (!net_eq(net, &init_net)) {
219 tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL);
223 tbl[0].data = &net->core.sysctl_somaxconn;
226 net->core.sysctl_hdr = register_net_sysctl_table(net,
228 if (net->core.sysctl_hdr == NULL)
234 if (tbl != netns_core_table)
240 static __net_exit void sysctl_core_net_exit(struct net *net)
242 struct ctl_table *tbl;
244 tbl = net->core.sysctl_hdr->ctl_table_arg;
245 unregister_net_sysctl_table(net->core.sysctl_hdr);
246 BUG_ON(tbl == netns_core_table);
250 static __net_initdata struct pernet_operations sysctl_core_ops = {
251 .init = sysctl_core_net_init,
252 .exit = sysctl_core_net_exit,
255 static __init int sysctl_core_init(void)
257 static struct ctl_table empty[1];
259 register_sysctl_paths(net_core_path, empty);
260 register_net_sysctl_rotable(net_core_path, net_core_table);
261 return register_pernet_subsys(&sysctl_core_ops);
264 fs_initcall(sysctl_core_init);