sysctl.c 1.9 KB

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