1faaa357aSXiaoming Ni // SPDX-License-Identifier: GPL-2.0-only
2faaa357aSXiaoming Ni /*
3faaa357aSXiaoming Ni * sysctl.c: General linux system control interface
4faaa357aSXiaoming Ni */
5faaa357aSXiaoming Ni
6faaa357aSXiaoming Ni #include <linux/sysctl.h>
7faaa357aSXiaoming Ni #include <linux/printk.h>
8faaa357aSXiaoming Ni #include <linux/capability.h>
9faaa357aSXiaoming Ni #include <linux/ratelimit.h>
10faaa357aSXiaoming Ni #include "internal.h"
11faaa357aSXiaoming Ni
12faaa357aSXiaoming Ni static const int ten_thousand = 10000;
13faaa357aSXiaoming Ni
proc_dointvec_minmax_sysadmin(struct ctl_table * table,int write,void * buffer,size_t * lenp,loff_t * ppos)14faaa357aSXiaoming Ni static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
15*1f2cfdd3SMickaël Salaün void *buffer, size_t *lenp, loff_t *ppos)
16faaa357aSXiaoming Ni {
17faaa357aSXiaoming Ni if (write && !capable(CAP_SYS_ADMIN))
18faaa357aSXiaoming Ni return -EPERM;
19faaa357aSXiaoming Ni
20faaa357aSXiaoming Ni return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
21faaa357aSXiaoming Ni }
22faaa357aSXiaoming Ni
23faaa357aSXiaoming Ni static struct ctl_table printk_sysctls[] = {
24faaa357aSXiaoming Ni {
25faaa357aSXiaoming Ni .procname = "printk",
26faaa357aSXiaoming Ni .data = &console_loglevel,
27faaa357aSXiaoming Ni .maxlen = 4*sizeof(int),
28faaa357aSXiaoming Ni .mode = 0644,
29faaa357aSXiaoming Ni .proc_handler = proc_dointvec,
30faaa357aSXiaoming Ni },
31faaa357aSXiaoming Ni {
32faaa357aSXiaoming Ni .procname = "printk_ratelimit",
33faaa357aSXiaoming Ni .data = &printk_ratelimit_state.interval,
34faaa357aSXiaoming Ni .maxlen = sizeof(int),
35faaa357aSXiaoming Ni .mode = 0644,
36faaa357aSXiaoming Ni .proc_handler = proc_dointvec_jiffies,
37faaa357aSXiaoming Ni },
38faaa357aSXiaoming Ni {
39faaa357aSXiaoming Ni .procname = "printk_ratelimit_burst",
40faaa357aSXiaoming Ni .data = &printk_ratelimit_state.burst,
41faaa357aSXiaoming Ni .maxlen = sizeof(int),
42faaa357aSXiaoming Ni .mode = 0644,
43faaa357aSXiaoming Ni .proc_handler = proc_dointvec,
44faaa357aSXiaoming Ni },
45faaa357aSXiaoming Ni {
46faaa357aSXiaoming Ni .procname = "printk_delay",
47faaa357aSXiaoming Ni .data = &printk_delay_msec,
48faaa357aSXiaoming Ni .maxlen = sizeof(int),
49faaa357aSXiaoming Ni .mode = 0644,
50faaa357aSXiaoming Ni .proc_handler = proc_dointvec_minmax,
51faaa357aSXiaoming Ni .extra1 = SYSCTL_ZERO,
52faaa357aSXiaoming Ni .extra2 = (void *)&ten_thousand,
53faaa357aSXiaoming Ni },
54faaa357aSXiaoming Ni {
55faaa357aSXiaoming Ni .procname = "printk_devkmsg",
56faaa357aSXiaoming Ni .data = devkmsg_log_str,
57faaa357aSXiaoming Ni .maxlen = DEVKMSG_STR_MAX_SIZE,
58faaa357aSXiaoming Ni .mode = 0644,
59faaa357aSXiaoming Ni .proc_handler = devkmsg_sysctl_set_loglvl,
60faaa357aSXiaoming Ni },
61faaa357aSXiaoming Ni {
62faaa357aSXiaoming Ni .procname = "dmesg_restrict",
63faaa357aSXiaoming Ni .data = &dmesg_restrict,
64faaa357aSXiaoming Ni .maxlen = sizeof(int),
65faaa357aSXiaoming Ni .mode = 0644,
66faaa357aSXiaoming Ni .proc_handler = proc_dointvec_minmax_sysadmin,
67faaa357aSXiaoming Ni .extra1 = SYSCTL_ZERO,
68faaa357aSXiaoming Ni .extra2 = SYSCTL_ONE,
69faaa357aSXiaoming Ni },
70faaa357aSXiaoming Ni {
71faaa357aSXiaoming Ni .procname = "kptr_restrict",
72faaa357aSXiaoming Ni .data = &kptr_restrict,
73faaa357aSXiaoming Ni .maxlen = sizeof(int),
74faaa357aSXiaoming Ni .mode = 0644,
75faaa357aSXiaoming Ni .proc_handler = proc_dointvec_minmax_sysadmin,
76faaa357aSXiaoming Ni .extra1 = SYSCTL_ZERO,
77faaa357aSXiaoming Ni .extra2 = SYSCTL_TWO,
78faaa357aSXiaoming Ni },
79faaa357aSXiaoming Ni {}
80faaa357aSXiaoming Ni };
81faaa357aSXiaoming Ni
printk_sysctl_init(void)82faaa357aSXiaoming Ni void __init printk_sysctl_init(void)
83faaa357aSXiaoming Ni {
84faaa357aSXiaoming Ni register_sysctl_init("kernel", printk_sysctls);
85faaa357aSXiaoming Ni }
86