^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * sysctl.c: General linux system control interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Begun 24 March 1995, Stephen Tweedie
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Added /proc support, Dec 1995
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Dynamic registration fixes, Stephen Tweedie.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Horn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Wendling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * The list_for_each() macro wasn't appropriate for the sysctl loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Removed it and replaced it with older style, 03/23/00, Bill Wendling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/aio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/swap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/bitmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/printk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/kmemleak.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/kobject.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/net.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/sysrq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/highuid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/writeback.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/ratelimit.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/compaction.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/hugetlb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/initrd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/key.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <linux/times.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <linux/limits.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/dcache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <linux/dnotify.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <linux/syscalls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <linux/vmstat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #include <linux/nfs_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #include <linux/reboot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #include <linux/ftrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #include <linux/perf_event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #include <linux/kprobes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #include <linux/pipe_fs_i.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #include <linux/oom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #include <linux/kmod.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #include <linux/capability.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #include <linux/binfmts.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #include <linux/sched/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #include <linux/sched/coredump.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #include <linux/kexec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #include <linux/bpf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include <linux/mount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #include <linux/userfaultfd_k.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #include <linux/coredump.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #include <linux/latencytop.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #include <linux/pid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #include "../lib/kstrtox.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #ifdef CONFIG_X86
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #include <asm/nmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #include <asm/stacktrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #ifdef CONFIG_SPARC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #ifdef CONFIG_BSD_PROCESS_ACCT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #include <linux/acct.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #ifdef CONFIG_RT_MUTEXES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #include <linux/rtmutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #include <linux/lockdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #ifdef CONFIG_CHR_DEV_SG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #include <scsi/sg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #include <linux/stackleak.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #ifdef CONFIG_LOCKUP_DETECTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #include <linux/nmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #if defined(CONFIG_SYSCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* External variables not in a header file. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) extern int extra_free_kbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* Constants used for minimum and maximum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #ifdef CONFIG_LOCKUP_DETECTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static int sixty = 60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static int __maybe_unused neg_one = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static int __maybe_unused two = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int __maybe_unused four = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static unsigned long zero_ul;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static unsigned long one_ul = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static unsigned long long_max = LONG_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static int one_hundred = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static int two_hundred = 200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static int one_thousand = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static int ten_thousand = 10000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #ifdef CONFIG_PERF_EVENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static int six_hundred_forty_kb = 640 * 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static int maxolduid = 65535;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static int minolduid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static int ngroups_max = NGROUPS_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static const int cap_last_cap = CAP_LAST_CAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * This is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * and hung_task_check_interval_secs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #ifdef CONFIG_DETECT_HUNG_TASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static unsigned long hung_task_timeout_max = (LONG_MAX/HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #ifdef CONFIG_INOTIFY_USER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #include <linux/inotify.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #ifdef CONFIG_PROC_SYSCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * enum sysctl_writes_mode - supported sysctl write modes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * @SYSCTL_WRITES_LEGACY: each write syscall must fully contain the sysctl value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * to be written, and multiple writes on the same sysctl file descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * will rewrite the sysctl value, regardless of file position. No warning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * is issued when the initial position is not 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * @SYSCTL_WRITES_WARN: same as above but warn when the initial file position is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * not 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * @SYSCTL_WRITES_STRICT: writes to numeric sysctl entries must always be at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * file position 0 and the value must be fully contained in the buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * sent to the write syscall. If dealing with strings respect the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * position, but restrict this to the max length of the buffer, anything
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * passed the max length will be ignored. Multiple writes will append
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * to the buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * These write modes control how current file position affects the behavior of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * updating sysctl values through the proc interface on each write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) enum sysctl_writes_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) SYSCTL_WRITES_LEGACY = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) SYSCTL_WRITES_WARN = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) SYSCTL_WRITES_STRICT = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static enum sysctl_writes_mode sysctl_writes_strict = SYSCTL_WRITES_STRICT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #endif /* CONFIG_PROC_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) defined(CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) int sysctl_legacy_va_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #ifdef CONFIG_SCHED_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static int min_sched_granularity_ns = 100000; /* 100 usecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static int min_wakeup_granularity_ns; /* 0 usecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #endif /* CONFIG_SCHED_DEBUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #ifdef CONFIG_COMPACTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) static int min_extfrag_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static int max_extfrag_threshold = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #endif /* CONFIG_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_SYSCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static int bpf_stats_handler(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct static_key *key = (struct static_key *)table->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) static int saved_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int val, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct ctl_table tmp = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .data = &val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .maxlen = sizeof(val),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .mode = table->mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (write && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) mutex_lock(&bpf_stats_enabled_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) val = saved_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (write && !ret && val != saved_val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static_key_slow_inc(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) static_key_slow_dec(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) saved_val = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) mutex_unlock(&bpf_stats_enabled_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) void __weak unpriv_ebpf_notify(int new_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static int bpf_unpriv_handler(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) int ret, unpriv_enable = *(int *)table->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) bool locked_state = unpriv_enable == 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct ctl_table tmp = *table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (write && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) tmp.data = &unpriv_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (write && !ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (locked_state && unpriv_enable != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) *(int *)table->data = unpriv_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) unpriv_ebpf_notify(unpriv_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #endif /* CONFIG_BPF_SYSCALL && CONFIG_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * /proc/sys support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #ifdef CONFIG_PROC_SYSCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static int _proc_do_string(char *data, int maxlen, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) char *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) char c, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (!data || !maxlen || !*lenp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (sysctl_writes_strict == SYSCTL_WRITES_STRICT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /* Only continue writes not past the end of buffer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) len = strlen(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) if (len > maxlen - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) len = maxlen - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (*ppos > len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) len = *ppos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /* Start writing from beginning of buffer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) while ((p - buffer) < *lenp && len < maxlen - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) c = *(p++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if (c == 0 || c == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) data[len++] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) data[len] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) len = strlen(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (len > maxlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) len = maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) if (*ppos > len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) data += *ppos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) len -= *ppos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (len > *lenp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) len = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) memcpy(buffer, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (len < *lenp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) buffer[len] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) len++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) *lenp = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) *ppos += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static void warn_sysctl_write(struct ctl_table *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) pr_warn_once("%s wrote to %s when file position was not 0!\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) "This will not be supported in the future. To silence this\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) "warning, set kernel.sysctl_writes_strict = -1\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) current->comm, table->procname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) * proc_first_pos_non_zero_ignore - check if first position is allowed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * Returns true if the first position is non-zero and the sysctl_writes_strict
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * mode indicates this is not allowed for numeric input types. String proc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * handlers can ignore the return value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) static bool proc_first_pos_non_zero_ignore(loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) struct ctl_table *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (!*ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) switch (sysctl_writes_strict) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) case SYSCTL_WRITES_STRICT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) case SYSCTL_WRITES_WARN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) warn_sysctl_write(table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) * proc_dostring - read a string sysctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * Reads/writes a string from/to the user buffer. If the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * buffer provided is not large enough to hold the string, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * string is truncated. The copied string is %NULL-terminated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * If the string is being read by the user process, it is copied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) * and a newline '\n' is added. It is truncated if the buffer is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) * not large enough.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) int proc_dostring(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) proc_first_pos_non_zero_ignore(ppos, table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return _proc_do_string(table->data, table->maxlen, write, buffer, lenp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) static size_t proc_skip_spaces(char **buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) size_t ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) char *tmp = skip_spaces(*buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) ret = tmp - *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) *buf = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static void proc_skip_char(char **buf, size_t *size, const char v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) while (*size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (**buf != v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) (*size)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) (*buf)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) * strtoul_lenient - parse an ASCII formatted integer from a buffer and only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) * fail on overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) * @cp: kernel buffer containing the string to parse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) * @endp: pointer to store the trailing characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) * @base: the base to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) * @res: where the parsed integer will be stored
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) * In case of success 0 is returned and @res will contain the parsed integer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * @endp will hold any trailing characters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * This function will fail the parse on overflow. If there wasn't an overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * the function will defer the decision what characters count as invalid to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) static int strtoul_lenient(const char *cp, char **endp, unsigned int base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) unsigned long *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) unsigned long long result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) unsigned int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) cp = _parse_integer_fixup_radix(cp, &base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) rv = _parse_integer(cp, base, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if ((rv & KSTRTOX_OVERFLOW) || (result != (unsigned long)result))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) return -ERANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) cp += rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (endp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) *endp = (char *)cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) *res = (unsigned long)result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) #define TMPBUFLEN 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * proc_get_long - reads an ASCII formatted integer from a user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * @buf: a kernel buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * @size: size of the kernel buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * @val: this is where the number will be stored
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * @neg: set to %TRUE if number is negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * @perm_tr: a vector which contains the allowed trailers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) * @perm_tr_len: size of the perm_tr vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * @tr: pointer to store the trailer character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * In case of success %0 is returned and @buf and @size are updated with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * the amount of bytes read. If @tr is non-NULL and a trailing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * character exists (size is non-zero after returning from this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * function), @tr is updated with the trailing character.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static int proc_get_long(char **buf, size_t *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) unsigned long *val, bool *neg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) const char *perm_tr, unsigned perm_tr_len, char *tr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) char *p, tmp[TMPBUFLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) if (!*size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) len = *size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (len > TMPBUFLEN - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) len = TMPBUFLEN - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) memcpy(tmp, *buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) tmp[len] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) p = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (*p == '-' && *size > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) *neg = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) *neg = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (!isdigit(*p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (strtoul_lenient(p, &p, 0, val))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) len = p - tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* We don't know if the next char is whitespace thus we may accept
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) * invalid integers (e.g. 1234...a) or two integers instead of one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) * (e.g. 123...1). So lets not allow such large numbers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (len == TMPBUFLEN - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) if (tr && (len < *size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) *tr = *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) *buf += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) *size -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * proc_put_long - converts an integer to a decimal ASCII formatted string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * @buf: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * @size: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * @val: the integer to be converted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * @neg: sign of the number, %TRUE for negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) * In case of success @buf and @size are updated with the amount of bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * written.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) static void proc_put_long(void **buf, size_t *size, unsigned long val, bool neg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) char tmp[TMPBUFLEN], *p = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) sprintf(p, "%s%lu", neg ? "-" : "", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) len = strlen(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if (len > *size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) len = *size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) memcpy(*buf, tmp, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) *size -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) *buf += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #undef TMPBUFLEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) static void proc_put_char(void **buf, size_t *size, char c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) if (*size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) char **buffer = (char **)buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) **buffer = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) (*size)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) (*buffer)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) *buf = *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) if (*negp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) if (*lvalp > (unsigned long) INT_MAX + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) *valp = -*lvalp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if (*lvalp > (unsigned long) INT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) *valp = *lvalp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) if (val < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) *negp = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) *lvalp = -(unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) *negp = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) *lvalp = (unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) static int do_proc_douintvec_conv(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) if (*lvalp > UINT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) *valp = *lvalp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) unsigned int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) *lvalp = (unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) int *i, vleft, first = 1, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) size_t left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) i = (int *) tbl_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) vleft = table->maxlen / sizeof(*i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) left = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (!conv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) conv = do_proc_dointvec_conv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (proc_first_pos_non_zero_ignore(ppos, table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) if (left > PAGE_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) left = PAGE_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) for (; left && vleft--; i++, first=0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) bool neg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (!left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) err = proc_get_long(&p, &left, &lval, &neg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) proc_wspace_sep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) sizeof(proc_wspace_sep), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) if (conv(&neg, &lval, i, 1, data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (conv(&neg, &lval, i, 0, data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) if (!first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) proc_put_char(&buffer, &left, '\t');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) proc_put_long(&buffer, &left, lval, neg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (!write && !first && left && !err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) proc_put_char(&buffer, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) if (write && !err && left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) if (write && first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) return err ? : -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) *lenp -= left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) static int do_proc_dointvec(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) void *buffer, size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) return __do_proc_dointvec(table->data, table, write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) buffer, lenp, ppos, conv, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) static int do_proc_douintvec_w(unsigned int *tbl_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct ctl_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int (*conv)(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) size_t left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) bool neg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) char *p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) left = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) if (proc_first_pos_non_zero_ignore(ppos, table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) goto bail_early;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) if (left > PAGE_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) left = PAGE_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (!left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) err = proc_get_long(&p, &left, &lval, &neg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) proc_wspace_sep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) sizeof(proc_wspace_sep), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if (err || neg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) if (conv(&lval, tbl_data, 1, data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) if (!err && left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /* This is in keeping with old __do_proc_dointvec() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) bail_early:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) static int do_proc_douintvec_r(unsigned int *tbl_data, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) int (*conv)(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) size_t left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) left = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if (conv(&lval, tbl_data, 0, data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) proc_put_long(&buffer, &left, lval, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) if (!left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) proc_put_char(&buffer, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) *lenp -= left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) int (*conv)(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) unsigned int *i, vleft;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) i = (unsigned int *) tbl_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) vleft = table->maxlen / sizeof(*i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) * Arrays are not supported, keep this simple. *Do not* add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * support for them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (vleft != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) if (!conv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) conv = do_proc_douintvec_conv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) if (write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) return do_proc_douintvec_w(i, table, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) conv, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return do_proc_douintvec_r(i, buffer, lenp, ppos, conv, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) static int do_proc_douintvec(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) void *buffer, size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) int (*conv)(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) int write, void *data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return __do_proc_douintvec(table->data, table, write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) buffer, lenp, ppos, conv, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) * proc_dointvec - read a vector of integers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) int proc_dointvec(struct ctl_table *table, int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) #ifdef CONFIG_COMPACTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) int write, void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) int ret, old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) if (!IS_ENABLED(CONFIG_PREEMPT_RT) || !write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) old = *(int *)table->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (old != *(int *)table->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) pr_warn_once("sysctl attribute %s changed by %s[%d]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) table->procname, current->comm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) task_pid_nr(current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * proc_douintvec - read a vector of unsigned integers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) int proc_douintvec(struct ctl_table *table, int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) return do_proc_douintvec(table, write, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) do_proc_douintvec_conv, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * Taint values can only be increased
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) * This means we can safely use a temporary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) static int proc_taint(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) struct ctl_table t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) unsigned long tmptaint = get_taint();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) if (write && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) t = *table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) t.data = &tmptaint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) * If we are relying on panic_on_taint not producing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) * false positives due to userspace input, bail out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) * before setting the requested taint flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) if (panic_on_taint_nousertaint && (tmptaint & panic_on_taint))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) * Poor man's atomic or. Not worth adding a primitive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * to everyone's atomic.h for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) for (i = 0; i < TAINT_FLAGS_COUNT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if ((1UL << i) & tmptaint)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) add_taint(i, LOCKDEP_STILL_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (write && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * struct do_proc_dointvec_minmax_conv_param - proc_dointvec_minmax() range checking structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * @min: pointer to minimum allowable value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) * @max: pointer to maximum allowable value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) * The do_proc_dointvec_minmax_conv_param structure provides the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) * minimum and maximum values for doing range checking for those sysctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * parameters that use the proc_dointvec_minmax() handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) struct do_proc_dointvec_minmax_conv_param {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) int *min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) int *max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) int tmp, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) struct do_proc_dointvec_minmax_conv_param *param = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) * If writing, first do so via a temporary local int so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) * bounds-check it before touching *valp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) int *ip = write ? &tmp : valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) ret = do_proc_dointvec_conv(negp, lvalp, ip, write, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if ((param->min && *param->min > tmp) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) (param->max && *param->max < tmp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) *valp = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) * proc_dointvec_minmax - read a vector of integers with min/max values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) * This routine will ensure the values are within the range specified by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) * table->extra1 (min) and table->extra2 (max).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) * Returns 0 on success or -EINVAL on write when the range check fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) int proc_dointvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) struct do_proc_dointvec_minmax_conv_param param = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) .min = (int *) table->extra1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) .max = (int *) table->extra2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) return do_proc_dointvec(table, write, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) do_proc_dointvec_minmax_conv, ¶m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) * struct do_proc_douintvec_minmax_conv_param - proc_douintvec_minmax() range checking structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) * @min: pointer to minimum allowable value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) * @max: pointer to maximum allowable value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * The do_proc_douintvec_minmax_conv_param structure provides the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * minimum and maximum values for doing range checking for those sysctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * parameters that use the proc_douintvec_minmax() handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) struct do_proc_douintvec_minmax_conv_param {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) unsigned int *min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) unsigned int *max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) unsigned int tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) struct do_proc_douintvec_minmax_conv_param *param = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /* write via temporary local uint for bounds-checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) unsigned int *up = write ? &tmp : valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) ret = do_proc_douintvec_conv(lvalp, up, write, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) if ((param->min && *param->min > tmp) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) (param->max && *param->max < tmp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) return -ERANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) *valp = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) * proc_douintvec_minmax - read a vector of unsigned ints with min/max values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) * values from/to the user buffer, treated as an ASCII string. Negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) * strings are not allowed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) * This routine will ensure the values are within the range specified by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) * table->extra1 (min) and table->extra2 (max). There is a final sanity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) * check for UINT_MAX to avoid having to support wrap around uses from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) * userspace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) * Returns 0 on success or -ERANGE on write when the range check fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) int proc_douintvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) struct do_proc_douintvec_minmax_conv_param param = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) .min = (unsigned int *) table->extra1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) .max = (unsigned int *) table->extra2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) return do_proc_douintvec(table, write, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) do_proc_douintvec_minmax_conv, ¶m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) static int do_proc_dopipe_max_size_conv(unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) unsigned int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) val = round_pipe_size(*lvalp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) if (val == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) *valp = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) unsigned int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) *lvalp = (unsigned long) val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) static int proc_dopipe_max_size(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) return do_proc_douintvec(table, write, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) do_proc_dopipe_max_size_conv, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) static void validate_coredump_safety(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) #ifdef CONFIG_COREDUMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) if (suid_dumpable == SUID_DUMP_ROOT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) core_pattern[0] != '/' && core_pattern[0] != '|') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) "Unsafe core_pattern used with fs.suid_dumpable=2.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) "Pipe handler or fully qualified core dump path required.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) "Set kernel.core_pattern before fs.suid_dumpable.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (!error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) validate_coredump_safety();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) #ifdef CONFIG_COREDUMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) static int proc_dostring_coredump(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) int error = proc_dostring(table, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) if (!error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) validate_coredump_safety();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) #ifdef CONFIG_MAGIC_SYSRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static int sysrq_sysctl_handler(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) int tmp, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) tmp = sysrq_mask();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) ret = __do_proc_dointvec(&tmp, table, write, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) lenp, ppos, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (ret || !write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) if (write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) sysrq_toggle_support(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) int write, void *buffer, size_t *lenp, loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) unsigned long convmul, unsigned long convdiv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) unsigned long *i, *min, *max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) int vleft, first = 1, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) size_t left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) i = (unsigned long *) data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) min = (unsigned long *) table->extra1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) max = (unsigned long *) table->extra2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) vleft = table->maxlen / sizeof(unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) left = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) if (proc_first_pos_non_zero_ignore(ppos, table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) if (left > PAGE_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) left = PAGE_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) for (; left && vleft--; i++, first = 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) bool neg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) if (!left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) err = proc_get_long(&p, &left, &val, &neg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) proc_wspace_sep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) sizeof(proc_wspace_sep), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) if (neg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) val = convmul * val / convdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) if ((min && val < *min) || (max && val > *max)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) *i = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) val = convdiv * (*i) / convmul;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (!first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) proc_put_char(&buffer, &left, '\t');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) proc_put_long(&buffer, &left, val, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) if (!write && !first && left && !err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) proc_put_char(&buffer, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) if (write && !err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) left -= proc_skip_spaces(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) if (write && first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) return err ? : -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) *lenp -= left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) void *buffer, size_t *lenp, loff_t *ppos, unsigned long convmul,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) unsigned long convdiv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) return __do_proc_doulongvec_minmax(table->data, table, write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) buffer, lenp, ppos, convmul, convdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * proc_doulongvec_minmax - read a vector of long integers with min/max values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) * This routine will ensure the values are within the range specified by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) * table->extra1 (min) and table->extra2 (max).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) int proc_doulongvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) * values from/to the user buffer, treated as an ASCII string. The values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) * are treated as milliseconds, and converted to jiffies when they are stored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * This routine will ensure the values are within the range specified by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) * table->extra1 (min) and table->extra2 (max).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) return do_proc_doulongvec_minmax(table, write, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) lenp, ppos, HZ, 1000l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (*lvalp > INT_MAX / HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) if (val < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) *negp = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) lval = -(unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) *negp = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) lval = (unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) *lvalp = lval / HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) if (val < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) *negp = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) lval = -(unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) *negp = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) lval = (unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) *lvalp = jiffies_to_clock_t(lval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) int *valp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) int write, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) unsigned long jif = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) if (jif > INT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) *valp = (int)jif;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) int val = *valp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) unsigned long lval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (val < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) *negp = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) lval = -(unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) *negp = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) lval = (unsigned long)val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) *lvalp = jiffies_to_msecs(lval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) * proc_dointvec_jiffies - read a vector of integers as seconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) * The values read are assumed to be in seconds, and are converted into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) * jiffies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) int proc_dointvec_jiffies(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) return do_proc_dointvec(table,write,buffer,lenp,ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) do_proc_dointvec_jiffies_conv,NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * @ppos: pointer to the file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * The values read are assumed to be in 1/USER_HZ seconds, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * are converted into jiffies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) return do_proc_dointvec(table,write,buffer,lenp,ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) do_proc_dointvec_userhz_jiffies_conv,NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * @ppos: the current position in the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) * values from/to the user buffer, treated as an ASCII string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) * The values read are assumed to be in 1/1000 seconds, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) * are converted into jiffies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) return do_proc_dointvec(table, write, buffer, lenp, ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) do_proc_dointvec_ms_jiffies_conv, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) static int proc_do_cad_pid(struct ctl_table *table, int write, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) struct pid *new_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) pid_t tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) tmp = pid_vnr(cad_pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) r = __do_proc_dointvec(&tmp, table, write, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) lenp, ppos, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (r || !write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) new_pid = find_get_pid(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (!new_pid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) return -ESRCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) put_pid(xchg(&cad_pid, new_pid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * proc_do_large_bitmap - read/write from/to a large bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * @table: the sysctl table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * @write: %TRUE if this is a write to the sysctl file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) * @buffer: the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) * @lenp: the size of the user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) * @ppos: file position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) * The bitmap is stored at table->data and the bitmap length (in bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) * in table->maxlen.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) * We use a range comma separated format (e.g. 1,3-4,10-10) so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) * large bitmaps may be represented in a compact manner. Writing into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) * the file will clear the bitmap then update it with the given input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) * Returns 0 on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) int proc_do_large_bitmap(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) bool first = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) size_t left = *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) unsigned long bitmap_len = table->maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) unsigned long *bitmap = *(unsigned long **) table->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) unsigned long *tmp_bitmap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) if (!bitmap || !bitmap_len || !left || (*ppos && !write)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) *lenp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) char *p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) size_t skipped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) if (left > PAGE_SIZE - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) left = PAGE_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) /* How much of the buffer we'll skip this pass */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) skipped = *lenp - left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) tmp_bitmap = bitmap_zalloc(bitmap_len, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (!tmp_bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) proc_skip_char(&p, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) while (!err && left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) unsigned long val_a, val_b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) bool neg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) size_t saved_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) /* In case we stop parsing mid-number, we can reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) saved_left = left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) err = proc_get_long(&p, &left, &val_a, &neg, tr_a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) sizeof(tr_a), &c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) * If we consumed the entirety of a truncated buffer or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) * only one char is left (may be a "-"), then stop here,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) * reset, & come back for more.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) if ((left <= 1) && skipped) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) left = saved_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (val_a >= bitmap_len || neg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) val_b = val_a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) left--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) if (c == '-') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) err = proc_get_long(&p, &left, &val_b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) &neg, tr_b, sizeof(tr_b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) &c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * If we consumed all of a truncated buffer or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) * then stop here, reset, & come back for more.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) if (!left && skipped) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) left = saved_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) if (val_b >= bitmap_len || neg ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) val_a > val_b) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) if (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) left--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) first = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) proc_skip_char(&p, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) left += skipped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) unsigned long bit_a, bit_b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) bit_a = find_next_bit(bitmap, bitmap_len, bit_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) if (bit_a >= bitmap_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) bit_b = find_next_zero_bit(bitmap, bitmap_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) bit_a + 1) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) if (!first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) proc_put_char(&buffer, &left, ',');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) proc_put_long(&buffer, &left, bit_a, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) if (bit_a != bit_b) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) proc_put_char(&buffer, &left, '-');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) proc_put_long(&buffer, &left, bit_b, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) first = 0; bit_b++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) proc_put_char(&buffer, &left, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) if (write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if (*ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) bitmap_copy(bitmap, tmp_bitmap, bitmap_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) *lenp -= left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) *ppos += *lenp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) bitmap_free(tmp_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) #else /* CONFIG_PROC_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) int proc_dostring(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) int proc_dointvec(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) int proc_douintvec(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) int proc_dointvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) int proc_douintvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) int proc_dointvec_jiffies(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) int proc_doulongvec_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) int proc_do_large_bitmap(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) #endif /* CONFIG_PROC_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) #if defined(CONFIG_SYSCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) int proc_do_static_key(struct ctl_table *table, int write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) void *buffer, size_t *lenp, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) struct static_key *key = (struct static_key *)table->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) static DEFINE_MUTEX(static_key_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) int val, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) struct ctl_table tmp = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) .data = &val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) .maxlen = sizeof(val),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) .mode = table->mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) if (write && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) mutex_lock(&static_key_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) val = static_key_enabled(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (write && !ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) if (val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) static_key_enable(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) static_key_disable(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) mutex_unlock(&static_key_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) static struct ctl_table kern_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) .procname = "sched_child_runs_first",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) .data = &sysctl_sched_child_runs_first,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) #ifdef CONFIG_SCHED_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) .procname = "sched_min_granularity_ns",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) .data = &sysctl_sched_min_granularity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) .proc_handler = sched_proc_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) .extra1 = &min_sched_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) .extra2 = &max_sched_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) .procname = "sched_latency_ns",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) .data = &sysctl_sched_latency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) .proc_handler = sched_proc_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) .extra1 = &min_sched_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) .extra2 = &max_sched_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) .procname = "sched_wakeup_granularity_ns",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) .data = &sysctl_sched_wakeup_granularity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) .proc_handler = sched_proc_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) .extra1 = &min_wakeup_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) .extra2 = &max_wakeup_granularity_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) .procname = "sched_pelt_period",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) .data = &sysctl_sched_pelt_period,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) .proc_handler = sched_pelt_period_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) .procname = "sched_tunable_scaling",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) .data = &sysctl_sched_tunable_scaling,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) .maxlen = sizeof(enum sched_tunable_scaling),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) .proc_handler = sched_proc_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) .extra1 = &min_sched_tunable_scaling,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) .extra2 = &max_sched_tunable_scaling,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) .procname = "sched_migration_cost_ns",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) .data = &sysctl_sched_migration_cost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) .procname = "sched_nr_migrate",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) .data = &sysctl_sched_nr_migrate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) #ifdef CONFIG_SCHEDSTATS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) .procname = "sched_schedstats",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) .proc_handler = sysctl_schedstats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) #endif /* CONFIG_SCHEDSTATS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) #ifdef CONFIG_NUMA_BALANCING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) .procname = "numa_balancing_scan_delay_ms",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) .data = &sysctl_numa_balancing_scan_delay,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) .procname = "numa_balancing_scan_period_min_ms",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) .data = &sysctl_numa_balancing_scan_period_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) .procname = "numa_balancing_scan_period_max_ms",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) .data = &sysctl_numa_balancing_scan_period_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) .procname = "numa_balancing_scan_size_mb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) .data = &sysctl_numa_balancing_scan_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) .procname = "numa_balancing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) .data = NULL, /* filled in by handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) .proc_handler = sysctl_numa_balancing,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) #endif /* CONFIG_NUMA_BALANCING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) #endif /* CONFIG_SCHED_DEBUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) .procname = "sched_rt_period_us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) .data = &sysctl_sched_rt_period,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) .proc_handler = sched_rt_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) .procname = "sched_rt_runtime_us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) .data = &sysctl_sched_rt_runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) .proc_handler = sched_rt_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) .procname = "sched_deadline_period_max_us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) .data = &sysctl_sched_dl_period_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) .procname = "sched_deadline_period_min_us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) .data = &sysctl_sched_dl_period_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) .procname = "sched_rr_timeslice_ms",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) .data = &sysctl_sched_rr_timeslice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) .proc_handler = sched_rr_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) #ifdef CONFIG_UCLAMP_TASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) .procname = "sched_util_clamp_min",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) .data = &sysctl_sched_uclamp_util_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) .proc_handler = sysctl_sched_uclamp_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) .procname = "sched_util_clamp_max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) .data = &sysctl_sched_uclamp_util_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) .proc_handler = sysctl_sched_uclamp_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) .procname = "sched_util_clamp_min_rt_default",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) .data = &sysctl_sched_uclamp_util_min_rt_default,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) .proc_handler = sysctl_sched_uclamp_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) #ifdef CONFIG_SCHED_AUTOGROUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) .procname = "sched_autogroup_enabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) .data = &sysctl_sched_autogroup_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) #ifdef CONFIG_CFS_BANDWIDTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) .procname = "sched_cfs_bandwidth_slice_us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) .data = &sysctl_sched_cfs_bandwidth_slice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) .procname = "sched_energy_aware",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) .data = &sysctl_sched_energy_aware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) .proc_handler = sched_energy_aware_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) #ifdef CONFIG_PROVE_LOCKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) .procname = "prove_locking",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) .data = &prove_locking,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) #ifdef CONFIG_LOCK_STAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) .procname = "lock_stat",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) .data = &lock_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) .procname = "panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) .data = &panic_timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) #ifdef CONFIG_COREDUMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) .procname = "core_uses_pid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) .data = &core_uses_pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) .procname = "core_pattern",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) .data = core_pattern,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) .maxlen = CORENAME_MAX_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) .proc_handler = proc_dostring_coredump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) .procname = "core_pipe_limit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) .data = &core_pipe_limit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) #ifdef CONFIG_PROC_SYSCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) .procname = "tainted",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) .maxlen = sizeof(long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) .proc_handler = proc_taint,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) .procname = "sysctl_writes_strict",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) .data = &sysctl_writes_strict,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) .extra1 = &neg_one,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) #ifdef CONFIG_LATENCYTOP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) .procname = "latencytop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) .data = &latencytop_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) .proc_handler = sysctl_latencytop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) #ifdef CONFIG_BLK_DEV_INITRD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) .procname = "real-root-dev",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) .data = &real_root_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) .procname = "print-fatal-signals",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) .data = &print_fatal_signals,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) #ifdef CONFIG_SPARC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) .procname = "reboot-cmd",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) .data = reboot_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) .maxlen = 256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) .proc_handler = proc_dostring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) .procname = "stop-a",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) .data = &stop_a_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) .procname = "scons-poweroff",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) .data = &scons_pwroff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) #ifdef CONFIG_SPARC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) .procname = "tsb-ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) .data = &sysctl_tsb_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) #ifdef CONFIG_PARISC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) .procname = "soft-power",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) .data = &pwrsw_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) .procname = "unaligned-trap",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) .data = &unaligned_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) .procname = "ctrl-alt-del",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) .data = &C_A_D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) #ifdef CONFIG_FUNCTION_TRACER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) .procname = "ftrace_enabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) .data = &ftrace_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) .proc_handler = ftrace_enable_sysctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) #ifdef CONFIG_STACK_TRACER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) .procname = "stack_tracer_enabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) .data = &stack_tracer_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) .proc_handler = stack_trace_sysctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) #ifdef CONFIG_TRACING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) .procname = "ftrace_dump_on_oops",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) .data = &ftrace_dump_on_oops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) .procname = "traceoff_on_warning",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) .data = &__disable_trace_on_warning,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) .maxlen = sizeof(__disable_trace_on_warning),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) .procname = "tracepoint_printk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) .data = &tracepoint_printk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) .maxlen = sizeof(tracepoint_printk),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) .proc_handler = tracepoint_printk_sysctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) #ifdef CONFIG_KEXEC_CORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) .procname = "kexec_load_disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) .data = &kexec_load_disabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) /* only handle a transition from default "0" to "1" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) #ifdef CONFIG_MODULES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) .procname = "modprobe",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) .data = &modprobe_path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) .maxlen = KMOD_PATH_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) .proc_handler = proc_dostring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) .procname = "modules_disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) .data = &modules_disabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) /* only handle a transition from default "0" to "1" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) #ifdef CONFIG_UEVENT_HELPER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) .procname = "hotplug",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) .data = &uevent_helper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) .maxlen = UEVENT_HELPER_PATH_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) .proc_handler = proc_dostring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) #ifdef CONFIG_CHR_DEV_SG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) .procname = "sg-big-buff",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) .data = &sg_big_buff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) #ifdef CONFIG_BSD_PROCESS_ACCT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) .procname = "acct",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) .data = &acct_parm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) .maxlen = 3*sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) #ifdef CONFIG_MAGIC_SYSRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) .procname = "sysrq",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) .proc_handler = sysrq_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) #ifdef CONFIG_PROC_SYSCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) .procname = "cad_pid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) .proc_handler = proc_do_cad_pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) .procname = "threads-max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) .proc_handler = sysctl_max_threads,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) .procname = "random",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) .child = random_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) .procname = "usermodehelper",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) .child = usermodehelper_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) #ifdef CONFIG_FW_LOADER_USER_HELPER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) .procname = "firmware_config",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) .child = firmware_config_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) .procname = "overflowuid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) .data = &overflowuid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) .extra1 = &minolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) .extra2 = &maxolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) .procname = "overflowgid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) .data = &overflowgid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) .extra1 = &minolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) .extra2 = &maxolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) #ifdef CONFIG_S390
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) .procname = "userprocess_debug",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) .data = &show_unhandled_signals,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) .procname = "oops_all_cpu_backtrace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) .data = &sysctl_oops_all_cpu_backtrace,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) .procname = "pid_max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) .data = &pid_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) .extra1 = &pid_max_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) .extra2 = &pid_max_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) .procname = "panic_on_oops",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) .data = &panic_on_oops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) .procname = "panic_print",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) .data = &panic_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) #if defined CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) .procname = "printk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) .data = &console_loglevel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) .maxlen = 4*sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) .procname = "printk_ratelimit",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) .data = &printk_ratelimit_state.interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .proc_handler = proc_dointvec_jiffies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) .procname = "printk_ratelimit_burst",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) .data = &printk_ratelimit_state.burst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) .procname = "printk_delay",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) .data = &printk_delay_msec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) .extra2 = &ten_thousand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) .procname = "printk_devkmsg",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) .data = devkmsg_log_str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) .maxlen = DEVKMSG_STR_MAX_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) .proc_handler = devkmsg_sysctl_set_loglvl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) .procname = "dmesg_restrict",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) .data = &dmesg_restrict,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) .proc_handler = proc_dointvec_minmax_sysadmin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) .procname = "kptr_restrict",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) .data = &kptr_restrict,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) .proc_handler = proc_dointvec_minmax_sysadmin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) .procname = "ngroups_max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) .data = &ngroups_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) .procname = "cap_last_cap",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) .data = (void *)&cap_last_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) #if defined(CONFIG_LOCKUP_DETECTOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) .procname = "watchdog",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) .data = &watchdog_user_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) .proc_handler = proc_watchdog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) .procname = "watchdog_thresh",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) .data = &watchdog_thresh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) .proc_handler = proc_watchdog_thresh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) .extra2 = &sixty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) .procname = "nmi_watchdog",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) .data = &nmi_watchdog_user_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) .mode = NMI_WATCHDOG_SYSCTL_PERM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) .proc_handler = proc_nmi_watchdog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) .procname = "watchdog_cpumask",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) .data = &watchdog_cpumask_bits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) .maxlen = NR_CPUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) .proc_handler = proc_watchdog_cpumask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) #ifdef CONFIG_SOFTLOCKUP_DETECTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) .procname = "soft_watchdog",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) .data = &soft_watchdog_user_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) .proc_handler = proc_soft_watchdog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) .procname = "softlockup_panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) .data = &softlockup_panic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) .procname = "softlockup_all_cpu_backtrace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) .data = &sysctl_softlockup_all_cpu_backtrace,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) #ifdef CONFIG_HARDLOCKUP_DETECTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) .procname = "hardlockup_panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) .data = &hardlockup_panic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) .procname = "hardlockup_all_cpu_backtrace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) .data = &sysctl_hardlockup_all_cpu_backtrace,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) .procname = "unknown_nmi_panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) .data = &unknown_nmi_panic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) #if (defined(CONFIG_X86_32) || defined(CONFIG_PARISC)) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) defined(CONFIG_DEBUG_STACKOVERFLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) .procname = "panic_on_stackoverflow",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) .data = &sysctl_panic_on_stackoverflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) #if defined(CONFIG_X86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) .procname = "panic_on_unrecovered_nmi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) .data = &panic_on_unrecovered_nmi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) .procname = "panic_on_io_nmi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) .data = &panic_on_io_nmi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) .procname = "bootloader_type",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) .data = &bootloader_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) .procname = "bootloader_version",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) .data = &bootloader_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) .procname = "io_delay_type",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) .data = &io_delay_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) #if defined(CONFIG_MMU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) .procname = "randomize_va_space",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) .data = &randomize_va_space,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) #if defined(CONFIG_S390) && defined(CONFIG_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) .procname = "spin_retry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) .data = &spin_retry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) #if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) .procname = "acpi_video_flags",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) .data = &acpi_realmode_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) .maxlen = sizeof (unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) .procname = "ignore-unaligned-usertrap",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) .data = &no_unaligned_warning,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) #ifdef CONFIG_IA64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) .procname = "unaligned-dump-stack",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) .data = &unaligned_dump_stack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) .maxlen = sizeof (int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) #ifdef CONFIG_DETECT_HUNG_TASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) .procname = "hung_task_all_cpu_backtrace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) .data = &sysctl_hung_task_all_cpu_backtrace,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) .procname = "hung_task_panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) .data = &sysctl_hung_task_panic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) .procname = "hung_task_check_count",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) .data = &sysctl_hung_task_check_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) .procname = "hung_task_timeout_secs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) .data = &sysctl_hung_task_timeout_secs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) .proc_handler = proc_dohung_task_timeout_secs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) .extra2 = &hung_task_timeout_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) .procname = "hung_task_check_interval_secs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) .data = &sysctl_hung_task_check_interval_secs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) .proc_handler = proc_dohung_task_timeout_secs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) .extra2 = &hung_task_timeout_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) .procname = "hung_task_warnings",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) .data = &sysctl_hung_task_warnings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) .extra1 = &neg_one,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) #ifdef CONFIG_RT_MUTEXES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) .procname = "max_lock_depth",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) .data = &max_lock_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) .procname = "poweroff_cmd",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) .data = &poweroff_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) .maxlen = POWEROFF_CMD_PATH_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) .proc_handler = proc_dostring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) #ifdef CONFIG_KEYS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) .procname = "keys",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) .child = key_sysctls,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) #ifdef CONFIG_PERF_EVENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) * User-space scripts rely on the existence of this file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) * as a feature check for perf_events being enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) * So it's an ABI, do not remove!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) .procname = "perf_event_paranoid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) .data = &sysctl_perf_event_paranoid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) .maxlen = sizeof(sysctl_perf_event_paranoid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) .procname = "perf_event_mlock_kb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) .data = &sysctl_perf_event_mlock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) .maxlen = sizeof(sysctl_perf_event_mlock),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) .procname = "perf_event_max_sample_rate",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) .data = &sysctl_perf_event_sample_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) .maxlen = sizeof(sysctl_perf_event_sample_rate),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) .proc_handler = perf_proc_update_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) .procname = "perf_cpu_time_max_percent",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) .data = &sysctl_perf_cpu_time_max_percent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) .maxlen = sizeof(sysctl_perf_cpu_time_max_percent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) .proc_handler = perf_cpu_time_max_percent_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) .procname = "perf_event_max_stack",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) .data = &sysctl_perf_event_max_stack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) .maxlen = sizeof(sysctl_perf_event_max_stack),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) .proc_handler = perf_event_max_stack_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) .extra2 = &six_hundred_forty_kb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) .procname = "perf_event_max_contexts_per_stack",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) .data = &sysctl_perf_event_max_contexts_per_stack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) .maxlen = sizeof(sysctl_perf_event_max_contexts_per_stack),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) .proc_handler = perf_event_max_stack_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) .extra2 = &one_thousand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) .procname = "panic_on_warn",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) .data = &panic_on_warn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) .procname = "timer_migration",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) .data = &sysctl_timer_migration,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) .proc_handler = timer_migration_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) #ifdef CONFIG_BPF_SYSCALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) .procname = "unprivileged_bpf_disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) .data = &sysctl_unprivileged_bpf_disabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) .maxlen = sizeof(sysctl_unprivileged_bpf_disabled),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) .proc_handler = bpf_unpriv_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) .procname = "bpf_stats_enabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) .data = &bpf_stats_enabled_key.key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) .maxlen = sizeof(bpf_stats_enabled_key),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) .proc_handler = bpf_stats_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) #if defined(CONFIG_TREE_RCU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) .procname = "panic_on_rcu_stall",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) .data = &sysctl_panic_on_rcu_stall,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) .maxlen = sizeof(sysctl_panic_on_rcu_stall),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) #ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) .procname = "stack_erasing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) .proc_handler = stack_erasing_sysctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) static struct ctl_table vm_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) .procname = "overcommit_memory",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) .data = &sysctl_overcommit_memory,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) .maxlen = sizeof(sysctl_overcommit_memory),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) .proc_handler = overcommit_policy_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) .procname = "panic_on_oom",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) .data = &sysctl_panic_on_oom,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) .maxlen = sizeof(sysctl_panic_on_oom),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) .procname = "oom_kill_allocating_task",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) .data = &sysctl_oom_kill_allocating_task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) .maxlen = sizeof(sysctl_oom_kill_allocating_task),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) .procname = "oom_dump_tasks",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) .data = &sysctl_oom_dump_tasks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) .maxlen = sizeof(sysctl_oom_dump_tasks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) .procname = "overcommit_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) .data = &sysctl_overcommit_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) .maxlen = sizeof(sysctl_overcommit_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) .proc_handler = overcommit_ratio_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) .procname = "overcommit_kbytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) .data = &sysctl_overcommit_kbytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) .maxlen = sizeof(sysctl_overcommit_kbytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) .proc_handler = overcommit_kbytes_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) .procname = "page-cluster",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) .data = &page_cluster,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) .procname = "dirty_background_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) .data = &dirty_background_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) .maxlen = sizeof(dirty_background_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) .proc_handler = dirty_background_ratio_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) .procname = "dirty_background_bytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) .data = &dirty_background_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) .maxlen = sizeof(dirty_background_bytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) .proc_handler = dirty_background_bytes_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) .extra1 = &one_ul,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) .procname = "dirty_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) .data = &vm_dirty_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) .maxlen = sizeof(vm_dirty_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) .proc_handler = dirty_ratio_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) .procname = "dirty_bytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) .data = &vm_dirty_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) .maxlen = sizeof(vm_dirty_bytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) .proc_handler = dirty_bytes_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) .extra1 = &dirty_bytes_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) .procname = "dirty_writeback_centisecs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) .data = &dirty_writeback_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) .maxlen = sizeof(dirty_writeback_interval),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) .proc_handler = dirty_writeback_centisecs_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) .procname = "dirty_expire_centisecs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) .data = &dirty_expire_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) .maxlen = sizeof(dirty_expire_interval),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) .procname = "dirtytime_expire_seconds",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) .data = &dirtytime_expire_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) .maxlen = sizeof(dirtytime_expire_interval),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) .proc_handler = dirtytime_interval_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) .procname = "swappiness",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) .data = &vm_swappiness,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) .maxlen = sizeof(vm_swappiness),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) .extra2 = &two_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) #ifdef CONFIG_HUGETLB_PAGE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) .procname = "nr_hugepages",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) .proc_handler = hugetlb_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) #ifdef CONFIG_NUMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) .procname = "nr_hugepages_mempolicy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) .proc_handler = &hugetlb_mempolicy_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) .procname = "numa_stat",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) .data = &sysctl_vm_numa_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) .proc_handler = sysctl_vm_numa_stat_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) .procname = "hugetlb_shm_group",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) .data = &sysctl_hugetlb_shm_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) .maxlen = sizeof(gid_t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) .procname = "nr_overcommit_hugepages",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) .proc_handler = hugetlb_overcommit_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) .procname = "lowmem_reserve_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) .data = &sysctl_lowmem_reserve_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) .maxlen = sizeof(sysctl_lowmem_reserve_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) .proc_handler = lowmem_reserve_ratio_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) .procname = "drop_caches",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) .data = &sysctl_drop_caches,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) .mode = 0200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) .proc_handler = drop_caches_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) .extra2 = &four,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) #ifdef CONFIG_COMPACTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) .procname = "compact_memory",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) .data = &sysctl_compact_memory,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) .mode = 0200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) .proc_handler = sysctl_compaction_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) .procname = "compaction_proactiveness",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) .data = &sysctl_compaction_proactiveness,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) .maxlen = sizeof(sysctl_compaction_proactiveness),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) .proc_handler = compaction_proactiveness_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) .procname = "extfrag_threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) .data = &sysctl_extfrag_threshold,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) .extra1 = &min_extfrag_threshold,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) .extra2 = &max_extfrag_threshold,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) .procname = "compact_unevictable_allowed",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) .data = &sysctl_compact_unevictable_allowed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) .proc_handler = proc_dointvec_minmax_warn_RT_change,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) #endif /* CONFIG_COMPACTION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) .procname = "min_free_kbytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) .data = &min_free_kbytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) .maxlen = sizeof(min_free_kbytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) .proc_handler = min_free_kbytes_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) .procname = "watermark_boost_factor",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) .data = &watermark_boost_factor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) .maxlen = sizeof(watermark_boost_factor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) .procname = "watermark_scale_factor",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) .data = &watermark_scale_factor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) .maxlen = sizeof(watermark_scale_factor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) .proc_handler = watermark_scale_factor_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) .extra2 = &one_thousand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) .procname = "extra_free_kbytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) .data = &extra_free_kbytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) .maxlen = sizeof(extra_free_kbytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) .proc_handler = min_free_kbytes_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) .procname = "percpu_pagelist_fraction",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) .data = &percpu_pagelist_fraction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) .maxlen = sizeof(percpu_pagelist_fraction),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) .proc_handler = percpu_pagelist_fraction_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) .procname = "page_lock_unfairness",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) .data = &sysctl_page_lock_unfairness,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) .maxlen = sizeof(sysctl_page_lock_unfairness),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) #ifdef CONFIG_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) .procname = "max_map_count",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) .data = &sysctl_max_map_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) .maxlen = sizeof(sysctl_max_map_count),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) .procname = "nr_trim_pages",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) .data = &sysctl_nr_trim_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) .maxlen = sizeof(sysctl_nr_trim_pages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) .procname = "laptop_mode",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) .data = &laptop_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) .maxlen = sizeof(laptop_mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) .proc_handler = proc_dointvec_jiffies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) .procname = "block_dump",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) .data = &block_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) .maxlen = sizeof(block_dump),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) .procname = "vfs_cache_pressure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) .data = &sysctl_vfs_cache_pressure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) .maxlen = sizeof(sysctl_vfs_cache_pressure),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) defined(CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) .procname = "legacy_va_layout",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) .data = &sysctl_legacy_va_layout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) .maxlen = sizeof(sysctl_legacy_va_layout),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) #ifdef CONFIG_NUMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) .procname = "zone_reclaim_mode",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) .data = &node_reclaim_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) .maxlen = sizeof(node_reclaim_mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) .procname = "min_unmapped_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) .data = &sysctl_min_unmapped_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) .maxlen = sizeof(sysctl_min_unmapped_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) .proc_handler = sysctl_min_unmapped_ratio_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) .procname = "min_slab_ratio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) .data = &sysctl_min_slab_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) .maxlen = sizeof(sysctl_min_slab_ratio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) .proc_handler = sysctl_min_slab_ratio_sysctl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) .extra2 = &one_hundred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) .procname = "stat_interval",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) .data = &sysctl_stat_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) .maxlen = sizeof(sysctl_stat_interval),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) .proc_handler = proc_dointvec_jiffies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) .procname = "stat_refresh",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) .data = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) .maxlen = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) .proc_handler = vmstat_refresh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) #ifdef CONFIG_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) .procname = "mmap_min_addr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) .data = &dac_mmap_min_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) .maxlen = sizeof(unsigned long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) .proc_handler = mmap_min_addr_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) #ifdef CONFIG_NUMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) .procname = "numa_zonelist_order",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) .data = &numa_zonelist_order,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) .maxlen = NUMA_ZONELIST_ORDER_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) .proc_handler = numa_zonelist_order_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) #if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) .procname = "vdso_enabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) .data = &vdso32_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) .maxlen = sizeof(vdso32_enabled),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) .data = &vdso_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) .maxlen = sizeof(vdso_enabled),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) #ifdef CONFIG_HIGHMEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) .procname = "highmem_is_dirtyable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) .data = &vm_highmem_is_dirtyable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) .maxlen = sizeof(vm_highmem_is_dirtyable),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) #ifdef CONFIG_MEMORY_FAILURE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) .procname = "memory_failure_early_kill",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) .data = &sysctl_memory_failure_early_kill,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) .maxlen = sizeof(sysctl_memory_failure_early_kill),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) .procname = "memory_failure_recovery",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) .data = &sysctl_memory_failure_recovery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) .maxlen = sizeof(sysctl_memory_failure_recovery),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) .procname = "user_reserve_kbytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) .data = &sysctl_user_reserve_kbytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) .maxlen = sizeof(sysctl_user_reserve_kbytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) .procname = "admin_reserve_kbytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) .data = &sysctl_admin_reserve_kbytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) .maxlen = sizeof(sysctl_admin_reserve_kbytes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) #ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) .procname = "mmap_rnd_bits",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) .data = &mmap_rnd_bits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) .maxlen = sizeof(mmap_rnd_bits),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) .extra1 = (void *)&mmap_rnd_bits_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) .extra2 = (void *)&mmap_rnd_bits_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) #ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) .procname = "mmap_rnd_compat_bits",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) .data = &mmap_rnd_compat_bits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) .maxlen = sizeof(mmap_rnd_compat_bits),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) .extra1 = (void *)&mmap_rnd_compat_bits_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) .extra2 = (void *)&mmap_rnd_compat_bits_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) #ifdef CONFIG_USERFAULTFD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) .procname = "unprivileged_userfaultfd",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) .data = &sysctl_unprivileged_userfaultfd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) .maxlen = sizeof(sysctl_unprivileged_userfaultfd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) static struct ctl_table fs_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) .procname = "inode-nr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) .data = &inodes_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) .maxlen = 2*sizeof(long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) .proc_handler = proc_nr_inodes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) .procname = "inode-state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) .data = &inodes_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) .maxlen = 7*sizeof(long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) .proc_handler = proc_nr_inodes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) .procname = "file-nr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) .data = &files_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) .maxlen = sizeof(files_stat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) .proc_handler = proc_nr_files,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) .procname = "file-max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) .data = &files_stat.max_files,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) .maxlen = sizeof(files_stat.max_files),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) .extra1 = &zero_ul,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) .extra2 = &long_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) .procname = "nr_open",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) .data = &sysctl_nr_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) .extra1 = &sysctl_nr_open_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) .extra2 = &sysctl_nr_open_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) .procname = "dentry-state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) .data = &dentry_stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) .maxlen = 6*sizeof(long),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) .proc_handler = proc_nr_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) .procname = "overflowuid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) .data = &fs_overflowuid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) .extra1 = &minolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) .extra2 = &maxolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) .procname = "overflowgid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) .data = &fs_overflowgid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) .extra1 = &minolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) .extra2 = &maxolduid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) #ifdef CONFIG_FILE_LOCKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) .procname = "leases-enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) .data = &leases_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) #ifdef CONFIG_DNOTIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) .procname = "dir-notify-enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) .data = &dir_notify_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) #ifdef CONFIG_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) #ifdef CONFIG_FILE_LOCKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) .procname = "lease-break-time",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) .data = &lease_break_time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) .proc_handler = proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) #ifdef CONFIG_AIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) .procname = "aio-nr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) .data = &aio_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) .maxlen = sizeof(aio_nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) .mode = 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) .procname = "aio-max-nr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) .data = &aio_max_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) .maxlen = sizeof(aio_max_nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) #endif /* CONFIG_AIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) #ifdef CONFIG_INOTIFY_USER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) .procname = "inotify",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) .child = inotify_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) #ifdef CONFIG_EPOLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) .procname = "epoll",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) .child = epoll_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) .procname = "protected_symlinks",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) .data = &sysctl_protected_symlinks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) .procname = "protected_hardlinks",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) .data = &sysctl_protected_hardlinks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) .procname = "protected_fifos",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) .data = &sysctl_protected_fifos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) .procname = "protected_regular",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) .data = &sysctl_protected_regular,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) .mode = 0600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) .procname = "suid_dumpable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) .data = &suid_dumpable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) .proc_handler = proc_dointvec_minmax_coredump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) .extra2 = &two,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) .procname = "binfmt_misc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) .child = sysctl_mount_point,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) .procname = "pipe-max-size",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) .data = &pipe_max_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) .maxlen = sizeof(pipe_max_size),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) .proc_handler = proc_dopipe_max_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) .procname = "pipe-user-pages-hard",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) .data = &pipe_user_pages_hard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) .maxlen = sizeof(pipe_user_pages_hard),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) .procname = "pipe-user-pages-soft",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) .data = &pipe_user_pages_soft,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) .maxlen = sizeof(pipe_user_pages_soft),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) .proc_handler = proc_doulongvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) .procname = "mount-max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) .data = &sysctl_mount_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) .maxlen = sizeof(unsigned int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) .proc_handler = proc_dointvec_minmax,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) .extra1 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) static struct ctl_table debug_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) #ifdef CONFIG_SYSCTL_EXCEPTION_TRACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) .procname = "exception-trace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) .data = &show_unhandled_signals,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) .proc_handler = proc_dointvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) #if defined(CONFIG_OPTPROBES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) .procname = "kprobes-optimization",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) .data = &sysctl_kprobes_optimization,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) .proc_handler = proc_kprobes_optimization_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) .extra1 = SYSCTL_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) .extra2 = SYSCTL_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) static struct ctl_table dev_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) static struct ctl_table sysctl_base_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) .procname = "kernel",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) .child = kern_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) .procname = "vm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) .child = vm_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) .procname = "fs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) .child = fs_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) .procname = "debug",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) .child = debug_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) .procname = "dev",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) .mode = 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) .child = dev_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) int __init sysctl_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) struct ctl_table_header *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) hdr = register_sysctl_table(sysctl_base_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) kmemleak_not_leak(hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) #endif /* CONFIG_SYSCTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) * No sense putting this after each symbol definition, twice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) * exception granted :-)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) EXPORT_SYMBOL(proc_dointvec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) EXPORT_SYMBOL(proc_douintvec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) EXPORT_SYMBOL(proc_dointvec_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) EXPORT_SYMBOL(proc_dointvec_minmax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) EXPORT_SYMBOL_GPL(proc_douintvec_minmax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) EXPORT_SYMBOL(proc_dostring);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) EXPORT_SYMBOL(proc_doulongvec_minmax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) EXPORT_SYMBOL(proc_do_large_bitmap);