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