1457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * sysctl.c: General linux system control interface 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Begun 24 March 1995, Stephen Tweedie 61da177e4SLinus Torvalds * Added /proc support, Dec 1995 71da177e4SLinus Torvalds * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas. 81da177e4SLinus Torvalds * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver. 91da177e4SLinus Torvalds * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver. 101da177e4SLinus Torvalds * Dynamic registration fixes, Stephen Tweedie. 111da177e4SLinus Torvalds * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn. 121da177e4SLinus Torvalds * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris 131da177e4SLinus Torvalds * Horn. 141da177e4SLinus Torvalds * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer. 151da177e4SLinus Torvalds * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer. 161da177e4SLinus Torvalds * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill 171da177e4SLinus Torvalds * Wendling. 181da177e4SLinus Torvalds * The list_for_each() macro wasn't appropriate for the sysctl loop. 191da177e4SLinus Torvalds * Removed it and replaced it with older style, 03/23/00, Bill Wendling 201da177e4SLinus Torvalds */ 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds #include <linux/module.h> 23e2e40f2cSChristoph Hellwig #include <linux/aio.h> 241da177e4SLinus Torvalds #include <linux/mm.h> 251da177e4SLinus Torvalds #include <linux/swap.h> 261da177e4SLinus Torvalds #include <linux/slab.h> 271da177e4SLinus Torvalds #include <linux/sysctl.h> 285a04cca6SAkinobu Mita #include <linux/bitmap.h> 29d33ed52dSDave Young #include <linux/signal.h> 30455cd5abSDan Rosenberg #include <linux/printk.h> 311da177e4SLinus Torvalds #include <linux/proc_fs.h> 3272c2d582SAndrew Morgan #include <linux/security.h> 331da177e4SLinus Torvalds #include <linux/ctype.h> 34fd4b616bSSteven Rostedt #include <linux/kmemleak.h> 3562239ac2SAdrian Bunk #include <linux/fs.h> 361da177e4SLinus Torvalds #include <linux/init.h> 371da177e4SLinus Torvalds #include <linux/kernel.h> 380296b228SKay Sievers #include <linux/kobject.h> 3920380731SArnaldo Carvalho de Melo #include <linux/net.h> 401da177e4SLinus Torvalds #include <linux/sysrq.h> 411da177e4SLinus Torvalds #include <linux/highuid.h> 421da177e4SLinus Torvalds #include <linux/writeback.h> 433fff4c42SIngo Molnar #include <linux/ratelimit.h> 4476ab0f53SMel Gorman #include <linux/compaction.h> 451da177e4SLinus Torvalds #include <linux/hugetlb.h> 461da177e4SLinus Torvalds #include <linux/initrd.h> 470b77f5bfSDavid Howells #include <linux/key.h> 481da177e4SLinus Torvalds #include <linux/times.h> 491da177e4SLinus Torvalds #include <linux/limits.h> 501da177e4SLinus Torvalds #include <linux/dcache.h> 516e006701SAlexey Dobriyan #include <linux/dnotify.h> 521da177e4SLinus Torvalds #include <linux/syscalls.h> 53c748e134SAdrian Bunk #include <linux/vmstat.h> 54c255d844SPavel Machek #include <linux/nfs_fs.h> 55c255d844SPavel Machek #include <linux/acpi.h> 5610a0a8d4SJeremy Fitzhardinge #include <linux/reboot.h> 57b0fc494fSSteven Rostedt #include <linux/ftrace.h> 58cdd6c482SIngo Molnar #include <linux/perf_event.h> 59b2be84dfSMasami Hiramatsu #include <linux/kprobes.h> 60b492e95bSJens Axboe #include <linux/pipe_fs_i.h> 618e4228e1SDavid Rientjes #include <linux/oom.h> 6217f60a7dSEric Paris #include <linux/kmod.h> 6373efc039SDan Ballard #include <linux/capability.h> 6440401530SAl Viro #include <linux/binfmts.h> 65cf4aebc2SClark Williams #include <linux/sched/sysctl.h> 66f7ccbae4SIngo Molnar #include <linux/sched/coredump.h> 677984754bSKees Cook #include <linux/kexec.h> 681be7f75dSAlexei Starovoitov #include <linux/bpf.h> 69d2921684SEric W. Biederman #include <linux/mount.h> 70cefdca0aSPeter Xu #include <linux/userfaultfd_k.h> 711da177e4SLinus Torvalds 727f2923c4SChristian Brauner #include "../lib/kstrtox.h" 737f2923c4SChristian Brauner 747c0f6ba6SLinus Torvalds #include <linux/uaccess.h> 751da177e4SLinus Torvalds #include <asm/processor.h> 761da177e4SLinus Torvalds 7729cbc78bSAndi Kleen #ifdef CONFIG_X86 7829cbc78bSAndi Kleen #include <asm/nmi.h> 790741f4d2SChuck Ebbert #include <asm/stacktrace.h> 806e7c4025SIngo Molnar #include <asm/io.h> 8129cbc78bSAndi Kleen #endif 82d550bbd4SDavid Howells #ifdef CONFIG_SPARC 83d550bbd4SDavid Howells #include <asm/setup.h> 84d550bbd4SDavid Howells #endif 85c55b7c3eSDave Young #ifdef CONFIG_BSD_PROCESS_ACCT 86c55b7c3eSDave Young #include <linux/acct.h> 87c55b7c3eSDave Young #endif 884f0e056fSDave Young #ifdef CONFIG_RT_MUTEXES 894f0e056fSDave Young #include <linux/rtmutex.h> 904f0e056fSDave Young #endif 912edf5e49SDave Young #if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT) 922edf5e49SDave Young #include <linux/lockdep.h> 932edf5e49SDave Young #endif 9415485a46SDave Young #ifdef CONFIG_CHR_DEV_SG 9515485a46SDave Young #include <scsi/sg.h> 9615485a46SDave Young #endif 97964c9dffSAlexander Popov #ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE 98964c9dffSAlexander Popov #include <linux/stackleak.h> 99964c9dffSAlexander Popov #endif 10058687acbSDon Zickus #ifdef CONFIG_LOCKUP_DETECTOR 101504d7cf1SDon Zickus #include <linux/nmi.h> 102504d7cf1SDon Zickus #endif 103504d7cf1SDon Zickus 1041da177e4SLinus Torvalds #if defined(CONFIG_SYSCTL) 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds /* External variables not in a header file. */ 107d6e71144SAlan Cox extern int suid_dumpable; 108046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 109046d662fSAlex Kelly extern int core_uses_pid; 1101da177e4SLinus Torvalds extern char core_pattern[]; 111a293980cSNeil Horman extern unsigned int core_pipe_limit; 112046d662fSAlex Kelly #endif 1131da177e4SLinus Torvalds extern int pid_max; 1141da177e4SLinus Torvalds extern int pid_max_min, pid_max_max; 1158ad4b1fbSRohit Seth extern int percpu_pagelist_fraction; 1169745512cSArjan van de Ven extern int latencytop_enabled; 1179b80a184SAlexey Dobriyan extern unsigned int sysctl_nr_open_min, sysctl_nr_open_max; 118dd8632a1SPaul Mundt #ifndef CONFIG_MMU 119dd8632a1SPaul Mundt extern int sysctl_nr_trim_pages; 120dd8632a1SPaul Mundt #endif 1211da177e4SLinus Torvalds 122c4f3b63fSRavikiran G Thirumalai /* Constants used for minimum and maximum */ 1232508ce18SDon Zickus #ifdef CONFIG_LOCKUP_DETECTOR 124c4f3b63fSRavikiran G Thirumalai static int sixty = 60; 125c4f3b63fSRavikiran G Thirumalai #endif 126c4f3b63fSRavikiran G Thirumalai 127270750dbSAaron Tomlin static int __maybe_unused neg_one = -1; 128cd5f9a4cSLinus Torvalds static int __maybe_unused two = 2; 1295509a5d2SDave Hansen static int __maybe_unused four = 4; 1309002b214SWill Deacon static unsigned long zero_ul; 131fc3501d4SSven Wegener static unsigned long one_ul = 1; 13232a5ad9cSChristian Brauner static unsigned long long_max = LONG_MAX; 133c4f3b63fSRavikiran G Thirumalai static int one_hundred = 100; 134795ae7a0SJohannes Weiner static int one_thousand = 1000; 135af91322eSDave Young #ifdef CONFIG_PRINTK 136af91322eSDave Young static int ten_thousand = 10000; 137af91322eSDave Young #endif 138c5dfd78eSArnaldo Carvalho de Melo #ifdef CONFIG_PERF_EVENTS 139c5dfd78eSArnaldo Carvalho de Melo static int six_hundred_forty_kb = 640 * 1024; 140c5dfd78eSArnaldo Carvalho de Melo #endif 141c4f3b63fSRavikiran G Thirumalai 1429e4a5bdaSAndrea Righi /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */ 1439e4a5bdaSAndrea Righi static unsigned long dirty_bytes_min = 2 * PAGE_SIZE; 1449e4a5bdaSAndrea Righi 1451da177e4SLinus Torvalds /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ 1461da177e4SLinus Torvalds static int maxolduid = 65535; 1471da177e4SLinus Torvalds static int minolduid; 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds static int ngroups_max = NGROUPS_MAX; 15073efc039SDan Ballard static const int cap_last_cap = CAP_LAST_CAP; 1511da177e4SLinus Torvalds 152a2e51445SDmitry Vyukov /* 153a2e51445SDmitry Vyukov * This is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs 154a2e51445SDmitry Vyukov * and hung_task_check_interval_secs 155a2e51445SDmitry Vyukov */ 15680df2847SLiu Hua #ifdef CONFIG_DETECT_HUNG_TASK 15780df2847SLiu Hua static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); 15880df2847SLiu Hua #endif 15980df2847SLiu Hua 160d14f1729SDave Young #ifdef CONFIG_INOTIFY_USER 161d14f1729SDave Young #include <linux/inotify.h> 162d14f1729SDave Young #endif 16372c57ed5SDavid S. Miller #ifdef CONFIG_SPARC 1641da177e4SLinus Torvalds #endif 1651da177e4SLinus Torvalds 166b67114dbSHelge Deller #ifdef CONFIG_PARISC 1671da177e4SLinus Torvalds extern int pwrsw_enabled; 168bf14e3b9SVineet Gupta #endif 169bf14e3b9SVineet Gupta 170bf14e3b9SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW 1711da177e4SLinus Torvalds extern int unaligned_enabled; 1721da177e4SLinus Torvalds #endif 1731da177e4SLinus Torvalds 174d2b176edSJes Sorensen #ifdef CONFIG_IA64 17588fc241fSDoug Chapman extern int unaligned_dump_stack; 176d2b176edSJes Sorensen #endif 177d2b176edSJes Sorensen 178b6fca725SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN 179b6fca725SVineet Gupta extern int no_unaligned_warning; 180b6fca725SVineet Gupta #endif 181b6fca725SVineet Gupta 182d6f8ff73SRandy Dunlap #ifdef CONFIG_PROC_SYSCTL 183f4aacea2SKees Cook 184a19ac337SLuis R. Rodriguez /** 185a19ac337SLuis R. Rodriguez * enum sysctl_writes_mode - supported sysctl write modes 186a19ac337SLuis R. Rodriguez * 187a19ac337SLuis R. Rodriguez * @SYSCTL_WRITES_LEGACY: each write syscall must fully contain the sysctl value 188a19ac337SLuis R. Rodriguez * to be written, and multiple writes on the same sysctl file descriptor 189a19ac337SLuis R. Rodriguez * will rewrite the sysctl value, regardless of file position. No warning 190a19ac337SLuis R. Rodriguez * is issued when the initial position is not 0. 191a19ac337SLuis R. Rodriguez * @SYSCTL_WRITES_WARN: same as above but warn when the initial file position is 192a19ac337SLuis R. Rodriguez * not 0. 193a19ac337SLuis R. Rodriguez * @SYSCTL_WRITES_STRICT: writes to numeric sysctl entries must always be at 194a19ac337SLuis R. Rodriguez * file position 0 and the value must be fully contained in the buffer 195a19ac337SLuis R. Rodriguez * sent to the write syscall. If dealing with strings respect the file 196a19ac337SLuis R. Rodriguez * position, but restrict this to the max length of the buffer, anything 19765f50f25SWeitao Hou * passed the max length will be ignored. Multiple writes will append 198a19ac337SLuis R. Rodriguez * to the buffer. 199a19ac337SLuis R. Rodriguez * 200a19ac337SLuis R. Rodriguez * These write modes control how current file position affects the behavior of 201a19ac337SLuis R. Rodriguez * updating sysctl values through the proc interface on each write. 202a19ac337SLuis R. Rodriguez */ 203a19ac337SLuis R. Rodriguez enum sysctl_writes_mode { 204a19ac337SLuis R. Rodriguez SYSCTL_WRITES_LEGACY = -1, 205a19ac337SLuis R. Rodriguez SYSCTL_WRITES_WARN = 0, 206a19ac337SLuis R. Rodriguez SYSCTL_WRITES_STRICT = 1, 207a19ac337SLuis R. Rodriguez }; 208f4aacea2SKees Cook 209a19ac337SLuis R. Rodriguez static enum sysctl_writes_mode sysctl_writes_strict = SYSCTL_WRITES_STRICT; 210f4aacea2SKees Cook 2118d65af78SAlexey Dobriyan static int proc_do_cad_pid(struct ctl_table *table, int write, 2129ec52099SCedric Le Goater void __user *buffer, size_t *lenp, loff_t *ppos); 2138d65af78SAlexey Dobriyan static int proc_taint(struct ctl_table *table, int write, 21434f5a398STheodore Ts'o void __user *buffer, size_t *lenp, loff_t *ppos); 2156923aa0dSSebastian Andrzej Siewior #ifdef CONFIG_COMPACTION 2166923aa0dSSebastian Andrzej Siewior static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table, 2176923aa0dSSebastian Andrzej Siewior int write, void __user *buffer, 2186923aa0dSSebastian Andrzej Siewior size_t *lenp, loff_t *ppos); 2196923aa0dSSebastian Andrzej Siewior #endif 220d6f8ff73SRandy Dunlap #endif 2219ec52099SCedric Le Goater 222bfdc0b49SRichard Weinberger #ifdef CONFIG_PRINTK 223620f6e8eSKees Cook static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, 224bfdc0b49SRichard Weinberger void __user *buffer, size_t *lenp, loff_t *ppos); 225bfdc0b49SRichard Weinberger #endif 226bfdc0b49SRichard Weinberger 22754b50199SKees Cook static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, 22854b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos); 229046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 23054b50199SKees Cook static int proc_dostring_coredump(struct ctl_table *table, int write, 23154b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos); 232046d662fSAlex Kelly #endif 233319e0a21SEric Biggers static int proc_dopipe_max_size(struct ctl_table *table, int write, 234319e0a21SEric Biggers void __user *buffer, size_t *lenp, loff_t *ppos); 23554b50199SKees Cook 23697f5f0cdSDmitry Torokhov #ifdef CONFIG_MAGIC_SYSRQ 2376f8fd1d7SJoe Perches static int sysrq_sysctl_handler(struct ctl_table *table, int write, 238eaee4172SDmitry Safonov void __user *buffer, size_t *lenp, loff_t *ppos); 23997f5f0cdSDmitry Torokhov #endif 24097f5f0cdSDmitry Torokhov 241d8217f07SEric W. Biederman static struct ctl_table kern_table[]; 242d8217f07SEric W. Biederman static struct ctl_table vm_table[]; 243d8217f07SEric W. Biederman static struct ctl_table fs_table[]; 244d8217f07SEric W. Biederman static struct ctl_table debug_table[]; 245d8217f07SEric W. Biederman static struct ctl_table dev_table[]; 246d8217f07SEric W. Biederman extern struct ctl_table random_table[]; 2477ef9964eSDavide Libenzi #ifdef CONFIG_EPOLL 2487ef9964eSDavide Libenzi extern struct ctl_table epoll_table[]; 2497ef9964eSDavide Libenzi #endif 2501da177e4SLinus Torvalds 251ceb18132SLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER 252ceb18132SLuis R. Rodriguez extern struct ctl_table firmware_config_table[]; 253ceb18132SLuis R. Rodriguez #endif 254ceb18132SLuis R. Rodriguez 25567f3977fSAlexandre Ghiti #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \ 25667f3977fSAlexandre Ghiti defined(CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT) 2571da177e4SLinus Torvalds int sysctl_legacy_va_layout; 2581da177e4SLinus Torvalds #endif 2591da177e4SLinus Torvalds 2601da177e4SLinus Torvalds /* The default sysctl tables: */ 2611da177e4SLinus Torvalds 262de4e83bdSEric W. Biederman static struct ctl_table sysctl_base_table[] = { 2631da177e4SLinus Torvalds { 2641da177e4SLinus Torvalds .procname = "kernel", 2651da177e4SLinus Torvalds .mode = 0555, 2661da177e4SLinus Torvalds .child = kern_table, 2671da177e4SLinus Torvalds }, 2681da177e4SLinus Torvalds { 2691da177e4SLinus Torvalds .procname = "vm", 2701da177e4SLinus Torvalds .mode = 0555, 2711da177e4SLinus Torvalds .child = vm_table, 2721da177e4SLinus Torvalds }, 2731da177e4SLinus Torvalds { 2741da177e4SLinus Torvalds .procname = "fs", 2751da177e4SLinus Torvalds .mode = 0555, 2761da177e4SLinus Torvalds .child = fs_table, 2771da177e4SLinus Torvalds }, 2781da177e4SLinus Torvalds { 2791da177e4SLinus Torvalds .procname = "debug", 2801da177e4SLinus Torvalds .mode = 0555, 2811da177e4SLinus Torvalds .child = debug_table, 2821da177e4SLinus Torvalds }, 2831da177e4SLinus Torvalds { 2841da177e4SLinus Torvalds .procname = "dev", 2851da177e4SLinus Torvalds .mode = 0555, 2861da177e4SLinus Torvalds .child = dev_table, 2871da177e4SLinus Torvalds }, 2886fce56ecSEric W. Biederman { } 2891da177e4SLinus Torvalds }; 2901da177e4SLinus Torvalds 29177e54a1fSIngo Molnar #ifdef CONFIG_SCHED_DEBUG 29273c4efd2SEric Dumazet static int min_sched_granularity_ns = 100000; /* 100 usecs */ 29373c4efd2SEric Dumazet static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ 29473c4efd2SEric Dumazet static int min_wakeup_granularity_ns; /* 0 usecs */ 29573c4efd2SEric Dumazet static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */ 296cbee9f88SPeter Zijlstra #ifdef CONFIG_SMP 2971983a922SChristian Ehrhardt static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE; 2981983a922SChristian Ehrhardt static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1; 299cbee9f88SPeter Zijlstra #endif /* CONFIG_SMP */ 300cbee9f88SPeter Zijlstra #endif /* CONFIG_SCHED_DEBUG */ 30177e54a1fSIngo Molnar 3025e771905SMel Gorman #ifdef CONFIG_COMPACTION 3035e771905SMel Gorman static int min_extfrag_threshold; 3045e771905SMel Gorman static int max_extfrag_threshold = 1000; 3055e771905SMel Gorman #endif 3065e771905SMel Gorman 307d8217f07SEric W. Biederman static struct ctl_table kern_table[] = { 3082bba22c5SMike Galbraith { 3092bba22c5SMike Galbraith .procname = "sched_child_runs_first", 3102bba22c5SMike Galbraith .data = &sysctl_sched_child_runs_first, 3112bba22c5SMike Galbraith .maxlen = sizeof(unsigned int), 3122bba22c5SMike Galbraith .mode = 0644, 3136d456111SEric W. Biederman .proc_handler = proc_dointvec, 3142bba22c5SMike Galbraith }, 31577e54a1fSIngo Molnar #ifdef CONFIG_SCHED_DEBUG 31677e54a1fSIngo Molnar { 317b2be5e96SPeter Zijlstra .procname = "sched_min_granularity_ns", 318b2be5e96SPeter Zijlstra .data = &sysctl_sched_min_granularity, 31977e54a1fSIngo Molnar .maxlen = sizeof(unsigned int), 32077e54a1fSIngo Molnar .mode = 0644, 321702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 322b2be5e96SPeter Zijlstra .extra1 = &min_sched_granularity_ns, 323b2be5e96SPeter Zijlstra .extra2 = &max_sched_granularity_ns, 32477e54a1fSIngo Molnar }, 32577e54a1fSIngo Molnar { 32621805085SPeter Zijlstra .procname = "sched_latency_ns", 32721805085SPeter Zijlstra .data = &sysctl_sched_latency, 32821805085SPeter Zijlstra .maxlen = sizeof(unsigned int), 32921805085SPeter Zijlstra .mode = 0644, 330702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 33121805085SPeter Zijlstra .extra1 = &min_sched_granularity_ns, 33221805085SPeter Zijlstra .extra2 = &max_sched_granularity_ns, 33321805085SPeter Zijlstra }, 33421805085SPeter Zijlstra { 33577e54a1fSIngo Molnar .procname = "sched_wakeup_granularity_ns", 33677e54a1fSIngo Molnar .data = &sysctl_sched_wakeup_granularity, 33777e54a1fSIngo Molnar .maxlen = sizeof(unsigned int), 33877e54a1fSIngo Molnar .mode = 0644, 339702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 34077e54a1fSIngo Molnar .extra1 = &min_wakeup_granularity_ns, 34177e54a1fSIngo Molnar .extra2 = &max_wakeup_granularity_ns, 34277e54a1fSIngo Molnar }, 343cbee9f88SPeter Zijlstra #ifdef CONFIG_SMP 34477e54a1fSIngo Molnar { 3451983a922SChristian Ehrhardt .procname = "sched_tunable_scaling", 3461983a922SChristian Ehrhardt .data = &sysctl_sched_tunable_scaling, 3471983a922SChristian Ehrhardt .maxlen = sizeof(enum sched_tunable_scaling), 3481983a922SChristian Ehrhardt .mode = 0644, 349702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 3501983a922SChristian Ehrhardt .extra1 = &min_sched_tunable_scaling, 3511983a922SChristian Ehrhardt .extra2 = &max_sched_tunable_scaling, 3522398f2c6SPeter Zijlstra }, 3532398f2c6SPeter Zijlstra { 354d00535dbSNamhyung Kim .procname = "sched_migration_cost_ns", 355da84d961SIngo Molnar .data = &sysctl_sched_migration_cost, 356da84d961SIngo Molnar .maxlen = sizeof(unsigned int), 357da84d961SIngo Molnar .mode = 0644, 3586d456111SEric W. Biederman .proc_handler = proc_dointvec, 359da84d961SIngo Molnar }, 360b82d9fddSPeter Zijlstra { 361b82d9fddSPeter Zijlstra .procname = "sched_nr_migrate", 362b82d9fddSPeter Zijlstra .data = &sysctl_sched_nr_migrate, 363b82d9fddSPeter Zijlstra .maxlen = sizeof(unsigned int), 364fa85ae24SPeter Zijlstra .mode = 0644, 3656d456111SEric W. Biederman .proc_handler = proc_dointvec, 366fa85ae24SPeter Zijlstra }, 367cb251765SMel Gorman #ifdef CONFIG_SCHEDSTATS 368cb251765SMel Gorman { 369cb251765SMel Gorman .procname = "sched_schedstats", 370cb251765SMel Gorman .data = NULL, 371cb251765SMel Gorman .maxlen = sizeof(unsigned int), 372cb251765SMel Gorman .mode = 0644, 373cb251765SMel Gorman .proc_handler = sysctl_schedstats, 374eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 375eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 376cb251765SMel Gorman }, 377cb251765SMel Gorman #endif /* CONFIG_SCHEDSTATS */ 378cbee9f88SPeter Zijlstra #endif /* CONFIG_SMP */ 379cbee9f88SPeter Zijlstra #ifdef CONFIG_NUMA_BALANCING 380cbee9f88SPeter Zijlstra { 3814b96a29bSPeter Zijlstra .procname = "numa_balancing_scan_delay_ms", 3824b96a29bSPeter Zijlstra .data = &sysctl_numa_balancing_scan_delay, 3834b96a29bSPeter Zijlstra .maxlen = sizeof(unsigned int), 3844b96a29bSPeter Zijlstra .mode = 0644, 3854b96a29bSPeter Zijlstra .proc_handler = proc_dointvec, 3864b96a29bSPeter Zijlstra }, 3874b96a29bSPeter Zijlstra { 388cbee9f88SPeter Zijlstra .procname = "numa_balancing_scan_period_min_ms", 389cbee9f88SPeter Zijlstra .data = &sysctl_numa_balancing_scan_period_min, 390cbee9f88SPeter Zijlstra .maxlen = sizeof(unsigned int), 391cbee9f88SPeter Zijlstra .mode = 0644, 392cbee9f88SPeter Zijlstra .proc_handler = proc_dointvec, 393cbee9f88SPeter Zijlstra }, 394cbee9f88SPeter Zijlstra { 395cbee9f88SPeter Zijlstra .procname = "numa_balancing_scan_period_max_ms", 396cbee9f88SPeter Zijlstra .data = &sysctl_numa_balancing_scan_period_max, 397cbee9f88SPeter Zijlstra .maxlen = sizeof(unsigned int), 398cbee9f88SPeter Zijlstra .mode = 0644, 399cbee9f88SPeter Zijlstra .proc_handler = proc_dointvec, 400cbee9f88SPeter Zijlstra }, 4016e5fb223SPeter Zijlstra { 4026e5fb223SPeter Zijlstra .procname = "numa_balancing_scan_size_mb", 4036e5fb223SPeter Zijlstra .data = &sysctl_numa_balancing_scan_size, 4046e5fb223SPeter Zijlstra .maxlen = sizeof(unsigned int), 4056e5fb223SPeter Zijlstra .mode = 0644, 40664192658SKirill Tkhai .proc_handler = proc_dointvec_minmax, 407eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 4086e5fb223SPeter Zijlstra }, 4093a7053b3SMel Gorman { 41054a43d54SAndi Kleen .procname = "numa_balancing", 41154a43d54SAndi Kleen .data = NULL, /* filled in by handler */ 41254a43d54SAndi Kleen .maxlen = sizeof(unsigned int), 41354a43d54SAndi Kleen .mode = 0644, 41454a43d54SAndi Kleen .proc_handler = sysctl_numa_balancing, 415eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 416eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 41754a43d54SAndi Kleen }, 418cbee9f88SPeter Zijlstra #endif /* CONFIG_NUMA_BALANCING */ 419cbee9f88SPeter Zijlstra #endif /* CONFIG_SCHED_DEBUG */ 4201799e35dSIngo Molnar { 4219f0c1e56SPeter Zijlstra .procname = "sched_rt_period_us", 4229f0c1e56SPeter Zijlstra .data = &sysctl_sched_rt_period, 4239f0c1e56SPeter Zijlstra .maxlen = sizeof(unsigned int), 4249f0c1e56SPeter Zijlstra .mode = 0644, 4256d456111SEric W. Biederman .proc_handler = sched_rt_handler, 4269f0c1e56SPeter Zijlstra }, 4279f0c1e56SPeter Zijlstra { 4289f0c1e56SPeter Zijlstra .procname = "sched_rt_runtime_us", 4299f0c1e56SPeter Zijlstra .data = &sysctl_sched_rt_runtime, 4309f0c1e56SPeter Zijlstra .maxlen = sizeof(int), 4319f0c1e56SPeter Zijlstra .mode = 0644, 4326d456111SEric W. Biederman .proc_handler = sched_rt_handler, 4339f0c1e56SPeter Zijlstra }, 434ce0dbbbbSClark Williams { 435ce0dbbbbSClark Williams .procname = "sched_rr_timeslice_ms", 436975e155eSShile Zhang .data = &sysctl_sched_rr_timeslice, 437ce0dbbbbSClark Williams .maxlen = sizeof(int), 438ce0dbbbbSClark Williams .mode = 0644, 439ce0dbbbbSClark Williams .proc_handler = sched_rr_handler, 440ce0dbbbbSClark Williams }, 441e8f14172SPatrick Bellasi #ifdef CONFIG_UCLAMP_TASK 442e8f14172SPatrick Bellasi { 443e8f14172SPatrick Bellasi .procname = "sched_util_clamp_min", 444e8f14172SPatrick Bellasi .data = &sysctl_sched_uclamp_util_min, 445e8f14172SPatrick Bellasi .maxlen = sizeof(unsigned int), 446e8f14172SPatrick Bellasi .mode = 0644, 447e8f14172SPatrick Bellasi .proc_handler = sysctl_sched_uclamp_handler, 448e8f14172SPatrick Bellasi }, 449e8f14172SPatrick Bellasi { 450e8f14172SPatrick Bellasi .procname = "sched_util_clamp_max", 451e8f14172SPatrick Bellasi .data = &sysctl_sched_uclamp_util_max, 452e8f14172SPatrick Bellasi .maxlen = sizeof(unsigned int), 453e8f14172SPatrick Bellasi .mode = 0644, 454e8f14172SPatrick Bellasi .proc_handler = sysctl_sched_uclamp_handler, 455e8f14172SPatrick Bellasi }, 456e8f14172SPatrick Bellasi #endif 4575091faa4SMike Galbraith #ifdef CONFIG_SCHED_AUTOGROUP 4585091faa4SMike Galbraith { 4595091faa4SMike Galbraith .procname = "sched_autogroup_enabled", 4605091faa4SMike Galbraith .data = &sysctl_sched_autogroup_enabled, 4615091faa4SMike Galbraith .maxlen = sizeof(unsigned int), 4625091faa4SMike Galbraith .mode = 0644, 4631747b21fSYong Zhang .proc_handler = proc_dointvec_minmax, 464eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 465eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 4665091faa4SMike Galbraith }, 4675091faa4SMike Galbraith #endif 468ec12cb7fSPaul Turner #ifdef CONFIG_CFS_BANDWIDTH 469ec12cb7fSPaul Turner { 470ec12cb7fSPaul Turner .procname = "sched_cfs_bandwidth_slice_us", 471ec12cb7fSPaul Turner .data = &sysctl_sched_cfs_bandwidth_slice, 472ec12cb7fSPaul Turner .maxlen = sizeof(unsigned int), 473ec12cb7fSPaul Turner .mode = 0644, 474ec12cb7fSPaul Turner .proc_handler = proc_dointvec_minmax, 475eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 476ec12cb7fSPaul Turner }, 477ec12cb7fSPaul Turner #endif 4788d5d0cfbSQuentin Perret #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) 4798d5d0cfbSQuentin Perret { 4808d5d0cfbSQuentin Perret .procname = "sched_energy_aware", 4818d5d0cfbSQuentin Perret .data = &sysctl_sched_energy_aware, 4828d5d0cfbSQuentin Perret .maxlen = sizeof(unsigned int), 4838d5d0cfbSQuentin Perret .mode = 0644, 4848d5d0cfbSQuentin Perret .proc_handler = sched_energy_aware_handler, 485eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 486eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 4878d5d0cfbSQuentin Perret }, 4888d5d0cfbSQuentin Perret #endif 489f20786ffSPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 490f20786ffSPeter Zijlstra { 491f20786ffSPeter Zijlstra .procname = "prove_locking", 492f20786ffSPeter Zijlstra .data = &prove_locking, 493f20786ffSPeter Zijlstra .maxlen = sizeof(int), 494f20786ffSPeter Zijlstra .mode = 0644, 4956d456111SEric W. Biederman .proc_handler = proc_dointvec, 496f20786ffSPeter Zijlstra }, 497f20786ffSPeter Zijlstra #endif 498f20786ffSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 499f20786ffSPeter Zijlstra { 500f20786ffSPeter Zijlstra .procname = "lock_stat", 501f20786ffSPeter Zijlstra .data = &lock_stat, 502f20786ffSPeter Zijlstra .maxlen = sizeof(int), 503f20786ffSPeter Zijlstra .mode = 0644, 5046d456111SEric W. Biederman .proc_handler = proc_dointvec, 505f20786ffSPeter Zijlstra }, 506f20786ffSPeter Zijlstra #endif 50777e54a1fSIngo Molnar { 5081da177e4SLinus Torvalds .procname = "panic", 5091da177e4SLinus Torvalds .data = &panic_timeout, 5101da177e4SLinus Torvalds .maxlen = sizeof(int), 5111da177e4SLinus Torvalds .mode = 0644, 5126d456111SEric W. Biederman .proc_handler = proc_dointvec, 5131da177e4SLinus Torvalds }, 514046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 5151da177e4SLinus Torvalds { 5161da177e4SLinus Torvalds .procname = "core_uses_pid", 5171da177e4SLinus Torvalds .data = &core_uses_pid, 5181da177e4SLinus Torvalds .maxlen = sizeof(int), 5191da177e4SLinus Torvalds .mode = 0644, 5206d456111SEric W. Biederman .proc_handler = proc_dointvec, 5211da177e4SLinus Torvalds }, 5221da177e4SLinus Torvalds { 5231da177e4SLinus Torvalds .procname = "core_pattern", 5241da177e4SLinus Torvalds .data = core_pattern, 52571ce92f3SDan Aloni .maxlen = CORENAME_MAX_SIZE, 5261da177e4SLinus Torvalds .mode = 0644, 52754b50199SKees Cook .proc_handler = proc_dostring_coredump, 5281da177e4SLinus Torvalds }, 529a293980cSNeil Horman { 530a293980cSNeil Horman .procname = "core_pipe_limit", 531a293980cSNeil Horman .data = &core_pipe_limit, 532a293980cSNeil Horman .maxlen = sizeof(unsigned int), 533a293980cSNeil Horman .mode = 0644, 5346d456111SEric W. Biederman .proc_handler = proc_dointvec, 535a293980cSNeil Horman }, 536046d662fSAlex Kelly #endif 53734f5a398STheodore Ts'o #ifdef CONFIG_PROC_SYSCTL 5381da177e4SLinus Torvalds { 5391da177e4SLinus Torvalds .procname = "tainted", 54025ddbb18SAndi Kleen .maxlen = sizeof(long), 54134f5a398STheodore Ts'o .mode = 0644, 5426d456111SEric W. Biederman .proc_handler = proc_taint, 5431da177e4SLinus Torvalds }, 544f4aacea2SKees Cook { 545f4aacea2SKees Cook .procname = "sysctl_writes_strict", 546f4aacea2SKees Cook .data = &sysctl_writes_strict, 547f4aacea2SKees Cook .maxlen = sizeof(int), 548f4aacea2SKees Cook .mode = 0644, 549f4aacea2SKees Cook .proc_handler = proc_dointvec_minmax, 550f4aacea2SKees Cook .extra1 = &neg_one, 551eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 552f4aacea2SKees Cook }, 55334f5a398STheodore Ts'o #endif 5549745512cSArjan van de Ven #ifdef CONFIG_LATENCYTOP 5559745512cSArjan van de Ven { 5569745512cSArjan van de Ven .procname = "latencytop", 5579745512cSArjan van de Ven .data = &latencytop_enabled, 5589745512cSArjan van de Ven .maxlen = sizeof(int), 5599745512cSArjan van de Ven .mode = 0644, 560cb251765SMel Gorman .proc_handler = sysctl_latencytop, 5619745512cSArjan van de Ven }, 5629745512cSArjan van de Ven #endif 5631da177e4SLinus Torvalds #ifdef CONFIG_BLK_DEV_INITRD 5641da177e4SLinus Torvalds { 5651da177e4SLinus Torvalds .procname = "real-root-dev", 5661da177e4SLinus Torvalds .data = &real_root_dev, 5671da177e4SLinus Torvalds .maxlen = sizeof(int), 5681da177e4SLinus Torvalds .mode = 0644, 5696d456111SEric W. Biederman .proc_handler = proc_dointvec, 5701da177e4SLinus Torvalds }, 5711da177e4SLinus Torvalds #endif 57245807a1dSIngo Molnar { 57345807a1dSIngo Molnar .procname = "print-fatal-signals", 57445807a1dSIngo Molnar .data = &print_fatal_signals, 57545807a1dSIngo Molnar .maxlen = sizeof(int), 57645807a1dSIngo Molnar .mode = 0644, 5776d456111SEric W. Biederman .proc_handler = proc_dointvec, 57845807a1dSIngo Molnar }, 57972c57ed5SDavid S. Miller #ifdef CONFIG_SPARC 5801da177e4SLinus Torvalds { 5811da177e4SLinus Torvalds .procname = "reboot-cmd", 5821da177e4SLinus Torvalds .data = reboot_command, 5831da177e4SLinus Torvalds .maxlen = 256, 5841da177e4SLinus Torvalds .mode = 0644, 5856d456111SEric W. Biederman .proc_handler = proc_dostring, 5861da177e4SLinus Torvalds }, 5871da177e4SLinus Torvalds { 5881da177e4SLinus Torvalds .procname = "stop-a", 5891da177e4SLinus Torvalds .data = &stop_a_enabled, 5901da177e4SLinus Torvalds .maxlen = sizeof (int), 5911da177e4SLinus Torvalds .mode = 0644, 5926d456111SEric W. Biederman .proc_handler = proc_dointvec, 5931da177e4SLinus Torvalds }, 5941da177e4SLinus Torvalds { 5951da177e4SLinus Torvalds .procname = "scons-poweroff", 5961da177e4SLinus Torvalds .data = &scons_pwroff, 5971da177e4SLinus Torvalds .maxlen = sizeof (int), 5981da177e4SLinus Torvalds .mode = 0644, 5996d456111SEric W. Biederman .proc_handler = proc_dointvec, 6001da177e4SLinus Torvalds }, 6011da177e4SLinus Torvalds #endif 6020871420fSDavid S. Miller #ifdef CONFIG_SPARC64 6030871420fSDavid S. Miller { 6040871420fSDavid S. Miller .procname = "tsb-ratio", 6050871420fSDavid S. Miller .data = &sysctl_tsb_ratio, 6060871420fSDavid S. Miller .maxlen = sizeof (int), 6070871420fSDavid S. Miller .mode = 0644, 6086d456111SEric W. Biederman .proc_handler = proc_dointvec, 6090871420fSDavid S. Miller }, 6100871420fSDavid S. Miller #endif 611b67114dbSHelge Deller #ifdef CONFIG_PARISC 6121da177e4SLinus Torvalds { 6131da177e4SLinus Torvalds .procname = "soft-power", 6141da177e4SLinus Torvalds .data = &pwrsw_enabled, 6151da177e4SLinus Torvalds .maxlen = sizeof (int), 6161da177e4SLinus Torvalds .mode = 0644, 6176d456111SEric W. Biederman .proc_handler = proc_dointvec, 6181da177e4SLinus Torvalds }, 619bf14e3b9SVineet Gupta #endif 620bf14e3b9SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW 6211da177e4SLinus Torvalds { 6221da177e4SLinus Torvalds .procname = "unaligned-trap", 6231da177e4SLinus Torvalds .data = &unaligned_enabled, 6241da177e4SLinus Torvalds .maxlen = sizeof (int), 6251da177e4SLinus Torvalds .mode = 0644, 6266d456111SEric W. Biederman .proc_handler = proc_dointvec, 6271da177e4SLinus Torvalds }, 6281da177e4SLinus Torvalds #endif 6291da177e4SLinus Torvalds { 6301da177e4SLinus Torvalds .procname = "ctrl-alt-del", 6311da177e4SLinus Torvalds .data = &C_A_D, 6321da177e4SLinus Torvalds .maxlen = sizeof(int), 6331da177e4SLinus Torvalds .mode = 0644, 6346d456111SEric W. Biederman .proc_handler = proc_dointvec, 6351da177e4SLinus Torvalds }, 636606576ceSSteven Rostedt #ifdef CONFIG_FUNCTION_TRACER 637b0fc494fSSteven Rostedt { 638b0fc494fSSteven Rostedt .procname = "ftrace_enabled", 639b0fc494fSSteven Rostedt .data = &ftrace_enabled, 640b0fc494fSSteven Rostedt .maxlen = sizeof(int), 641b0fc494fSSteven Rostedt .mode = 0644, 6426d456111SEric W. Biederman .proc_handler = ftrace_enable_sysctl, 643b0fc494fSSteven Rostedt }, 644b0fc494fSSteven Rostedt #endif 645f38f1d2aSSteven Rostedt #ifdef CONFIG_STACK_TRACER 646f38f1d2aSSteven Rostedt { 647f38f1d2aSSteven Rostedt .procname = "stack_tracer_enabled", 648f38f1d2aSSteven Rostedt .data = &stack_tracer_enabled, 649f38f1d2aSSteven Rostedt .maxlen = sizeof(int), 650f38f1d2aSSteven Rostedt .mode = 0644, 6516d456111SEric W. Biederman .proc_handler = stack_trace_sysctl, 652f38f1d2aSSteven Rostedt }, 653f38f1d2aSSteven Rostedt #endif 654944ac425SSteven Rostedt #ifdef CONFIG_TRACING 655944ac425SSteven Rostedt { 6563299b4ddSPeter Zijlstra .procname = "ftrace_dump_on_oops", 657944ac425SSteven Rostedt .data = &ftrace_dump_on_oops, 658944ac425SSteven Rostedt .maxlen = sizeof(int), 659944ac425SSteven Rostedt .mode = 0644, 6606d456111SEric W. Biederman .proc_handler = proc_dointvec, 661944ac425SSteven Rostedt }, 662de7edd31SSteven Rostedt (Red Hat) { 663de7edd31SSteven Rostedt (Red Hat) .procname = "traceoff_on_warning", 664de7edd31SSteven Rostedt (Red Hat) .data = &__disable_trace_on_warning, 665de7edd31SSteven Rostedt (Red Hat) .maxlen = sizeof(__disable_trace_on_warning), 666de7edd31SSteven Rostedt (Red Hat) .mode = 0644, 667de7edd31SSteven Rostedt (Red Hat) .proc_handler = proc_dointvec, 668de7edd31SSteven Rostedt (Red Hat) }, 6690daa2302SSteven Rostedt (Red Hat) { 6700daa2302SSteven Rostedt (Red Hat) .procname = "tracepoint_printk", 6710daa2302SSteven Rostedt (Red Hat) .data = &tracepoint_printk, 6720daa2302SSteven Rostedt (Red Hat) .maxlen = sizeof(tracepoint_printk), 6730daa2302SSteven Rostedt (Red Hat) .mode = 0644, 67442391745SSteven Rostedt (Red Hat) .proc_handler = tracepoint_printk_sysctl, 6750daa2302SSteven Rostedt (Red Hat) }, 676944ac425SSteven Rostedt #endif 6772965faa5SDave Young #ifdef CONFIG_KEXEC_CORE 6787984754bSKees Cook { 6797984754bSKees Cook .procname = "kexec_load_disabled", 6807984754bSKees Cook .data = &kexec_load_disabled, 6817984754bSKees Cook .maxlen = sizeof(int), 6827984754bSKees Cook .mode = 0644, 6837984754bSKees Cook /* only handle a transition from default "0" to "1" */ 6847984754bSKees Cook .proc_handler = proc_dointvec_minmax, 685eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 686eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 6877984754bSKees Cook }, 6887984754bSKees Cook #endif 689a1ef5adbSJohannes Berg #ifdef CONFIG_MODULES 6901da177e4SLinus Torvalds { 6911da177e4SLinus Torvalds .procname = "modprobe", 6921da177e4SLinus Torvalds .data = &modprobe_path, 6931da177e4SLinus Torvalds .maxlen = KMOD_PATH_LEN, 6941da177e4SLinus Torvalds .mode = 0644, 6956d456111SEric W. Biederman .proc_handler = proc_dostring, 6961da177e4SLinus Torvalds }, 6973d43321bSKees Cook { 6983d43321bSKees Cook .procname = "modules_disabled", 6993d43321bSKees Cook .data = &modules_disabled, 7003d43321bSKees Cook .maxlen = sizeof(int), 7013d43321bSKees Cook .mode = 0644, 7023d43321bSKees Cook /* only handle a transition from default "0" to "1" */ 7036d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 704eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 705eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 7063d43321bSKees Cook }, 7071da177e4SLinus Torvalds #endif 70886d56134SMichael Marineau #ifdef CONFIG_UEVENT_HELPER 7091da177e4SLinus Torvalds { 7101da177e4SLinus Torvalds .procname = "hotplug", 711312c004dSKay Sievers .data = &uevent_helper, 712312c004dSKay Sievers .maxlen = UEVENT_HELPER_PATH_LEN, 7131da177e4SLinus Torvalds .mode = 0644, 7146d456111SEric W. Biederman .proc_handler = proc_dostring, 7151da177e4SLinus Torvalds }, 71686d56134SMichael Marineau #endif 7171da177e4SLinus Torvalds #ifdef CONFIG_CHR_DEV_SG 7181da177e4SLinus Torvalds { 7191da177e4SLinus Torvalds .procname = "sg-big-buff", 7201da177e4SLinus Torvalds .data = &sg_big_buff, 7211da177e4SLinus Torvalds .maxlen = sizeof (int), 7221da177e4SLinus Torvalds .mode = 0444, 7236d456111SEric W. Biederman .proc_handler = proc_dointvec, 7241da177e4SLinus Torvalds }, 7251da177e4SLinus Torvalds #endif 7261da177e4SLinus Torvalds #ifdef CONFIG_BSD_PROCESS_ACCT 7271da177e4SLinus Torvalds { 7281da177e4SLinus Torvalds .procname = "acct", 7291da177e4SLinus Torvalds .data = &acct_parm, 7301da177e4SLinus Torvalds .maxlen = 3*sizeof(int), 7311da177e4SLinus Torvalds .mode = 0644, 7326d456111SEric W. Biederman .proc_handler = proc_dointvec, 7331da177e4SLinus Torvalds }, 7341da177e4SLinus Torvalds #endif 7351da177e4SLinus Torvalds #ifdef CONFIG_MAGIC_SYSRQ 7361da177e4SLinus Torvalds { 7371da177e4SLinus Torvalds .procname = "sysrq", 738eaee4172SDmitry Safonov .data = NULL, 7391da177e4SLinus Torvalds .maxlen = sizeof (int), 7401da177e4SLinus Torvalds .mode = 0644, 74197f5f0cdSDmitry Torokhov .proc_handler = sysrq_sysctl_handler, 7421da177e4SLinus Torvalds }, 7431da177e4SLinus Torvalds #endif 744d6f8ff73SRandy Dunlap #ifdef CONFIG_PROC_SYSCTL 7451da177e4SLinus Torvalds { 7461da177e4SLinus Torvalds .procname = "cad_pid", 7479ec52099SCedric Le Goater .data = NULL, 7481da177e4SLinus Torvalds .maxlen = sizeof (int), 7491da177e4SLinus Torvalds .mode = 0600, 7506d456111SEric W. Biederman .proc_handler = proc_do_cad_pid, 7511da177e4SLinus Torvalds }, 752d6f8ff73SRandy Dunlap #endif 7531da177e4SLinus Torvalds { 7541da177e4SLinus Torvalds .procname = "threads-max", 75516db3d3fSHeinrich Schuchardt .data = NULL, 7561da177e4SLinus Torvalds .maxlen = sizeof(int), 7571da177e4SLinus Torvalds .mode = 0644, 75816db3d3fSHeinrich Schuchardt .proc_handler = sysctl_max_threads, 7591da177e4SLinus Torvalds }, 7601da177e4SLinus Torvalds { 7611da177e4SLinus Torvalds .procname = "random", 7621da177e4SLinus Torvalds .mode = 0555, 7631da177e4SLinus Torvalds .child = random_table, 7641da177e4SLinus Torvalds }, 7651da177e4SLinus Torvalds { 76617f60a7dSEric Paris .procname = "usermodehelper", 76717f60a7dSEric Paris .mode = 0555, 76817f60a7dSEric Paris .child = usermodehelper_table, 76917f60a7dSEric Paris }, 770ceb18132SLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER 771ceb18132SLuis R. Rodriguez { 772ceb18132SLuis R. Rodriguez .procname = "firmware_config", 773ceb18132SLuis R. Rodriguez .mode = 0555, 774ceb18132SLuis R. Rodriguez .child = firmware_config_table, 775ceb18132SLuis R. Rodriguez }, 776ceb18132SLuis R. Rodriguez #endif 77717f60a7dSEric Paris { 7781da177e4SLinus Torvalds .procname = "overflowuid", 7791da177e4SLinus Torvalds .data = &overflowuid, 7801da177e4SLinus Torvalds .maxlen = sizeof(int), 7811da177e4SLinus Torvalds .mode = 0644, 7826d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 7831da177e4SLinus Torvalds .extra1 = &minolduid, 7841da177e4SLinus Torvalds .extra2 = &maxolduid, 7851da177e4SLinus Torvalds }, 7861da177e4SLinus Torvalds { 7871da177e4SLinus Torvalds .procname = "overflowgid", 7881da177e4SLinus Torvalds .data = &overflowgid, 7891da177e4SLinus Torvalds .maxlen = sizeof(int), 7901da177e4SLinus Torvalds .mode = 0644, 7916d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 7921da177e4SLinus Torvalds .extra1 = &minolduid, 7931da177e4SLinus Torvalds .extra2 = &maxolduid, 7941da177e4SLinus Torvalds }, 795347a8dc3SMartin Schwidefsky #ifdef CONFIG_S390 7961da177e4SLinus Torvalds { 7971da177e4SLinus Torvalds .procname = "userprocess_debug", 798ab3c68eeSHeiko Carstens .data = &show_unhandled_signals, 7991da177e4SLinus Torvalds .maxlen = sizeof(int), 8001da177e4SLinus Torvalds .mode = 0644, 8016d456111SEric W. Biederman .proc_handler = proc_dointvec, 8021da177e4SLinus Torvalds }, 8031da177e4SLinus Torvalds #endif 8041da177e4SLinus Torvalds { 8051da177e4SLinus Torvalds .procname = "pid_max", 8061da177e4SLinus Torvalds .data = &pid_max, 8071da177e4SLinus Torvalds .maxlen = sizeof (int), 8081da177e4SLinus Torvalds .mode = 0644, 8096d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 8101da177e4SLinus Torvalds .extra1 = &pid_max_min, 8111da177e4SLinus Torvalds .extra2 = &pid_max_max, 8121da177e4SLinus Torvalds }, 8131da177e4SLinus Torvalds { 8141da177e4SLinus Torvalds .procname = "panic_on_oops", 8151da177e4SLinus Torvalds .data = &panic_on_oops, 8161da177e4SLinus Torvalds .maxlen = sizeof(int), 8171da177e4SLinus Torvalds .mode = 0644, 8186d456111SEric W. Biederman .proc_handler = proc_dointvec, 8191da177e4SLinus Torvalds }, 82081c9d43fSFeng Tang { 82181c9d43fSFeng Tang .procname = "panic_print", 82281c9d43fSFeng Tang .data = &panic_print, 82381c9d43fSFeng Tang .maxlen = sizeof(unsigned long), 82481c9d43fSFeng Tang .mode = 0644, 82581c9d43fSFeng Tang .proc_handler = proc_doulongvec_minmax, 82681c9d43fSFeng Tang }, 8277ef3d2fdSJoe Perches #if defined CONFIG_PRINTK 8287ef3d2fdSJoe Perches { 8297ef3d2fdSJoe Perches .procname = "printk", 8307ef3d2fdSJoe Perches .data = &console_loglevel, 8317ef3d2fdSJoe Perches .maxlen = 4*sizeof(int), 8327ef3d2fdSJoe Perches .mode = 0644, 8336d456111SEric W. Biederman .proc_handler = proc_dointvec, 8347ef3d2fdSJoe Perches }, 8351da177e4SLinus Torvalds { 8361da177e4SLinus Torvalds .procname = "printk_ratelimit", 837717115e1SDave Young .data = &printk_ratelimit_state.interval, 8381da177e4SLinus Torvalds .maxlen = sizeof(int), 8391da177e4SLinus Torvalds .mode = 0644, 8406d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 8411da177e4SLinus Torvalds }, 8421da177e4SLinus Torvalds { 8431da177e4SLinus Torvalds .procname = "printk_ratelimit_burst", 844717115e1SDave Young .data = &printk_ratelimit_state.burst, 8451da177e4SLinus Torvalds .maxlen = sizeof(int), 8461da177e4SLinus Torvalds .mode = 0644, 8476d456111SEric W. Biederman .proc_handler = proc_dointvec, 8481da177e4SLinus Torvalds }, 849af91322eSDave Young { 850af91322eSDave Young .procname = "printk_delay", 851af91322eSDave Young .data = &printk_delay_msec, 852af91322eSDave Young .maxlen = sizeof(int), 853af91322eSDave Young .mode = 0644, 8546d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 855eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 856af91322eSDave Young .extra2 = &ten_thousand, 857af91322eSDave Young }, 8581da177e4SLinus Torvalds { 859750afe7bSBorislav Petkov .procname = "printk_devkmsg", 860750afe7bSBorislav Petkov .data = devkmsg_log_str, 861750afe7bSBorislav Petkov .maxlen = DEVKMSG_STR_MAX_SIZE, 862750afe7bSBorislav Petkov .mode = 0644, 863750afe7bSBorislav Petkov .proc_handler = devkmsg_sysctl_set_loglvl, 864750afe7bSBorislav Petkov }, 865750afe7bSBorislav Petkov { 866eaf06b24SDan Rosenberg .procname = "dmesg_restrict", 867eaf06b24SDan Rosenberg .data = &dmesg_restrict, 868eaf06b24SDan Rosenberg .maxlen = sizeof(int), 869eaf06b24SDan Rosenberg .mode = 0644, 870620f6e8eSKees Cook .proc_handler = proc_dointvec_minmax_sysadmin, 871eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 872eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 873eaf06b24SDan Rosenberg }, 874455cd5abSDan Rosenberg { 875455cd5abSDan Rosenberg .procname = "kptr_restrict", 876455cd5abSDan Rosenberg .data = &kptr_restrict, 877455cd5abSDan Rosenberg .maxlen = sizeof(int), 878455cd5abSDan Rosenberg .mode = 0644, 879620f6e8eSKees Cook .proc_handler = proc_dointvec_minmax_sysadmin, 880eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 881455cd5abSDan Rosenberg .extra2 = &two, 882455cd5abSDan Rosenberg }, 883df6e61d4SJoe Perches #endif 884eaf06b24SDan Rosenberg { 8851da177e4SLinus Torvalds .procname = "ngroups_max", 8861da177e4SLinus Torvalds .data = &ngroups_max, 8871da177e4SLinus Torvalds .maxlen = sizeof (int), 8881da177e4SLinus Torvalds .mode = 0444, 8896d456111SEric W. Biederman .proc_handler = proc_dointvec, 8901da177e4SLinus Torvalds }, 89173efc039SDan Ballard { 89273efc039SDan Ballard .procname = "cap_last_cap", 89373efc039SDan Ballard .data = (void *)&cap_last_cap, 89473efc039SDan Ballard .maxlen = sizeof(int), 89573efc039SDan Ballard .mode = 0444, 89673efc039SDan Ballard .proc_handler = proc_dointvec, 89773efc039SDan Ballard }, 89858687acbSDon Zickus #if defined(CONFIG_LOCKUP_DETECTOR) 899504d7cf1SDon Zickus { 90058687acbSDon Zickus .procname = "watchdog", 9013c00ea82SFrederic Weisbecker .data = &watchdog_user_enabled, 902504d7cf1SDon Zickus .maxlen = sizeof(int), 903504d7cf1SDon Zickus .mode = 0644, 904195daf66SUlrich Obergfell .proc_handler = proc_watchdog, 905eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 906eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 90758687acbSDon Zickus }, 90858687acbSDon Zickus { 90958687acbSDon Zickus .procname = "watchdog_thresh", 910586692a5SMandeep Singh Baines .data = &watchdog_thresh, 91158687acbSDon Zickus .maxlen = sizeof(int), 91258687acbSDon Zickus .mode = 0644, 913195daf66SUlrich Obergfell .proc_handler = proc_watchdog_thresh, 914eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 91558687acbSDon Zickus .extra2 = &sixty, 916504d7cf1SDon Zickus }, 9172508ce18SDon Zickus { 918195daf66SUlrich Obergfell .procname = "nmi_watchdog", 9197feeb9cdSThomas Gleixner .data = &nmi_watchdog_user_enabled, 920195daf66SUlrich Obergfell .maxlen = sizeof(int), 92151d4052bSThomas Gleixner .mode = NMI_WATCHDOG_SYSCTL_PERM, 922195daf66SUlrich Obergfell .proc_handler = proc_nmi_watchdog, 923eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 924eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 925195daf66SUlrich Obergfell }, 926195daf66SUlrich Obergfell { 92705a4a952SNicholas Piggin .procname = "watchdog_cpumask", 92805a4a952SNicholas Piggin .data = &watchdog_cpumask_bits, 92905a4a952SNicholas Piggin .maxlen = NR_CPUS, 93005a4a952SNicholas Piggin .mode = 0644, 93105a4a952SNicholas Piggin .proc_handler = proc_watchdog_cpumask, 93205a4a952SNicholas Piggin }, 93305a4a952SNicholas Piggin #ifdef CONFIG_SOFTLOCKUP_DETECTOR 93405a4a952SNicholas Piggin { 935195daf66SUlrich Obergfell .procname = "soft_watchdog", 9367feeb9cdSThomas Gleixner .data = &soft_watchdog_user_enabled, 937195daf66SUlrich Obergfell .maxlen = sizeof(int), 938195daf66SUlrich Obergfell .mode = 0644, 939195daf66SUlrich Obergfell .proc_handler = proc_soft_watchdog, 940eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 941eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 942195daf66SUlrich Obergfell }, 943195daf66SUlrich Obergfell { 9442508ce18SDon Zickus .procname = "softlockup_panic", 9452508ce18SDon Zickus .data = &softlockup_panic, 9462508ce18SDon Zickus .maxlen = sizeof(int), 9472508ce18SDon Zickus .mode = 0644, 9482508ce18SDon Zickus .proc_handler = proc_dointvec_minmax, 949eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 950eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 9512508ce18SDon Zickus }, 952ed235875SAaron Tomlin #ifdef CONFIG_SMP 953ed235875SAaron Tomlin { 954ed235875SAaron Tomlin .procname = "softlockup_all_cpu_backtrace", 955ed235875SAaron Tomlin .data = &sysctl_softlockup_all_cpu_backtrace, 956ed235875SAaron Tomlin .maxlen = sizeof(int), 957ed235875SAaron Tomlin .mode = 0644, 958ed235875SAaron Tomlin .proc_handler = proc_dointvec_minmax, 959eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 960eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 961ed235875SAaron Tomlin }, 96205a4a952SNicholas Piggin #endif /* CONFIG_SMP */ 96305a4a952SNicholas Piggin #endif 96405a4a952SNicholas Piggin #ifdef CONFIG_HARDLOCKUP_DETECTOR 96505a4a952SNicholas Piggin { 96605a4a952SNicholas Piggin .procname = "hardlockup_panic", 96705a4a952SNicholas Piggin .data = &hardlockup_panic, 96805a4a952SNicholas Piggin .maxlen = sizeof(int), 96905a4a952SNicholas Piggin .mode = 0644, 97005a4a952SNicholas Piggin .proc_handler = proc_dointvec_minmax, 971eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 972eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 97305a4a952SNicholas Piggin }, 97405a4a952SNicholas Piggin #ifdef CONFIG_SMP 97555537871SJiri Kosina { 97655537871SJiri Kosina .procname = "hardlockup_all_cpu_backtrace", 97755537871SJiri Kosina .data = &sysctl_hardlockup_all_cpu_backtrace, 97855537871SJiri Kosina .maxlen = sizeof(int), 97955537871SJiri Kosina .mode = 0644, 98055537871SJiri Kosina .proc_handler = proc_dointvec_minmax, 981eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 982eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 98355537871SJiri Kosina }, 984ed235875SAaron Tomlin #endif /* CONFIG_SMP */ 9855dc30558SDon Zickus #endif 98605a4a952SNicholas Piggin #endif 98705a4a952SNicholas Piggin 9885dc30558SDon Zickus #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) 9895dc30558SDon Zickus { 9905dc30558SDon Zickus .procname = "unknown_nmi_panic", 9915dc30558SDon Zickus .data = &unknown_nmi_panic, 9925dc30558SDon Zickus .maxlen = sizeof (int), 9935dc30558SDon Zickus .mode = 0644, 9945dc30558SDon Zickus .proc_handler = proc_dointvec, 9955dc30558SDon Zickus }, 996504d7cf1SDon Zickus #endif 997*b6522fa4SXiaoming Ni 998*b6522fa4SXiaoming Ni #if (defined(CONFIG_X86_32) || defined(CONFIG_PARISC)) && \ 999*b6522fa4SXiaoming Ni defined(CONFIG_DEBUG_STACKOVERFLOW) 1000*b6522fa4SXiaoming Ni { 1001*b6522fa4SXiaoming Ni .procname = "panic_on_stackoverflow", 1002*b6522fa4SXiaoming Ni .data = &sysctl_panic_on_stackoverflow, 1003*b6522fa4SXiaoming Ni .maxlen = sizeof(int), 1004*b6522fa4SXiaoming Ni .mode = 0644, 1005*b6522fa4SXiaoming Ni .proc_handler = proc_dointvec, 1006*b6522fa4SXiaoming Ni }, 1007*b6522fa4SXiaoming Ni #endif 10081da177e4SLinus Torvalds #if defined(CONFIG_X86) 10091da177e4SLinus Torvalds { 10108da5addaSDon Zickus .procname = "panic_on_unrecovered_nmi", 10118da5addaSDon Zickus .data = &panic_on_unrecovered_nmi, 10128da5addaSDon Zickus .maxlen = sizeof(int), 10138da5addaSDon Zickus .mode = 0644, 10146d456111SEric W. Biederman .proc_handler = proc_dointvec, 10158da5addaSDon Zickus }, 10168da5addaSDon Zickus { 10175211a242SKurt Garloff .procname = "panic_on_io_nmi", 10185211a242SKurt Garloff .data = &panic_on_io_nmi, 10195211a242SKurt Garloff .maxlen = sizeof(int), 10205211a242SKurt Garloff .mode = 0644, 10216d456111SEric W. Biederman .proc_handler = proc_dointvec, 10225211a242SKurt Garloff }, 10235211a242SKurt Garloff { 10241da177e4SLinus Torvalds .procname = "bootloader_type", 10251da177e4SLinus Torvalds .data = &bootloader_type, 10261da177e4SLinus Torvalds .maxlen = sizeof (int), 10271da177e4SLinus Torvalds .mode = 0444, 10286d456111SEric W. Biederman .proc_handler = proc_dointvec, 10291da177e4SLinus Torvalds }, 10300741f4d2SChuck Ebbert { 10315031296cSH. Peter Anvin .procname = "bootloader_version", 10325031296cSH. Peter Anvin .data = &bootloader_version, 10335031296cSH. Peter Anvin .maxlen = sizeof (int), 10345031296cSH. Peter Anvin .mode = 0444, 10356d456111SEric W. Biederman .proc_handler = proc_dointvec, 10365031296cSH. Peter Anvin }, 10375031296cSH. Peter Anvin { 10386e7c4025SIngo Molnar .procname = "io_delay_type", 10396e7c4025SIngo Molnar .data = &io_delay_type, 10406e7c4025SIngo Molnar .maxlen = sizeof(int), 10416e7c4025SIngo Molnar .mode = 0644, 10426d456111SEric W. Biederman .proc_handler = proc_dointvec, 10436e7c4025SIngo Molnar }, 10441da177e4SLinus Torvalds #endif 10457a9166e3SLuke Yang #if defined(CONFIG_MMU) 10461da177e4SLinus Torvalds { 10471da177e4SLinus Torvalds .procname = "randomize_va_space", 10481da177e4SLinus Torvalds .data = &randomize_va_space, 10491da177e4SLinus Torvalds .maxlen = sizeof(int), 10501da177e4SLinus Torvalds .mode = 0644, 10516d456111SEric W. Biederman .proc_handler = proc_dointvec, 10521da177e4SLinus Torvalds }, 10537a9166e3SLuke Yang #endif 10540152fb37SMartin Schwidefsky #if defined(CONFIG_S390) && defined(CONFIG_SMP) 1055951f22d5SMartin Schwidefsky { 1056951f22d5SMartin Schwidefsky .procname = "spin_retry", 1057951f22d5SMartin Schwidefsky .data = &spin_retry, 1058951f22d5SMartin Schwidefsky .maxlen = sizeof (int), 1059951f22d5SMartin Schwidefsky .mode = 0644, 10606d456111SEric W. Biederman .proc_handler = proc_dointvec, 1061951f22d5SMartin Schwidefsky }, 1062951f22d5SMartin Schwidefsky #endif 1063673d5b43SLen Brown #if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86) 1064c255d844SPavel Machek { 1065c255d844SPavel Machek .procname = "acpi_video_flags", 106677afcf78SPavel Machek .data = &acpi_realmode_flags, 1067c255d844SPavel Machek .maxlen = sizeof (unsigned long), 1068c255d844SPavel Machek .mode = 0644, 10696d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 1070c255d844SPavel Machek }, 1071c255d844SPavel Machek #endif 1072b6fca725SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN 1073d2b176edSJes Sorensen { 1074d2b176edSJes Sorensen .procname = "ignore-unaligned-usertrap", 1075d2b176edSJes Sorensen .data = &no_unaligned_warning, 1076d2b176edSJes Sorensen .maxlen = sizeof (int), 1077d2b176edSJes Sorensen .mode = 0644, 10786d456111SEric W. Biederman .proc_handler = proc_dointvec, 1079d2b176edSJes Sorensen }, 1080b6fca725SVineet Gupta #endif 1081b6fca725SVineet Gupta #ifdef CONFIG_IA64 108288fc241fSDoug Chapman { 108388fc241fSDoug Chapman .procname = "unaligned-dump-stack", 108488fc241fSDoug Chapman .data = &unaligned_dump_stack, 108588fc241fSDoug Chapman .maxlen = sizeof (int), 108688fc241fSDoug Chapman .mode = 0644, 10876d456111SEric W. Biederman .proc_handler = proc_dointvec, 108888fc241fSDoug Chapman }, 1089d2b176edSJes Sorensen #endif 1090e162b39aSMandeep Singh Baines #ifdef CONFIG_DETECT_HUNG_TASK 1091e162b39aSMandeep Singh Baines { 1092e162b39aSMandeep Singh Baines .procname = "hung_task_panic", 1093e162b39aSMandeep Singh Baines .data = &sysctl_hung_task_panic, 1094e162b39aSMandeep Singh Baines .maxlen = sizeof(int), 1095e162b39aSMandeep Singh Baines .mode = 0644, 10966d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1097eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1098eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1099e162b39aSMandeep Singh Baines }, 110082a1fcb9SIngo Molnar { 110182a1fcb9SIngo Molnar .procname = "hung_task_check_count", 110282a1fcb9SIngo Molnar .data = &sysctl_hung_task_check_count, 1103cd64647fSLi Zefan .maxlen = sizeof(int), 110482a1fcb9SIngo Molnar .mode = 0644, 1105cd64647fSLi Zefan .proc_handler = proc_dointvec_minmax, 1106eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 110782a1fcb9SIngo Molnar }, 110882a1fcb9SIngo Molnar { 110982a1fcb9SIngo Molnar .procname = "hung_task_timeout_secs", 111082a1fcb9SIngo Molnar .data = &sysctl_hung_task_timeout_secs, 111190739081SIngo Molnar .maxlen = sizeof(unsigned long), 111282a1fcb9SIngo Molnar .mode = 0644, 11136d456111SEric W. Biederman .proc_handler = proc_dohung_task_timeout_secs, 111480df2847SLiu Hua .extra2 = &hung_task_timeout_max, 111582a1fcb9SIngo Molnar }, 111682a1fcb9SIngo Molnar { 1117a2e51445SDmitry Vyukov .procname = "hung_task_check_interval_secs", 1118a2e51445SDmitry Vyukov .data = &sysctl_hung_task_check_interval_secs, 1119a2e51445SDmitry Vyukov .maxlen = sizeof(unsigned long), 1120a2e51445SDmitry Vyukov .mode = 0644, 1121a2e51445SDmitry Vyukov .proc_handler = proc_dohung_task_timeout_secs, 1122a2e51445SDmitry Vyukov .extra2 = &hung_task_timeout_max, 1123a2e51445SDmitry Vyukov }, 1124a2e51445SDmitry Vyukov { 112582a1fcb9SIngo Molnar .procname = "hung_task_warnings", 112682a1fcb9SIngo Molnar .data = &sysctl_hung_task_warnings, 1127270750dbSAaron Tomlin .maxlen = sizeof(int), 112882a1fcb9SIngo Molnar .mode = 0644, 1129270750dbSAaron Tomlin .proc_handler = proc_dointvec_minmax, 1130270750dbSAaron Tomlin .extra1 = &neg_one, 113182a1fcb9SIngo Molnar }, 1132c4f3b63fSRavikiran G Thirumalai #endif 113323f78d4aSIngo Molnar #ifdef CONFIG_RT_MUTEXES 113423f78d4aSIngo Molnar { 113523f78d4aSIngo Molnar .procname = "max_lock_depth", 113623f78d4aSIngo Molnar .data = &max_lock_depth, 113723f78d4aSIngo Molnar .maxlen = sizeof(int), 113823f78d4aSIngo Molnar .mode = 0644, 11396d456111SEric W. Biederman .proc_handler = proc_dointvec, 114023f78d4aSIngo Molnar }, 114123f78d4aSIngo Molnar #endif 114210a0a8d4SJeremy Fitzhardinge { 114310a0a8d4SJeremy Fitzhardinge .procname = "poweroff_cmd", 114410a0a8d4SJeremy Fitzhardinge .data = &poweroff_cmd, 114510a0a8d4SJeremy Fitzhardinge .maxlen = POWEROFF_CMD_PATH_LEN, 114610a0a8d4SJeremy Fitzhardinge .mode = 0644, 11476d456111SEric W. Biederman .proc_handler = proc_dostring, 114810a0a8d4SJeremy Fitzhardinge }, 11490b77f5bfSDavid Howells #ifdef CONFIG_KEYS 11500b77f5bfSDavid Howells { 11510b77f5bfSDavid Howells .procname = "keys", 11520b77f5bfSDavid Howells .mode = 0555, 11530b77f5bfSDavid Howells .child = key_sysctls, 11540b77f5bfSDavid Howells }, 11550b77f5bfSDavid Howells #endif 1156cdd6c482SIngo Molnar #ifdef CONFIG_PERF_EVENTS 1157aa4a2218SVince Weaver /* 1158aa4a2218SVince Weaver * User-space scripts rely on the existence of this file 1159aa4a2218SVince Weaver * as a feature check for perf_events being enabled. 1160aa4a2218SVince Weaver * 1161aa4a2218SVince Weaver * So it's an ABI, do not remove! 1162aa4a2218SVince Weaver */ 11631ccd1549SPeter Zijlstra { 1164cdd6c482SIngo Molnar .procname = "perf_event_paranoid", 1165cdd6c482SIngo Molnar .data = &sysctl_perf_event_paranoid, 1166cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_paranoid), 11671ccd1549SPeter Zijlstra .mode = 0644, 11686d456111SEric W. Biederman .proc_handler = proc_dointvec, 11691ccd1549SPeter Zijlstra }, 1170c5078f78SPeter Zijlstra { 1171cdd6c482SIngo Molnar .procname = "perf_event_mlock_kb", 1172cdd6c482SIngo Molnar .data = &sysctl_perf_event_mlock, 1173cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_mlock), 1174c5078f78SPeter Zijlstra .mode = 0644, 11756d456111SEric W. Biederman .proc_handler = proc_dointvec, 1176c5078f78SPeter Zijlstra }, 1177a78ac325SPeter Zijlstra { 1178cdd6c482SIngo Molnar .procname = "perf_event_max_sample_rate", 1179cdd6c482SIngo Molnar .data = &sysctl_perf_event_sample_rate, 1180cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_sample_rate), 1181a78ac325SPeter Zijlstra .mode = 0644, 1182163ec435SPeter Zijlstra .proc_handler = perf_proc_update_handler, 1183eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 1184a78ac325SPeter Zijlstra }, 118514c63f17SDave Hansen { 118614c63f17SDave Hansen .procname = "perf_cpu_time_max_percent", 118714c63f17SDave Hansen .data = &sysctl_perf_cpu_time_max_percent, 118814c63f17SDave Hansen .maxlen = sizeof(sysctl_perf_cpu_time_max_percent), 118914c63f17SDave Hansen .mode = 0644, 119014c63f17SDave Hansen .proc_handler = perf_cpu_time_max_percent_handler, 1191eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 119214c63f17SDave Hansen .extra2 = &one_hundred, 119314c63f17SDave Hansen }, 1194c5dfd78eSArnaldo Carvalho de Melo { 1195c5dfd78eSArnaldo Carvalho de Melo .procname = "perf_event_max_stack", 1196a831100aSArnaldo Carvalho de Melo .data = &sysctl_perf_event_max_stack, 1197c5dfd78eSArnaldo Carvalho de Melo .maxlen = sizeof(sysctl_perf_event_max_stack), 1198c5dfd78eSArnaldo Carvalho de Melo .mode = 0644, 1199c5dfd78eSArnaldo Carvalho de Melo .proc_handler = perf_event_max_stack_handler, 1200eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1201c5dfd78eSArnaldo Carvalho de Melo .extra2 = &six_hundred_forty_kb, 1202c5dfd78eSArnaldo Carvalho de Melo }, 1203c85b0334SArnaldo Carvalho de Melo { 1204c85b0334SArnaldo Carvalho de Melo .procname = "perf_event_max_contexts_per_stack", 1205c85b0334SArnaldo Carvalho de Melo .data = &sysctl_perf_event_max_contexts_per_stack, 1206c85b0334SArnaldo Carvalho de Melo .maxlen = sizeof(sysctl_perf_event_max_contexts_per_stack), 1207c85b0334SArnaldo Carvalho de Melo .mode = 0644, 1208c85b0334SArnaldo Carvalho de Melo .proc_handler = perf_event_max_stack_handler, 1209eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1210c85b0334SArnaldo Carvalho de Melo .extra2 = &one_thousand, 1211c85b0334SArnaldo Carvalho de Melo }, 12121ccd1549SPeter Zijlstra #endif 12139e3961a0SPrarit Bhargava { 12149e3961a0SPrarit Bhargava .procname = "panic_on_warn", 12159e3961a0SPrarit Bhargava .data = &panic_on_warn, 12169e3961a0SPrarit Bhargava .maxlen = sizeof(int), 12179e3961a0SPrarit Bhargava .mode = 0644, 12189e3961a0SPrarit Bhargava .proc_handler = proc_dointvec_minmax, 1219eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1220eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 12219e3961a0SPrarit Bhargava }, 1222bc7a34b8SThomas Gleixner #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) 1223bc7a34b8SThomas Gleixner { 1224bc7a34b8SThomas Gleixner .procname = "timer_migration", 1225bc7a34b8SThomas Gleixner .data = &sysctl_timer_migration, 1226bc7a34b8SThomas Gleixner .maxlen = sizeof(unsigned int), 1227bc7a34b8SThomas Gleixner .mode = 0644, 1228bc7a34b8SThomas Gleixner .proc_handler = timer_migration_handler, 1229eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1230eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1231bc7a34b8SThomas Gleixner }, 1232bc7a34b8SThomas Gleixner #endif 12331be7f75dSAlexei Starovoitov #ifdef CONFIG_BPF_SYSCALL 12341be7f75dSAlexei Starovoitov { 12351be7f75dSAlexei Starovoitov .procname = "unprivileged_bpf_disabled", 12361be7f75dSAlexei Starovoitov .data = &sysctl_unprivileged_bpf_disabled, 12371be7f75dSAlexei Starovoitov .maxlen = sizeof(sysctl_unprivileged_bpf_disabled), 12381be7f75dSAlexei Starovoitov .mode = 0644, 12391be7f75dSAlexei Starovoitov /* only handle a transition from default "0" to "1" */ 12401be7f75dSAlexei Starovoitov .proc_handler = proc_dointvec_minmax, 1241eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 1242eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 12431be7f75dSAlexei Starovoitov }, 1244492ecee8SAlexei Starovoitov { 1245492ecee8SAlexei Starovoitov .procname = "bpf_stats_enabled", 1246a8e11e5cSEric Dumazet .data = &bpf_stats_enabled_key.key, 1247a8e11e5cSEric Dumazet .maxlen = sizeof(bpf_stats_enabled_key), 1248492ecee8SAlexei Starovoitov .mode = 0644, 1249a8e11e5cSEric Dumazet .proc_handler = proc_do_static_key, 1250492ecee8SAlexei Starovoitov }, 12513fcc5530SAlexei Starovoitov #endif 1252b3e627d3SLai Jiangshan #if defined(CONFIG_TREE_RCU) 1253088e9d25SDaniel Bristot de Oliveira { 1254088e9d25SDaniel Bristot de Oliveira .procname = "panic_on_rcu_stall", 1255088e9d25SDaniel Bristot de Oliveira .data = &sysctl_panic_on_rcu_stall, 1256088e9d25SDaniel Bristot de Oliveira .maxlen = sizeof(sysctl_panic_on_rcu_stall), 1257088e9d25SDaniel Bristot de Oliveira .mode = 0644, 1258088e9d25SDaniel Bristot de Oliveira .proc_handler = proc_dointvec_minmax, 1259eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1260eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1261088e9d25SDaniel Bristot de Oliveira }, 1262088e9d25SDaniel Bristot de Oliveira #endif 1263964c9dffSAlexander Popov #ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE 1264964c9dffSAlexander Popov { 1265964c9dffSAlexander Popov .procname = "stack_erasing", 1266964c9dffSAlexander Popov .data = NULL, 1267964c9dffSAlexander Popov .maxlen = sizeof(int), 1268964c9dffSAlexander Popov .mode = 0600, 1269964c9dffSAlexander Popov .proc_handler = stack_erasing_sysctl, 1270eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1271eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1272964c9dffSAlexander Popov }, 1273964c9dffSAlexander Popov #endif 12746fce56ecSEric W. Biederman { } 12751da177e4SLinus Torvalds }; 12761da177e4SLinus Torvalds 1277d8217f07SEric W. Biederman static struct ctl_table vm_table[] = { 12781da177e4SLinus Torvalds { 12791da177e4SLinus Torvalds .procname = "overcommit_memory", 12801da177e4SLinus Torvalds .data = &sysctl_overcommit_memory, 12811da177e4SLinus Torvalds .maxlen = sizeof(sysctl_overcommit_memory), 12821da177e4SLinus Torvalds .mode = 0644, 1283cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1284eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1285cb16e95fSPetr Holasek .extra2 = &two, 12861da177e4SLinus Torvalds }, 12871da177e4SLinus Torvalds { 1288fadd8fbdSKAMEZAWA Hiroyuki .procname = "panic_on_oom", 1289fadd8fbdSKAMEZAWA Hiroyuki .data = &sysctl_panic_on_oom, 1290fadd8fbdSKAMEZAWA Hiroyuki .maxlen = sizeof(sysctl_panic_on_oom), 1291fadd8fbdSKAMEZAWA Hiroyuki .mode = 0644, 1292cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1293eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1294cb16e95fSPetr Holasek .extra2 = &two, 1295fadd8fbdSKAMEZAWA Hiroyuki }, 1296fadd8fbdSKAMEZAWA Hiroyuki { 1297fe071d7eSDavid Rientjes .procname = "oom_kill_allocating_task", 1298fe071d7eSDavid Rientjes .data = &sysctl_oom_kill_allocating_task, 1299fe071d7eSDavid Rientjes .maxlen = sizeof(sysctl_oom_kill_allocating_task), 1300fe071d7eSDavid Rientjes .mode = 0644, 13016d456111SEric W. Biederman .proc_handler = proc_dointvec, 1302fe071d7eSDavid Rientjes }, 1303fe071d7eSDavid Rientjes { 1304fef1bdd6SDavid Rientjes .procname = "oom_dump_tasks", 1305fef1bdd6SDavid Rientjes .data = &sysctl_oom_dump_tasks, 1306fef1bdd6SDavid Rientjes .maxlen = sizeof(sysctl_oom_dump_tasks), 1307fef1bdd6SDavid Rientjes .mode = 0644, 13086d456111SEric W. Biederman .proc_handler = proc_dointvec, 1309fef1bdd6SDavid Rientjes }, 1310fef1bdd6SDavid Rientjes { 13111da177e4SLinus Torvalds .procname = "overcommit_ratio", 13121da177e4SLinus Torvalds .data = &sysctl_overcommit_ratio, 13131da177e4SLinus Torvalds .maxlen = sizeof(sysctl_overcommit_ratio), 13141da177e4SLinus Torvalds .mode = 0644, 131549f0ce5fSJerome Marchand .proc_handler = overcommit_ratio_handler, 131649f0ce5fSJerome Marchand }, 131749f0ce5fSJerome Marchand { 131849f0ce5fSJerome Marchand .procname = "overcommit_kbytes", 131949f0ce5fSJerome Marchand .data = &sysctl_overcommit_kbytes, 132049f0ce5fSJerome Marchand .maxlen = sizeof(sysctl_overcommit_kbytes), 132149f0ce5fSJerome Marchand .mode = 0644, 132249f0ce5fSJerome Marchand .proc_handler = overcommit_kbytes_handler, 13231da177e4SLinus Torvalds }, 13241da177e4SLinus Torvalds { 13251da177e4SLinus Torvalds .procname = "page-cluster", 13261da177e4SLinus Torvalds .data = &page_cluster, 13271da177e4SLinus Torvalds .maxlen = sizeof(int), 13281da177e4SLinus Torvalds .mode = 0644, 1329cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1330eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13311da177e4SLinus Torvalds }, 13321da177e4SLinus Torvalds { 13331da177e4SLinus Torvalds .procname = "dirty_background_ratio", 13341da177e4SLinus Torvalds .data = &dirty_background_ratio, 13351da177e4SLinus Torvalds .maxlen = sizeof(dirty_background_ratio), 13361da177e4SLinus Torvalds .mode = 0644, 13376d456111SEric W. Biederman .proc_handler = dirty_background_ratio_handler, 1338eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13391da177e4SLinus Torvalds .extra2 = &one_hundred, 13401da177e4SLinus Torvalds }, 13411da177e4SLinus Torvalds { 13422da02997SDavid Rientjes .procname = "dirty_background_bytes", 13432da02997SDavid Rientjes .data = &dirty_background_bytes, 13442da02997SDavid Rientjes .maxlen = sizeof(dirty_background_bytes), 13452da02997SDavid Rientjes .mode = 0644, 13466d456111SEric W. Biederman .proc_handler = dirty_background_bytes_handler, 1347fc3501d4SSven Wegener .extra1 = &one_ul, 13482da02997SDavid Rientjes }, 13492da02997SDavid Rientjes { 13501da177e4SLinus Torvalds .procname = "dirty_ratio", 13511da177e4SLinus Torvalds .data = &vm_dirty_ratio, 13521da177e4SLinus Torvalds .maxlen = sizeof(vm_dirty_ratio), 13531da177e4SLinus Torvalds .mode = 0644, 13546d456111SEric W. Biederman .proc_handler = dirty_ratio_handler, 1355eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13561da177e4SLinus Torvalds .extra2 = &one_hundred, 13571da177e4SLinus Torvalds }, 13581da177e4SLinus Torvalds { 13592da02997SDavid Rientjes .procname = "dirty_bytes", 13602da02997SDavid Rientjes .data = &vm_dirty_bytes, 13612da02997SDavid Rientjes .maxlen = sizeof(vm_dirty_bytes), 13622da02997SDavid Rientjes .mode = 0644, 13636d456111SEric W. Biederman .proc_handler = dirty_bytes_handler, 13649e4a5bdaSAndrea Righi .extra1 = &dirty_bytes_min, 13652da02997SDavid Rientjes }, 13662da02997SDavid Rientjes { 13671da177e4SLinus Torvalds .procname = "dirty_writeback_centisecs", 1368f6ef9438SBart Samwel .data = &dirty_writeback_interval, 1369f6ef9438SBart Samwel .maxlen = sizeof(dirty_writeback_interval), 13701da177e4SLinus Torvalds .mode = 0644, 13716d456111SEric W. Biederman .proc_handler = dirty_writeback_centisecs_handler, 13721da177e4SLinus Torvalds }, 13731da177e4SLinus Torvalds { 13741da177e4SLinus Torvalds .procname = "dirty_expire_centisecs", 1375f6ef9438SBart Samwel .data = &dirty_expire_interval, 1376f6ef9438SBart Samwel .maxlen = sizeof(dirty_expire_interval), 13771da177e4SLinus Torvalds .mode = 0644, 1378cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1379eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13801da177e4SLinus Torvalds }, 13811da177e4SLinus Torvalds { 13821efff914STheodore Ts'o .procname = "dirtytime_expire_seconds", 13831efff914STheodore Ts'o .data = &dirtytime_expire_interval, 13842d87b309SRandy Dunlap .maxlen = sizeof(dirtytime_expire_interval), 13851efff914STheodore Ts'o .mode = 0644, 13861efff914STheodore Ts'o .proc_handler = dirtytime_interval_handler, 1387eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13881efff914STheodore Ts'o }, 13891efff914STheodore Ts'o { 13901da177e4SLinus Torvalds .procname = "swappiness", 13911da177e4SLinus Torvalds .data = &vm_swappiness, 13921da177e4SLinus Torvalds .maxlen = sizeof(vm_swappiness), 13931da177e4SLinus Torvalds .mode = 0644, 13946d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1395eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 13961da177e4SLinus Torvalds .extra2 = &one_hundred, 13971da177e4SLinus Torvalds }, 13981da177e4SLinus Torvalds #ifdef CONFIG_HUGETLB_PAGE 13991da177e4SLinus Torvalds { 14001da177e4SLinus Torvalds .procname = "nr_hugepages", 1401e5ff2159SAndi Kleen .data = NULL, 14021da177e4SLinus Torvalds .maxlen = sizeof(unsigned long), 14031da177e4SLinus Torvalds .mode = 0644, 14046d456111SEric W. Biederman .proc_handler = hugetlb_sysctl_handler, 14051da177e4SLinus Torvalds }, 140606808b08SLee Schermerhorn #ifdef CONFIG_NUMA 140706808b08SLee Schermerhorn { 140806808b08SLee Schermerhorn .procname = "nr_hugepages_mempolicy", 140906808b08SLee Schermerhorn .data = NULL, 141006808b08SLee Schermerhorn .maxlen = sizeof(unsigned long), 141106808b08SLee Schermerhorn .mode = 0644, 141206808b08SLee Schermerhorn .proc_handler = &hugetlb_mempolicy_sysctl_handler, 141306808b08SLee Schermerhorn }, 14144518085eSKemi Wang { 14154518085eSKemi Wang .procname = "numa_stat", 14164518085eSKemi Wang .data = &sysctl_vm_numa_stat, 14174518085eSKemi Wang .maxlen = sizeof(int), 14184518085eSKemi Wang .mode = 0644, 14194518085eSKemi Wang .proc_handler = sysctl_vm_numa_stat_handler, 1420eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1421eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 14224518085eSKemi Wang }, 142306808b08SLee Schermerhorn #endif 14241da177e4SLinus Torvalds { 14251da177e4SLinus Torvalds .procname = "hugetlb_shm_group", 14261da177e4SLinus Torvalds .data = &sysctl_hugetlb_shm_group, 14271da177e4SLinus Torvalds .maxlen = sizeof(gid_t), 14281da177e4SLinus Torvalds .mode = 0644, 14296d456111SEric W. Biederman .proc_handler = proc_dointvec, 14301da177e4SLinus Torvalds }, 1431396faf03SMel Gorman { 1432d1c3fb1fSNishanth Aravamudan .procname = "nr_overcommit_hugepages", 1433e5ff2159SAndi Kleen .data = NULL, 1434e5ff2159SAndi Kleen .maxlen = sizeof(unsigned long), 1435d1c3fb1fSNishanth Aravamudan .mode = 0644, 14366d456111SEric W. Biederman .proc_handler = hugetlb_overcommit_handler, 1437d1c3fb1fSNishanth Aravamudan }, 14381da177e4SLinus Torvalds #endif 14391da177e4SLinus Torvalds { 14401da177e4SLinus Torvalds .procname = "lowmem_reserve_ratio", 14411da177e4SLinus Torvalds .data = &sysctl_lowmem_reserve_ratio, 14421da177e4SLinus Torvalds .maxlen = sizeof(sysctl_lowmem_reserve_ratio), 14431da177e4SLinus Torvalds .mode = 0644, 14446d456111SEric W. Biederman .proc_handler = lowmem_reserve_ratio_sysctl_handler, 14451da177e4SLinus Torvalds }, 14461da177e4SLinus Torvalds { 14479d0243bcSAndrew Morton .procname = "drop_caches", 14489d0243bcSAndrew Morton .data = &sysctl_drop_caches, 14499d0243bcSAndrew Morton .maxlen = sizeof(int), 1450204cb79aSJohannes Weiner .mode = 0200, 14519d0243bcSAndrew Morton .proc_handler = drop_caches_sysctl_handler, 1452eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 14535509a5d2SDave Hansen .extra2 = &four, 14549d0243bcSAndrew Morton }, 145576ab0f53SMel Gorman #ifdef CONFIG_COMPACTION 145676ab0f53SMel Gorman { 145776ab0f53SMel Gorman .procname = "compact_memory", 145876ab0f53SMel Gorman .data = &sysctl_compact_memory, 145976ab0f53SMel Gorman .maxlen = sizeof(int), 146076ab0f53SMel Gorman .mode = 0200, 146176ab0f53SMel Gorman .proc_handler = sysctl_compaction_handler, 146276ab0f53SMel Gorman }, 14635e771905SMel Gorman { 14645e771905SMel Gorman .procname = "extfrag_threshold", 14655e771905SMel Gorman .data = &sysctl_extfrag_threshold, 14665e771905SMel Gorman .maxlen = sizeof(int), 14675e771905SMel Gorman .mode = 0644, 14686b7e5cadSMatthew Wilcox .proc_handler = proc_dointvec_minmax, 14695e771905SMel Gorman .extra1 = &min_extfrag_threshold, 14705e771905SMel Gorman .extra2 = &max_extfrag_threshold, 14715e771905SMel Gorman }, 14725bbe3547SEric B Munson { 14735bbe3547SEric B Munson .procname = "compact_unevictable_allowed", 14745bbe3547SEric B Munson .data = &sysctl_compact_unevictable_allowed, 14755bbe3547SEric B Munson .maxlen = sizeof(int), 14765bbe3547SEric B Munson .mode = 0644, 14776923aa0dSSebastian Andrzej Siewior .proc_handler = proc_dointvec_minmax_warn_RT_change, 1478eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1479eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 14805bbe3547SEric B Munson }, 14815e771905SMel Gorman 148276ab0f53SMel Gorman #endif /* CONFIG_COMPACTION */ 14839d0243bcSAndrew Morton { 14841da177e4SLinus Torvalds .procname = "min_free_kbytes", 14851da177e4SLinus Torvalds .data = &min_free_kbytes, 14861da177e4SLinus Torvalds .maxlen = sizeof(min_free_kbytes), 14871da177e4SLinus Torvalds .mode = 0644, 14886d456111SEric W. Biederman .proc_handler = min_free_kbytes_sysctl_handler, 1489eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 14901da177e4SLinus Torvalds }, 14918ad4b1fbSRohit Seth { 14921c30844dSMel Gorman .procname = "watermark_boost_factor", 14931c30844dSMel Gorman .data = &watermark_boost_factor, 14941c30844dSMel Gorman .maxlen = sizeof(watermark_boost_factor), 14951c30844dSMel Gorman .mode = 0644, 14961c30844dSMel Gorman .proc_handler = watermark_boost_factor_sysctl_handler, 1497eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 14981c30844dSMel Gorman }, 14991c30844dSMel Gorman { 1500795ae7a0SJohannes Weiner .procname = "watermark_scale_factor", 1501795ae7a0SJohannes Weiner .data = &watermark_scale_factor, 1502795ae7a0SJohannes Weiner .maxlen = sizeof(watermark_scale_factor), 1503795ae7a0SJohannes Weiner .mode = 0644, 1504795ae7a0SJohannes Weiner .proc_handler = watermark_scale_factor_sysctl_handler, 1505eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 1506795ae7a0SJohannes Weiner .extra2 = &one_thousand, 1507795ae7a0SJohannes Weiner }, 1508795ae7a0SJohannes Weiner { 15098ad4b1fbSRohit Seth .procname = "percpu_pagelist_fraction", 15108ad4b1fbSRohit Seth .data = &percpu_pagelist_fraction, 15118ad4b1fbSRohit Seth .maxlen = sizeof(percpu_pagelist_fraction), 15128ad4b1fbSRohit Seth .mode = 0644, 15136d456111SEric W. Biederman .proc_handler = percpu_pagelist_fraction_sysctl_handler, 1514eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15158ad4b1fbSRohit Seth }, 15161da177e4SLinus Torvalds #ifdef CONFIG_MMU 15171da177e4SLinus Torvalds { 15181da177e4SLinus Torvalds .procname = "max_map_count", 15191da177e4SLinus Torvalds .data = &sysctl_max_map_count, 15201da177e4SLinus Torvalds .maxlen = sizeof(sysctl_max_map_count), 15211da177e4SLinus Torvalds .mode = 0644, 15223e26120cSWANG Cong .proc_handler = proc_dointvec_minmax, 1523eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15241da177e4SLinus Torvalds }, 1525dd8632a1SPaul Mundt #else 1526dd8632a1SPaul Mundt { 1527dd8632a1SPaul Mundt .procname = "nr_trim_pages", 1528dd8632a1SPaul Mundt .data = &sysctl_nr_trim_pages, 1529dd8632a1SPaul Mundt .maxlen = sizeof(sysctl_nr_trim_pages), 1530dd8632a1SPaul Mundt .mode = 0644, 15316d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1532eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1533dd8632a1SPaul Mundt }, 15341da177e4SLinus Torvalds #endif 15351da177e4SLinus Torvalds { 15361da177e4SLinus Torvalds .procname = "laptop_mode", 15371da177e4SLinus Torvalds .data = &laptop_mode, 15381da177e4SLinus Torvalds .maxlen = sizeof(laptop_mode), 15391da177e4SLinus Torvalds .mode = 0644, 15406d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 15411da177e4SLinus Torvalds }, 15421da177e4SLinus Torvalds { 15431da177e4SLinus Torvalds .procname = "block_dump", 15441da177e4SLinus Torvalds .data = &block_dump, 15451da177e4SLinus Torvalds .maxlen = sizeof(block_dump), 15461da177e4SLinus Torvalds .mode = 0644, 15476d456111SEric W. Biederman .proc_handler = proc_dointvec, 1548eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15491da177e4SLinus Torvalds }, 15501da177e4SLinus Torvalds { 15511da177e4SLinus Torvalds .procname = "vfs_cache_pressure", 15521da177e4SLinus Torvalds .data = &sysctl_vfs_cache_pressure, 15531da177e4SLinus Torvalds .maxlen = sizeof(sysctl_vfs_cache_pressure), 15541da177e4SLinus Torvalds .mode = 0644, 15556d456111SEric W. Biederman .proc_handler = proc_dointvec, 1556eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15571da177e4SLinus Torvalds }, 155867f3977fSAlexandre Ghiti #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \ 155967f3977fSAlexandre Ghiti defined(CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT) 15601da177e4SLinus Torvalds { 15611da177e4SLinus Torvalds .procname = "legacy_va_layout", 15621da177e4SLinus Torvalds .data = &sysctl_legacy_va_layout, 15631da177e4SLinus Torvalds .maxlen = sizeof(sysctl_legacy_va_layout), 15641da177e4SLinus Torvalds .mode = 0644, 15656d456111SEric W. Biederman .proc_handler = proc_dointvec, 1566eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15671da177e4SLinus Torvalds }, 15681da177e4SLinus Torvalds #endif 15691743660bSChristoph Lameter #ifdef CONFIG_NUMA 15701743660bSChristoph Lameter { 15711743660bSChristoph Lameter .procname = "zone_reclaim_mode", 1572a5f5f91dSMel Gorman .data = &node_reclaim_mode, 1573a5f5f91dSMel Gorman .maxlen = sizeof(node_reclaim_mode), 15741743660bSChristoph Lameter .mode = 0644, 15756d456111SEric W. Biederman .proc_handler = proc_dointvec, 1576eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15771743660bSChristoph Lameter }, 15789614634fSChristoph Lameter { 15799614634fSChristoph Lameter .procname = "min_unmapped_ratio", 15809614634fSChristoph Lameter .data = &sysctl_min_unmapped_ratio, 15819614634fSChristoph Lameter .maxlen = sizeof(sysctl_min_unmapped_ratio), 15829614634fSChristoph Lameter .mode = 0644, 15836d456111SEric W. Biederman .proc_handler = sysctl_min_unmapped_ratio_sysctl_handler, 1584eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15859614634fSChristoph Lameter .extra2 = &one_hundred, 15869614634fSChristoph Lameter }, 15870ff38490SChristoph Lameter { 15880ff38490SChristoph Lameter .procname = "min_slab_ratio", 15890ff38490SChristoph Lameter .data = &sysctl_min_slab_ratio, 15900ff38490SChristoph Lameter .maxlen = sizeof(sysctl_min_slab_ratio), 15910ff38490SChristoph Lameter .mode = 0644, 15926d456111SEric W. Biederman .proc_handler = sysctl_min_slab_ratio_sysctl_handler, 1593eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 15940ff38490SChristoph Lameter .extra2 = &one_hundred, 15950ff38490SChristoph Lameter }, 15961743660bSChristoph Lameter #endif 159777461ab3SChristoph Lameter #ifdef CONFIG_SMP 159877461ab3SChristoph Lameter { 159977461ab3SChristoph Lameter .procname = "stat_interval", 160077461ab3SChristoph Lameter .data = &sysctl_stat_interval, 160177461ab3SChristoph Lameter .maxlen = sizeof(sysctl_stat_interval), 160277461ab3SChristoph Lameter .mode = 0644, 16036d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 160477461ab3SChristoph Lameter }, 160552b6f46bSHugh Dickins { 160652b6f46bSHugh Dickins .procname = "stat_refresh", 160752b6f46bSHugh Dickins .data = NULL, 160852b6f46bSHugh Dickins .maxlen = 0, 160952b6f46bSHugh Dickins .mode = 0600, 161052b6f46bSHugh Dickins .proc_handler = vmstat_refresh, 161152b6f46bSHugh Dickins }, 161277461ab3SChristoph Lameter #endif 16136e141546SDavid Howells #ifdef CONFIG_MMU 1614ed032189SEric Paris { 1615ed032189SEric Paris .procname = "mmap_min_addr", 1616788084abSEric Paris .data = &dac_mmap_min_addr, 1617ed032189SEric Paris .maxlen = sizeof(unsigned long), 1618ed032189SEric Paris .mode = 0644, 16196d456111SEric W. Biederman .proc_handler = mmap_min_addr_handler, 1620ed032189SEric Paris }, 16216e141546SDavid Howells #endif 1622f0c0b2b8SKAMEZAWA Hiroyuki #ifdef CONFIG_NUMA 1623f0c0b2b8SKAMEZAWA Hiroyuki { 1624f0c0b2b8SKAMEZAWA Hiroyuki .procname = "numa_zonelist_order", 1625f0c0b2b8SKAMEZAWA Hiroyuki .data = &numa_zonelist_order, 1626f0c0b2b8SKAMEZAWA Hiroyuki .maxlen = NUMA_ZONELIST_ORDER_LEN, 1627f0c0b2b8SKAMEZAWA Hiroyuki .mode = 0644, 16286d456111SEric W. Biederman .proc_handler = numa_zonelist_order_handler, 1629f0c0b2b8SKAMEZAWA Hiroyuki }, 1630f0c0b2b8SKAMEZAWA Hiroyuki #endif 16312b8232ceSAl Viro #if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \ 16325c36e657SPaul Mundt (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL)) 1633e6e5494cSIngo Molnar { 1634e6e5494cSIngo Molnar .procname = "vdso_enabled", 16353d7ee969SAndy Lutomirski #ifdef CONFIG_X86_32 16363d7ee969SAndy Lutomirski .data = &vdso32_enabled, 16373d7ee969SAndy Lutomirski .maxlen = sizeof(vdso32_enabled), 16383d7ee969SAndy Lutomirski #else 1639e6e5494cSIngo Molnar .data = &vdso_enabled, 1640e6e5494cSIngo Molnar .maxlen = sizeof(vdso_enabled), 16413d7ee969SAndy Lutomirski #endif 1642e6e5494cSIngo Molnar .mode = 0644, 16436d456111SEric W. Biederman .proc_handler = proc_dointvec, 1644eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1645e6e5494cSIngo Molnar }, 1646e6e5494cSIngo Molnar #endif 1647195cf453SBron Gondwana #ifdef CONFIG_HIGHMEM 1648195cf453SBron Gondwana { 1649195cf453SBron Gondwana .procname = "highmem_is_dirtyable", 1650195cf453SBron Gondwana .data = &vm_highmem_is_dirtyable, 1651195cf453SBron Gondwana .maxlen = sizeof(vm_highmem_is_dirtyable), 1652195cf453SBron Gondwana .mode = 0644, 16536d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1654eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1655eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1656195cf453SBron Gondwana }, 1657195cf453SBron Gondwana #endif 16586a46079cSAndi Kleen #ifdef CONFIG_MEMORY_FAILURE 16596a46079cSAndi Kleen { 16606a46079cSAndi Kleen .procname = "memory_failure_early_kill", 16616a46079cSAndi Kleen .data = &sysctl_memory_failure_early_kill, 16626a46079cSAndi Kleen .maxlen = sizeof(sysctl_memory_failure_early_kill), 16636a46079cSAndi Kleen .mode = 0644, 16646d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1665eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1666eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 16676a46079cSAndi Kleen }, 16686a46079cSAndi Kleen { 16696a46079cSAndi Kleen .procname = "memory_failure_recovery", 16706a46079cSAndi Kleen .data = &sysctl_memory_failure_recovery, 16716a46079cSAndi Kleen .maxlen = sizeof(sysctl_memory_failure_recovery), 16726a46079cSAndi Kleen .mode = 0644, 16736d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1674eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1675eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 16766a46079cSAndi Kleen }, 16776a46079cSAndi Kleen #endif 1678c9b1d098SAndrew Shewmaker { 1679c9b1d098SAndrew Shewmaker .procname = "user_reserve_kbytes", 1680c9b1d098SAndrew Shewmaker .data = &sysctl_user_reserve_kbytes, 1681c9b1d098SAndrew Shewmaker .maxlen = sizeof(sysctl_user_reserve_kbytes), 1682c9b1d098SAndrew Shewmaker .mode = 0644, 1683c9b1d098SAndrew Shewmaker .proc_handler = proc_doulongvec_minmax, 1684c9b1d098SAndrew Shewmaker }, 16854eeab4f5SAndrew Shewmaker { 16864eeab4f5SAndrew Shewmaker .procname = "admin_reserve_kbytes", 16874eeab4f5SAndrew Shewmaker .data = &sysctl_admin_reserve_kbytes, 16884eeab4f5SAndrew Shewmaker .maxlen = sizeof(sysctl_admin_reserve_kbytes), 16894eeab4f5SAndrew Shewmaker .mode = 0644, 16904eeab4f5SAndrew Shewmaker .proc_handler = proc_doulongvec_minmax, 16914eeab4f5SAndrew Shewmaker }, 1692d07e2259SDaniel Cashman #ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS 1693d07e2259SDaniel Cashman { 1694d07e2259SDaniel Cashman .procname = "mmap_rnd_bits", 1695d07e2259SDaniel Cashman .data = &mmap_rnd_bits, 1696d07e2259SDaniel Cashman .maxlen = sizeof(mmap_rnd_bits), 1697d07e2259SDaniel Cashman .mode = 0600, 1698d07e2259SDaniel Cashman .proc_handler = proc_dointvec_minmax, 1699d07e2259SDaniel Cashman .extra1 = (void *)&mmap_rnd_bits_min, 1700d07e2259SDaniel Cashman .extra2 = (void *)&mmap_rnd_bits_max, 1701d07e2259SDaniel Cashman }, 1702d07e2259SDaniel Cashman #endif 1703d07e2259SDaniel Cashman #ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS 1704d07e2259SDaniel Cashman { 1705d07e2259SDaniel Cashman .procname = "mmap_rnd_compat_bits", 1706d07e2259SDaniel Cashman .data = &mmap_rnd_compat_bits, 1707d07e2259SDaniel Cashman .maxlen = sizeof(mmap_rnd_compat_bits), 1708d07e2259SDaniel Cashman .mode = 0600, 1709d07e2259SDaniel Cashman .proc_handler = proc_dointvec_minmax, 1710d07e2259SDaniel Cashman .extra1 = (void *)&mmap_rnd_compat_bits_min, 1711d07e2259SDaniel Cashman .extra2 = (void *)&mmap_rnd_compat_bits_max, 1712d07e2259SDaniel Cashman }, 1713d07e2259SDaniel Cashman #endif 1714cefdca0aSPeter Xu #ifdef CONFIG_USERFAULTFD 1715cefdca0aSPeter Xu { 1716cefdca0aSPeter Xu .procname = "unprivileged_userfaultfd", 1717cefdca0aSPeter Xu .data = &sysctl_unprivileged_userfaultfd, 1718cefdca0aSPeter Xu .maxlen = sizeof(sysctl_unprivileged_userfaultfd), 1719cefdca0aSPeter Xu .mode = 0644, 1720cefdca0aSPeter Xu .proc_handler = proc_dointvec_minmax, 1721eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1722eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1723cefdca0aSPeter Xu }, 1724cefdca0aSPeter Xu #endif 17256fce56ecSEric W. Biederman { } 17261da177e4SLinus Torvalds }; 17271da177e4SLinus Torvalds 1728d8217f07SEric W. Biederman static struct ctl_table fs_table[] = { 17291da177e4SLinus Torvalds { 17301da177e4SLinus Torvalds .procname = "inode-nr", 17311da177e4SLinus Torvalds .data = &inodes_stat, 17323942c07cSGlauber Costa .maxlen = 2*sizeof(long), 17331da177e4SLinus Torvalds .mode = 0444, 1734cffbc8aaSDave Chinner .proc_handler = proc_nr_inodes, 17351da177e4SLinus Torvalds }, 17361da177e4SLinus Torvalds { 17371da177e4SLinus Torvalds .procname = "inode-state", 17381da177e4SLinus Torvalds .data = &inodes_stat, 17393942c07cSGlauber Costa .maxlen = 7*sizeof(long), 17401da177e4SLinus Torvalds .mode = 0444, 1741cffbc8aaSDave Chinner .proc_handler = proc_nr_inodes, 17421da177e4SLinus Torvalds }, 17431da177e4SLinus Torvalds { 17441da177e4SLinus Torvalds .procname = "file-nr", 17451da177e4SLinus Torvalds .data = &files_stat, 1746518de9b3SEric Dumazet .maxlen = sizeof(files_stat), 17471da177e4SLinus Torvalds .mode = 0444, 17486d456111SEric W. Biederman .proc_handler = proc_nr_files, 17491da177e4SLinus Torvalds }, 17501da177e4SLinus Torvalds { 17511da177e4SLinus Torvalds .procname = "file-max", 17521da177e4SLinus Torvalds .data = &files_stat.max_files, 1753518de9b3SEric Dumazet .maxlen = sizeof(files_stat.max_files), 17541da177e4SLinus Torvalds .mode = 0644, 1755518de9b3SEric Dumazet .proc_handler = proc_doulongvec_minmax, 17569002b214SWill Deacon .extra1 = &zero_ul, 175732a5ad9cSChristian Brauner .extra2 = &long_max, 17581da177e4SLinus Torvalds }, 17591da177e4SLinus Torvalds { 17609cfe015aSEric Dumazet .procname = "nr_open", 17619cfe015aSEric Dumazet .data = &sysctl_nr_open, 17629b80a184SAlexey Dobriyan .maxlen = sizeof(unsigned int), 17639cfe015aSEric Dumazet .mode = 0644, 17646d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1765eceea0b3SAl Viro .extra1 = &sysctl_nr_open_min, 1766eceea0b3SAl Viro .extra2 = &sysctl_nr_open_max, 17679cfe015aSEric Dumazet }, 17689cfe015aSEric Dumazet { 17691da177e4SLinus Torvalds .procname = "dentry-state", 17701da177e4SLinus Torvalds .data = &dentry_stat, 17713942c07cSGlauber Costa .maxlen = 6*sizeof(long), 17721da177e4SLinus Torvalds .mode = 0444, 1773312d3ca8SChristoph Hellwig .proc_handler = proc_nr_dentry, 17741da177e4SLinus Torvalds }, 17751da177e4SLinus Torvalds { 17761da177e4SLinus Torvalds .procname = "overflowuid", 17771da177e4SLinus Torvalds .data = &fs_overflowuid, 17781da177e4SLinus Torvalds .maxlen = sizeof(int), 17791da177e4SLinus Torvalds .mode = 0644, 17806d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 17811da177e4SLinus Torvalds .extra1 = &minolduid, 17821da177e4SLinus Torvalds .extra2 = &maxolduid, 17831da177e4SLinus Torvalds }, 17841da177e4SLinus Torvalds { 17851da177e4SLinus Torvalds .procname = "overflowgid", 17861da177e4SLinus Torvalds .data = &fs_overflowgid, 17871da177e4SLinus Torvalds .maxlen = sizeof(int), 17881da177e4SLinus Torvalds .mode = 0644, 17896d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 17901da177e4SLinus Torvalds .extra1 = &minolduid, 17911da177e4SLinus Torvalds .extra2 = &maxolduid, 17921da177e4SLinus Torvalds }, 1793bfcd17a6SThomas Petazzoni #ifdef CONFIG_FILE_LOCKING 17941da177e4SLinus Torvalds { 17951da177e4SLinus Torvalds .procname = "leases-enable", 17961da177e4SLinus Torvalds .data = &leases_enable, 17971da177e4SLinus Torvalds .maxlen = sizeof(int), 17981da177e4SLinus Torvalds .mode = 0644, 17996d456111SEric W. Biederman .proc_handler = proc_dointvec, 18001da177e4SLinus Torvalds }, 1801bfcd17a6SThomas Petazzoni #endif 18021da177e4SLinus Torvalds #ifdef CONFIG_DNOTIFY 18031da177e4SLinus Torvalds { 18041da177e4SLinus Torvalds .procname = "dir-notify-enable", 18051da177e4SLinus Torvalds .data = &dir_notify_enable, 18061da177e4SLinus Torvalds .maxlen = sizeof(int), 18071da177e4SLinus Torvalds .mode = 0644, 18086d456111SEric W. Biederman .proc_handler = proc_dointvec, 18091da177e4SLinus Torvalds }, 18101da177e4SLinus Torvalds #endif 18111da177e4SLinus Torvalds #ifdef CONFIG_MMU 1812bfcd17a6SThomas Petazzoni #ifdef CONFIG_FILE_LOCKING 18131da177e4SLinus Torvalds { 18141da177e4SLinus Torvalds .procname = "lease-break-time", 18151da177e4SLinus Torvalds .data = &lease_break_time, 18161da177e4SLinus Torvalds .maxlen = sizeof(int), 18171da177e4SLinus Torvalds .mode = 0644, 18186d456111SEric W. Biederman .proc_handler = proc_dointvec, 18191da177e4SLinus Torvalds }, 1820bfcd17a6SThomas Petazzoni #endif 1821ebf3f09cSThomas Petazzoni #ifdef CONFIG_AIO 18221da177e4SLinus Torvalds { 18231da177e4SLinus Torvalds .procname = "aio-nr", 18241da177e4SLinus Torvalds .data = &aio_nr, 18251da177e4SLinus Torvalds .maxlen = sizeof(aio_nr), 18261da177e4SLinus Torvalds .mode = 0444, 18276d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 18281da177e4SLinus Torvalds }, 18291da177e4SLinus Torvalds { 18301da177e4SLinus Torvalds .procname = "aio-max-nr", 18311da177e4SLinus Torvalds .data = &aio_max_nr, 18321da177e4SLinus Torvalds .maxlen = sizeof(aio_max_nr), 18331da177e4SLinus Torvalds .mode = 0644, 18346d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 18351da177e4SLinus Torvalds }, 1836ebf3f09cSThomas Petazzoni #endif /* CONFIG_AIO */ 18372d9048e2SAmy Griffis #ifdef CONFIG_INOTIFY_USER 18380399cb08SRobert Love { 18390399cb08SRobert Love .procname = "inotify", 18400399cb08SRobert Love .mode = 0555, 18410399cb08SRobert Love .child = inotify_table, 18420399cb08SRobert Love }, 18430399cb08SRobert Love #endif 18447ef9964eSDavide Libenzi #ifdef CONFIG_EPOLL 18457ef9964eSDavide Libenzi { 18467ef9964eSDavide Libenzi .procname = "epoll", 18477ef9964eSDavide Libenzi .mode = 0555, 18487ef9964eSDavide Libenzi .child = epoll_table, 18497ef9964eSDavide Libenzi }, 18507ef9964eSDavide Libenzi #endif 18511da177e4SLinus Torvalds #endif 1852d6e71144SAlan Cox { 1853800179c9SKees Cook .procname = "protected_symlinks", 1854800179c9SKees Cook .data = &sysctl_protected_symlinks, 1855800179c9SKees Cook .maxlen = sizeof(int), 1856800179c9SKees Cook .mode = 0600, 1857800179c9SKees Cook .proc_handler = proc_dointvec_minmax, 1858eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1859eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1860800179c9SKees Cook }, 1861800179c9SKees Cook { 1862800179c9SKees Cook .procname = "protected_hardlinks", 1863800179c9SKees Cook .data = &sysctl_protected_hardlinks, 1864800179c9SKees Cook .maxlen = sizeof(int), 1865800179c9SKees Cook .mode = 0600, 1866800179c9SKees Cook .proc_handler = proc_dointvec_minmax, 1867eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1868eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1869800179c9SKees Cook }, 1870800179c9SKees Cook { 187130aba665SSalvatore Mesoraca .procname = "protected_fifos", 187230aba665SSalvatore Mesoraca .data = &sysctl_protected_fifos, 187330aba665SSalvatore Mesoraca .maxlen = sizeof(int), 187430aba665SSalvatore Mesoraca .mode = 0600, 187530aba665SSalvatore Mesoraca .proc_handler = proc_dointvec_minmax, 1876eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 187730aba665SSalvatore Mesoraca .extra2 = &two, 187830aba665SSalvatore Mesoraca }, 187930aba665SSalvatore Mesoraca { 188030aba665SSalvatore Mesoraca .procname = "protected_regular", 188130aba665SSalvatore Mesoraca .data = &sysctl_protected_regular, 188230aba665SSalvatore Mesoraca .maxlen = sizeof(int), 188330aba665SSalvatore Mesoraca .mode = 0600, 188430aba665SSalvatore Mesoraca .proc_handler = proc_dointvec_minmax, 1885eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 188630aba665SSalvatore Mesoraca .extra2 = &two, 188730aba665SSalvatore Mesoraca }, 188830aba665SSalvatore Mesoraca { 1889d6e71144SAlan Cox .procname = "suid_dumpable", 1890d6e71144SAlan Cox .data = &suid_dumpable, 1891d6e71144SAlan Cox .maxlen = sizeof(int), 1892d6e71144SAlan Cox .mode = 0644, 189354b50199SKees Cook .proc_handler = proc_dointvec_minmax_coredump, 1894eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 18958e654fbaSMatthew Wilcox .extra2 = &two, 1896d6e71144SAlan Cox }, 18972abc26fcSEric W. Biederman #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE) 18982abc26fcSEric W. Biederman { 18992abc26fcSEric W. Biederman .procname = "binfmt_misc", 19002abc26fcSEric W. Biederman .mode = 0555, 1901f9bd6733SEric W. Biederman .child = sysctl_mount_point, 19022abc26fcSEric W. Biederman }, 19032abc26fcSEric W. Biederman #endif 1904b492e95bSJens Axboe { 1905ff9da691SJens Axboe .procname = "pipe-max-size", 1906ff9da691SJens Axboe .data = &pipe_max_size, 190798159d97SJoe Lawrence .maxlen = sizeof(pipe_max_size), 1908b492e95bSJens Axboe .mode = 0644, 1909319e0a21SEric Biggers .proc_handler = proc_dopipe_max_size, 1910b492e95bSJens Axboe }, 1911759c0114SWilly Tarreau { 1912759c0114SWilly Tarreau .procname = "pipe-user-pages-hard", 1913759c0114SWilly Tarreau .data = &pipe_user_pages_hard, 1914759c0114SWilly Tarreau .maxlen = sizeof(pipe_user_pages_hard), 1915759c0114SWilly Tarreau .mode = 0644, 1916759c0114SWilly Tarreau .proc_handler = proc_doulongvec_minmax, 1917759c0114SWilly Tarreau }, 1918759c0114SWilly Tarreau { 1919759c0114SWilly Tarreau .procname = "pipe-user-pages-soft", 1920759c0114SWilly Tarreau .data = &pipe_user_pages_soft, 1921759c0114SWilly Tarreau .maxlen = sizeof(pipe_user_pages_soft), 1922759c0114SWilly Tarreau .mode = 0644, 1923759c0114SWilly Tarreau .proc_handler = proc_doulongvec_minmax, 1924759c0114SWilly Tarreau }, 1925d2921684SEric W. Biederman { 1926d2921684SEric W. Biederman .procname = "mount-max", 1927d2921684SEric W. Biederman .data = &sysctl_mount_max, 1928d2921684SEric W. Biederman .maxlen = sizeof(unsigned int), 1929d2921684SEric W. Biederman .mode = 0644, 1930d2921684SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1931eec4844fSMatteo Croce .extra1 = SYSCTL_ONE, 1932d2921684SEric W. Biederman }, 19336fce56ecSEric W. Biederman { } 19341da177e4SLinus Torvalds }; 19351da177e4SLinus Torvalds 1936d8217f07SEric W. Biederman static struct ctl_table debug_table[] = { 19377ac57a89SCatalin Marinas #ifdef CONFIG_SYSCTL_EXCEPTION_TRACE 1938abd4f750SMasoud Asgharifard Sharbiani { 1939abd4f750SMasoud Asgharifard Sharbiani .procname = "exception-trace", 1940abd4f750SMasoud Asgharifard Sharbiani .data = &show_unhandled_signals, 1941abd4f750SMasoud Asgharifard Sharbiani .maxlen = sizeof(int), 1942abd4f750SMasoud Asgharifard Sharbiani .mode = 0644, 1943abd4f750SMasoud Asgharifard Sharbiani .proc_handler = proc_dointvec 1944abd4f750SMasoud Asgharifard Sharbiani }, 1945abd4f750SMasoud Asgharifard Sharbiani #endif 1946b2be84dfSMasami Hiramatsu #if defined(CONFIG_OPTPROBES) 1947b2be84dfSMasami Hiramatsu { 1948b2be84dfSMasami Hiramatsu .procname = "kprobes-optimization", 1949b2be84dfSMasami Hiramatsu .data = &sysctl_kprobes_optimization, 1950b2be84dfSMasami Hiramatsu .maxlen = sizeof(int), 1951b2be84dfSMasami Hiramatsu .mode = 0644, 1952b2be84dfSMasami Hiramatsu .proc_handler = proc_kprobes_optimization_handler, 1953eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 1954eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 1955b2be84dfSMasami Hiramatsu }, 1956b2be84dfSMasami Hiramatsu #endif 19576fce56ecSEric W. Biederman { } 19581da177e4SLinus Torvalds }; 19591da177e4SLinus Torvalds 1960d8217f07SEric W. Biederman static struct ctl_table dev_table[] = { 19616fce56ecSEric W. Biederman { } 19621da177e4SLinus Torvalds }; 19631da177e4SLinus Torvalds 1964de4e83bdSEric W. Biederman int __init sysctl_init(void) 1965330d57fbSAl Viro { 1966fd4b616bSSteven Rostedt struct ctl_table_header *hdr; 1967fd4b616bSSteven Rostedt 1968fd4b616bSSteven Rostedt hdr = register_sysctl_table(sysctl_base_table); 1969fd4b616bSSteven Rostedt kmemleak_not_leak(hdr); 1970330d57fbSAl Viro return 0; 1971f7e6ced4SAl Viro } 1972f7e6ced4SAl Viro 1973b89a8171SEric W. Biederman #endif /* CONFIG_SYSCTL */ 1974b89a8171SEric W. Biederman 19751da177e4SLinus Torvalds /* 19761da177e4SLinus Torvalds * /proc/sys support 19771da177e4SLinus Torvalds */ 19781da177e4SLinus Torvalds 1979b89a8171SEric W. Biederman #ifdef CONFIG_PROC_SYSCTL 19801da177e4SLinus Torvalds 1981f8808300SKees Cook static int _proc_do_string(char *data, int maxlen, int write, 1982f8808300SKees Cook char __user *buffer, 1983b1ba4dddSAdrian Bunk size_t *lenp, loff_t *ppos) 1984f5dd3d6fSSam Vilain { 1985f5dd3d6fSSam Vilain size_t len; 1986f5dd3d6fSSam Vilain char __user *p; 1987f5dd3d6fSSam Vilain char c; 1988f5dd3d6fSSam Vilain 19898d060877SOleg Nesterov if (!data || !maxlen || !*lenp) { 1990f5dd3d6fSSam Vilain *lenp = 0; 1991f5dd3d6fSSam Vilain return 0; 1992f5dd3d6fSSam Vilain } 1993f5dd3d6fSSam Vilain 1994f5dd3d6fSSam Vilain if (write) { 1995f4aacea2SKees Cook if (sysctl_writes_strict == SYSCTL_WRITES_STRICT) { 1996f4aacea2SKees Cook /* Only continue writes not past the end of buffer. */ 1997f4aacea2SKees Cook len = strlen(data); 1998f4aacea2SKees Cook if (len > maxlen - 1) 1999f4aacea2SKees Cook len = maxlen - 1; 2000f4aacea2SKees Cook 2001f4aacea2SKees Cook if (*ppos > len) 2002f4aacea2SKees Cook return 0; 2003f4aacea2SKees Cook len = *ppos; 2004f4aacea2SKees Cook } else { 20052ca9bb45SKees Cook /* Start writing from beginning of buffer. */ 2006f5dd3d6fSSam Vilain len = 0; 2007f4aacea2SKees Cook } 2008f4aacea2SKees Cook 20092ca9bb45SKees Cook *ppos += *lenp; 2010f5dd3d6fSSam Vilain p = buffer; 20112ca9bb45SKees Cook while ((p - buffer) < *lenp && len < maxlen - 1) { 2012f5dd3d6fSSam Vilain if (get_user(c, p++)) 2013f5dd3d6fSSam Vilain return -EFAULT; 2014f5dd3d6fSSam Vilain if (c == 0 || c == '\n') 2015f5dd3d6fSSam Vilain break; 20162ca9bb45SKees Cook data[len++] = c; 2017f5dd3d6fSSam Vilain } 2018f8808300SKees Cook data[len] = 0; 2019f5dd3d6fSSam Vilain } else { 2020f5dd3d6fSSam Vilain len = strlen(data); 2021f5dd3d6fSSam Vilain if (len > maxlen) 2022f5dd3d6fSSam Vilain len = maxlen; 20238d060877SOleg Nesterov 20248d060877SOleg Nesterov if (*ppos > len) { 20258d060877SOleg Nesterov *lenp = 0; 20268d060877SOleg Nesterov return 0; 20278d060877SOleg Nesterov } 20288d060877SOleg Nesterov 20298d060877SOleg Nesterov data += *ppos; 20308d060877SOleg Nesterov len -= *ppos; 20318d060877SOleg Nesterov 2032f5dd3d6fSSam Vilain if (len > *lenp) 2033f5dd3d6fSSam Vilain len = *lenp; 2034f5dd3d6fSSam Vilain if (len) 2035f5dd3d6fSSam Vilain if (copy_to_user(buffer, data, len)) 2036f5dd3d6fSSam Vilain return -EFAULT; 2037f5dd3d6fSSam Vilain if (len < *lenp) { 2038f8808300SKees Cook if (put_user('\n', buffer + len)) 2039f5dd3d6fSSam Vilain return -EFAULT; 2040f5dd3d6fSSam Vilain len++; 2041f5dd3d6fSSam Vilain } 2042f5dd3d6fSSam Vilain *lenp = len; 2043f5dd3d6fSSam Vilain *ppos += len; 2044f5dd3d6fSSam Vilain } 2045f5dd3d6fSSam Vilain return 0; 2046f5dd3d6fSSam Vilain } 2047f5dd3d6fSSam Vilain 2048f4aacea2SKees Cook static void warn_sysctl_write(struct ctl_table *table) 2049f4aacea2SKees Cook { 2050f4aacea2SKees Cook pr_warn_once("%s wrote to %s when file position was not 0!\n" 2051f4aacea2SKees Cook "This will not be supported in the future. To silence this\n" 2052f4aacea2SKees Cook "warning, set kernel.sysctl_writes_strict = -1\n", 2053f4aacea2SKees Cook current->comm, table->procname); 2054f4aacea2SKees Cook } 2055f4aacea2SKees Cook 20561da177e4SLinus Torvalds /** 20575f733e8aSRandy Dunlap * proc_first_pos_non_zero_ignore - check if first position is allowed 2058d383d484SLuis R. Rodriguez * @ppos: file position 2059d383d484SLuis R. Rodriguez * @table: the sysctl table 2060d383d484SLuis R. Rodriguez * 2061d383d484SLuis R. Rodriguez * Returns true if the first position is non-zero and the sysctl_writes_strict 2062d383d484SLuis R. Rodriguez * mode indicates this is not allowed for numeric input types. String proc 20635f733e8aSRandy Dunlap * handlers can ignore the return value. 2064d383d484SLuis R. Rodriguez */ 2065d383d484SLuis R. Rodriguez static bool proc_first_pos_non_zero_ignore(loff_t *ppos, 2066d383d484SLuis R. Rodriguez struct ctl_table *table) 2067d383d484SLuis R. Rodriguez { 2068d383d484SLuis R. Rodriguez if (!*ppos) 2069d383d484SLuis R. Rodriguez return false; 2070d383d484SLuis R. Rodriguez 2071d383d484SLuis R. Rodriguez switch (sysctl_writes_strict) { 2072d383d484SLuis R. Rodriguez case SYSCTL_WRITES_STRICT: 2073d383d484SLuis R. Rodriguez return true; 2074d383d484SLuis R. Rodriguez case SYSCTL_WRITES_WARN: 2075d383d484SLuis R. Rodriguez warn_sysctl_write(table); 2076d383d484SLuis R. Rodriguez return false; 2077d383d484SLuis R. Rodriguez default: 2078d383d484SLuis R. Rodriguez return false; 2079d383d484SLuis R. Rodriguez } 2080d383d484SLuis R. Rodriguez } 2081d383d484SLuis R. Rodriguez 2082d383d484SLuis R. Rodriguez /** 20831da177e4SLinus Torvalds * proc_dostring - read a string sysctl 20841da177e4SLinus Torvalds * @table: the sysctl table 20851da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 20861da177e4SLinus Torvalds * @buffer: the user buffer 20871da177e4SLinus Torvalds * @lenp: the size of the user buffer 20881da177e4SLinus Torvalds * @ppos: file position 20891da177e4SLinus Torvalds * 20901da177e4SLinus Torvalds * Reads/writes a string from/to the user buffer. If the kernel 20911da177e4SLinus Torvalds * buffer provided is not large enough to hold the string, the 20921da177e4SLinus Torvalds * string is truncated. The copied string is %NULL-terminated. 20931da177e4SLinus Torvalds * If the string is being read by the user process, it is copied 20941da177e4SLinus Torvalds * and a newline '\n' is added. It is truncated if the buffer is 20951da177e4SLinus Torvalds * not large enough. 20961da177e4SLinus Torvalds * 20971da177e4SLinus Torvalds * Returns 0 on success. 20981da177e4SLinus Torvalds */ 20998d65af78SAlexey Dobriyan int proc_dostring(struct ctl_table *table, int write, 21001da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 21011da177e4SLinus Torvalds { 2102d383d484SLuis R. Rodriguez if (write) 2103d383d484SLuis R. Rodriguez proc_first_pos_non_zero_ignore(ppos, table); 2104f4aacea2SKees Cook 2105f8808300SKees Cook return _proc_do_string((char *)(table->data), table->maxlen, write, 2106f8808300SKees Cook (char __user *)buffer, lenp, ppos); 21071da177e4SLinus Torvalds } 21081da177e4SLinus Torvalds 210900b7c339SAmerigo Wang static size_t proc_skip_spaces(char **buf) 211000b7c339SAmerigo Wang { 211100b7c339SAmerigo Wang size_t ret; 211200b7c339SAmerigo Wang char *tmp = skip_spaces(*buf); 211300b7c339SAmerigo Wang ret = tmp - *buf; 211400b7c339SAmerigo Wang *buf = tmp; 211500b7c339SAmerigo Wang return ret; 211600b7c339SAmerigo Wang } 21171da177e4SLinus Torvalds 21189f977fb7SOctavian Purdila static void proc_skip_char(char **buf, size_t *size, const char v) 21199f977fb7SOctavian Purdila { 21209f977fb7SOctavian Purdila while (*size) { 21219f977fb7SOctavian Purdila if (**buf != v) 21229f977fb7SOctavian Purdila break; 21239f977fb7SOctavian Purdila (*size)--; 21249f977fb7SOctavian Purdila (*buf)++; 21259f977fb7SOctavian Purdila } 21269f977fb7SOctavian Purdila } 21279f977fb7SOctavian Purdila 21287f2923c4SChristian Brauner /** 21297f2923c4SChristian Brauner * strtoul_lenient - parse an ASCII formatted integer from a buffer and only 21307f2923c4SChristian Brauner * fail on overflow 21317f2923c4SChristian Brauner * 21327f2923c4SChristian Brauner * @cp: kernel buffer containing the string to parse 21337f2923c4SChristian Brauner * @endp: pointer to store the trailing characters 21347f2923c4SChristian Brauner * @base: the base to use 21357f2923c4SChristian Brauner * @res: where the parsed integer will be stored 21367f2923c4SChristian Brauner * 21377f2923c4SChristian Brauner * In case of success 0 is returned and @res will contain the parsed integer, 21387f2923c4SChristian Brauner * @endp will hold any trailing characters. 21397f2923c4SChristian Brauner * This function will fail the parse on overflow. If there wasn't an overflow 21407f2923c4SChristian Brauner * the function will defer the decision what characters count as invalid to the 21417f2923c4SChristian Brauner * caller. 21427f2923c4SChristian Brauner */ 21437f2923c4SChristian Brauner static int strtoul_lenient(const char *cp, char **endp, unsigned int base, 21447f2923c4SChristian Brauner unsigned long *res) 21457f2923c4SChristian Brauner { 21467f2923c4SChristian Brauner unsigned long long result; 21477f2923c4SChristian Brauner unsigned int rv; 21487f2923c4SChristian Brauner 21497f2923c4SChristian Brauner cp = _parse_integer_fixup_radix(cp, &base); 21507f2923c4SChristian Brauner rv = _parse_integer(cp, base, &result); 21517f2923c4SChristian Brauner if ((rv & KSTRTOX_OVERFLOW) || (result != (unsigned long)result)) 21527f2923c4SChristian Brauner return -ERANGE; 21537f2923c4SChristian Brauner 21547f2923c4SChristian Brauner cp += rv; 21557f2923c4SChristian Brauner 21567f2923c4SChristian Brauner if (endp) 21577f2923c4SChristian Brauner *endp = (char *)cp; 21587f2923c4SChristian Brauner 21597f2923c4SChristian Brauner *res = (unsigned long)result; 21607f2923c4SChristian Brauner return 0; 21617f2923c4SChristian Brauner } 21627f2923c4SChristian Brauner 216300b7c339SAmerigo Wang #define TMPBUFLEN 22 216400b7c339SAmerigo Wang /** 21650fc377bdSRandy Dunlap * proc_get_long - reads an ASCII formatted integer from a user buffer 216600b7c339SAmerigo Wang * 21670fc377bdSRandy Dunlap * @buf: a kernel buffer 21680fc377bdSRandy Dunlap * @size: size of the kernel buffer 21690fc377bdSRandy Dunlap * @val: this is where the number will be stored 21700fc377bdSRandy Dunlap * @neg: set to %TRUE if number is negative 21710fc377bdSRandy Dunlap * @perm_tr: a vector which contains the allowed trailers 21720fc377bdSRandy Dunlap * @perm_tr_len: size of the perm_tr vector 21730fc377bdSRandy Dunlap * @tr: pointer to store the trailer character 217400b7c339SAmerigo Wang * 21750fc377bdSRandy Dunlap * In case of success %0 is returned and @buf and @size are updated with 21760fc377bdSRandy Dunlap * the amount of bytes read. If @tr is non-NULL and a trailing 21770fc377bdSRandy Dunlap * character exists (size is non-zero after returning from this 21780fc377bdSRandy Dunlap * function), @tr is updated with the trailing character. 217900b7c339SAmerigo Wang */ 218000b7c339SAmerigo Wang static int proc_get_long(char **buf, size_t *size, 218100b7c339SAmerigo Wang unsigned long *val, bool *neg, 218200b7c339SAmerigo Wang const char *perm_tr, unsigned perm_tr_len, char *tr) 218300b7c339SAmerigo Wang { 218400b7c339SAmerigo Wang int len; 218500b7c339SAmerigo Wang char *p, tmp[TMPBUFLEN]; 218600b7c339SAmerigo Wang 218700b7c339SAmerigo Wang if (!*size) 218800b7c339SAmerigo Wang return -EINVAL; 218900b7c339SAmerigo Wang 219000b7c339SAmerigo Wang len = *size; 219100b7c339SAmerigo Wang if (len > TMPBUFLEN - 1) 219200b7c339SAmerigo Wang len = TMPBUFLEN - 1; 219300b7c339SAmerigo Wang 219400b7c339SAmerigo Wang memcpy(tmp, *buf, len); 219500b7c339SAmerigo Wang 219600b7c339SAmerigo Wang tmp[len] = 0; 219700b7c339SAmerigo Wang p = tmp; 219800b7c339SAmerigo Wang if (*p == '-' && *size > 1) { 219900b7c339SAmerigo Wang *neg = true; 220000b7c339SAmerigo Wang p++; 220100b7c339SAmerigo Wang } else 220200b7c339SAmerigo Wang *neg = false; 220300b7c339SAmerigo Wang if (!isdigit(*p)) 220400b7c339SAmerigo Wang return -EINVAL; 220500b7c339SAmerigo Wang 22067f2923c4SChristian Brauner if (strtoul_lenient(p, &p, 0, val)) 22077f2923c4SChristian Brauner return -EINVAL; 220800b7c339SAmerigo Wang 220900b7c339SAmerigo Wang len = p - tmp; 221000b7c339SAmerigo Wang 221100b7c339SAmerigo Wang /* We don't know if the next char is whitespace thus we may accept 221200b7c339SAmerigo Wang * invalid integers (e.g. 1234...a) or two integers instead of one 221300b7c339SAmerigo Wang * (e.g. 123...1). So lets not allow such large numbers. */ 221400b7c339SAmerigo Wang if (len == TMPBUFLEN - 1) 221500b7c339SAmerigo Wang return -EINVAL; 221600b7c339SAmerigo Wang 221700b7c339SAmerigo Wang if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len)) 221800b7c339SAmerigo Wang return -EINVAL; 221900b7c339SAmerigo Wang 222000b7c339SAmerigo Wang if (tr && (len < *size)) 222100b7c339SAmerigo Wang *tr = *p; 222200b7c339SAmerigo Wang 222300b7c339SAmerigo Wang *buf += len; 222400b7c339SAmerigo Wang *size -= len; 222500b7c339SAmerigo Wang 222600b7c339SAmerigo Wang return 0; 222700b7c339SAmerigo Wang } 222800b7c339SAmerigo Wang 222900b7c339SAmerigo Wang /** 22300fc377bdSRandy Dunlap * proc_put_long - converts an integer to a decimal ASCII formatted string 223100b7c339SAmerigo Wang * 22320fc377bdSRandy Dunlap * @buf: the user buffer 22330fc377bdSRandy Dunlap * @size: the size of the user buffer 22340fc377bdSRandy Dunlap * @val: the integer to be converted 22350fc377bdSRandy Dunlap * @neg: sign of the number, %TRUE for negative 223600b7c339SAmerigo Wang * 22370fc377bdSRandy Dunlap * In case of success %0 is returned and @buf and @size are updated with 22380fc377bdSRandy Dunlap * the amount of bytes written. 223900b7c339SAmerigo Wang */ 224000b7c339SAmerigo Wang static int proc_put_long(void __user **buf, size_t *size, unsigned long val, 224100b7c339SAmerigo Wang bool neg) 224200b7c339SAmerigo Wang { 224300b7c339SAmerigo Wang int len; 224400b7c339SAmerigo Wang char tmp[TMPBUFLEN], *p = tmp; 224500b7c339SAmerigo Wang 224600b7c339SAmerigo Wang sprintf(p, "%s%lu", neg ? "-" : "", val); 224700b7c339SAmerigo Wang len = strlen(tmp); 224800b7c339SAmerigo Wang if (len > *size) 224900b7c339SAmerigo Wang len = *size; 225000b7c339SAmerigo Wang if (copy_to_user(*buf, tmp, len)) 225100b7c339SAmerigo Wang return -EFAULT; 225200b7c339SAmerigo Wang *size -= len; 225300b7c339SAmerigo Wang *buf += len; 225400b7c339SAmerigo Wang return 0; 225500b7c339SAmerigo Wang } 225600b7c339SAmerigo Wang #undef TMPBUFLEN 225700b7c339SAmerigo Wang 225800b7c339SAmerigo Wang static int proc_put_char(void __user **buf, size_t *size, char c) 225900b7c339SAmerigo Wang { 226000b7c339SAmerigo Wang if (*size) { 226100b7c339SAmerigo Wang char __user **buffer = (char __user **)buf; 226200b7c339SAmerigo Wang if (put_user(c, *buffer)) 226300b7c339SAmerigo Wang return -EFAULT; 226400b7c339SAmerigo Wang (*size)--, (*buffer)++; 226500b7c339SAmerigo Wang *buf = *buffer; 226600b7c339SAmerigo Wang } 226700b7c339SAmerigo Wang return 0; 226800b7c339SAmerigo Wang } 226900b7c339SAmerigo Wang 227000b7c339SAmerigo Wang static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, 22711da177e4SLinus Torvalds int *valp, 22721da177e4SLinus Torvalds int write, void *data) 22731da177e4SLinus Torvalds { 22741da177e4SLinus Torvalds if (write) { 2275230633d1SHeinrich Schuchardt if (*negp) { 2276230633d1SHeinrich Schuchardt if (*lvalp > (unsigned long) INT_MAX + 1) 2277230633d1SHeinrich Schuchardt return -EINVAL; 2278230633d1SHeinrich Schuchardt *valp = -*lvalp; 2279230633d1SHeinrich Schuchardt } else { 2280230633d1SHeinrich Schuchardt if (*lvalp > (unsigned long) INT_MAX) 2281230633d1SHeinrich Schuchardt return -EINVAL; 2282230633d1SHeinrich Schuchardt *valp = *lvalp; 2283230633d1SHeinrich Schuchardt } 22841da177e4SLinus Torvalds } else { 22851da177e4SLinus Torvalds int val = *valp; 22861da177e4SLinus Torvalds if (val < 0) { 228700b7c339SAmerigo Wang *negp = true; 22889a5bc726SIlya Dryomov *lvalp = -(unsigned long)val; 22891da177e4SLinus Torvalds } else { 229000b7c339SAmerigo Wang *negp = false; 22911da177e4SLinus Torvalds *lvalp = (unsigned long)val; 22921da177e4SLinus Torvalds } 22931da177e4SLinus Torvalds } 22941da177e4SLinus Torvalds return 0; 22951da177e4SLinus Torvalds } 22961da177e4SLinus Torvalds 22974f2fec00SLuis R. Rodriguez static int do_proc_douintvec_conv(unsigned long *lvalp, 22984f2fec00SLuis R. Rodriguez unsigned int *valp, 2299e7d316a0SSubash Abhinov Kasiviswanathan int write, void *data) 2300e7d316a0SSubash Abhinov Kasiviswanathan { 2301e7d316a0SSubash Abhinov Kasiviswanathan if (write) { 23024f2fec00SLuis R. Rodriguez if (*lvalp > UINT_MAX) 2303e7d316a0SSubash Abhinov Kasiviswanathan return -EINVAL; 2304e7d316a0SSubash Abhinov Kasiviswanathan *valp = *lvalp; 2305e7d316a0SSubash Abhinov Kasiviswanathan } else { 2306e7d316a0SSubash Abhinov Kasiviswanathan unsigned int val = *valp; 2307e7d316a0SSubash Abhinov Kasiviswanathan *lvalp = (unsigned long)val; 2308e7d316a0SSubash Abhinov Kasiviswanathan } 2309e7d316a0SSubash Abhinov Kasiviswanathan return 0; 2310e7d316a0SSubash Abhinov Kasiviswanathan } 2311e7d316a0SSubash Abhinov Kasiviswanathan 231200b7c339SAmerigo Wang static const char proc_wspace_sep[] = { ' ', '\t', '\n' }; 231300b7c339SAmerigo Wang 2314d8217f07SEric W. Biederman static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, 23158d65af78SAlexey Dobriyan int write, void __user *buffer, 2316fcfbd547SKirill Korotaev size_t *lenp, loff_t *ppos, 231700b7c339SAmerigo Wang int (*conv)(bool *negp, unsigned long *lvalp, int *valp, 23181da177e4SLinus Torvalds int write, void *data), 23191da177e4SLinus Torvalds void *data) 23201da177e4SLinus Torvalds { 232100b7c339SAmerigo Wang int *i, vleft, first = 1, err = 0; 232200b7c339SAmerigo Wang size_t left; 232370f6cbb6SAl Viro char *kbuf = NULL, *p; 23241da177e4SLinus Torvalds 232500b7c339SAmerigo Wang if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { 23261da177e4SLinus Torvalds *lenp = 0; 23271da177e4SLinus Torvalds return 0; 23281da177e4SLinus Torvalds } 23291da177e4SLinus Torvalds 2330fcfbd547SKirill Korotaev i = (int *) tbl_data; 23311da177e4SLinus Torvalds vleft = table->maxlen / sizeof(*i); 23321da177e4SLinus Torvalds left = *lenp; 23331da177e4SLinus Torvalds 23341da177e4SLinus Torvalds if (!conv) 23351da177e4SLinus Torvalds conv = do_proc_dointvec_conv; 23361da177e4SLinus Torvalds 233700b7c339SAmerigo Wang if (write) { 2338d383d484SLuis R. Rodriguez if (proc_first_pos_non_zero_ignore(ppos, table)) 2339f4aacea2SKees Cook goto out; 2340f4aacea2SKees Cook 234100b7c339SAmerigo Wang if (left > PAGE_SIZE - 1) 234200b7c339SAmerigo Wang left = PAGE_SIZE - 1; 234370f6cbb6SAl Viro p = kbuf = memdup_user_nul(buffer, left); 234470f6cbb6SAl Viro if (IS_ERR(kbuf)) 234570f6cbb6SAl Viro return PTR_ERR(kbuf); 234600b7c339SAmerigo Wang } 234700b7c339SAmerigo Wang 23481da177e4SLinus Torvalds for (; left && vleft--; i++, first=0) { 234900b7c339SAmerigo Wang unsigned long lval; 235000b7c339SAmerigo Wang bool neg; 235100b7c339SAmerigo Wang 23521da177e4SLinus Torvalds if (write) { 235370f6cbb6SAl Viro left -= proc_skip_spaces(&p); 235400b7c339SAmerigo Wang 2355563b0467SJ. R. Okajima if (!left) 2356563b0467SJ. R. Okajima break; 235770f6cbb6SAl Viro err = proc_get_long(&p, &left, &lval, &neg, 235800b7c339SAmerigo Wang proc_wspace_sep, 235900b7c339SAmerigo Wang sizeof(proc_wspace_sep), NULL); 236000b7c339SAmerigo Wang if (err) 23611da177e4SLinus Torvalds break; 236200b7c339SAmerigo Wang if (conv(&neg, &lval, i, 1, data)) { 236300b7c339SAmerigo Wang err = -EINVAL; 236400b7c339SAmerigo Wang break; 23651da177e4SLinus Torvalds } 23661da177e4SLinus Torvalds } else { 236700b7c339SAmerigo Wang if (conv(&neg, &lval, i, 0, data)) { 236800b7c339SAmerigo Wang err = -EINVAL; 236900b7c339SAmerigo Wang break; 237000b7c339SAmerigo Wang } 23711da177e4SLinus Torvalds if (!first) 237200b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\t'); 237300b7c339SAmerigo Wang if (err) 23741da177e4SLinus Torvalds break; 237500b7c339SAmerigo Wang err = proc_put_long(&buffer, &left, lval, neg); 237600b7c339SAmerigo Wang if (err) 237700b7c339SAmerigo Wang break; 23781da177e4SLinus Torvalds } 23791da177e4SLinus Torvalds } 23801da177e4SLinus Torvalds 238100b7c339SAmerigo Wang if (!write && !first && left && !err) 238200b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\n'); 2383563b0467SJ. R. Okajima if (write && !err && left) 238470f6cbb6SAl Viro left -= proc_skip_spaces(&p); 23851da177e4SLinus Torvalds if (write) { 238670f6cbb6SAl Viro kfree(kbuf); 238700b7c339SAmerigo Wang if (first) 238800b7c339SAmerigo Wang return err ? : -EINVAL; 23891da177e4SLinus Torvalds } 23901da177e4SLinus Torvalds *lenp -= left; 2391f4aacea2SKees Cook out: 23921da177e4SLinus Torvalds *ppos += *lenp; 239300b7c339SAmerigo Wang return err; 23941da177e4SLinus Torvalds } 23951da177e4SLinus Torvalds 23968d65af78SAlexey Dobriyan static int do_proc_dointvec(struct ctl_table *table, int write, 2397fcfbd547SKirill Korotaev void __user *buffer, size_t *lenp, loff_t *ppos, 239800b7c339SAmerigo Wang int (*conv)(bool *negp, unsigned long *lvalp, int *valp, 2399fcfbd547SKirill Korotaev int write, void *data), 2400fcfbd547SKirill Korotaev void *data) 2401fcfbd547SKirill Korotaev { 24028d65af78SAlexey Dobriyan return __do_proc_dointvec(table->data, table, write, 2403fcfbd547SKirill Korotaev buffer, lenp, ppos, conv, data); 2404fcfbd547SKirill Korotaev } 2405fcfbd547SKirill Korotaev 24064f2fec00SLuis R. Rodriguez static int do_proc_douintvec_w(unsigned int *tbl_data, 24074f2fec00SLuis R. Rodriguez struct ctl_table *table, 24084f2fec00SLuis R. Rodriguez void __user *buffer, 24094f2fec00SLuis R. Rodriguez size_t *lenp, loff_t *ppos, 24104f2fec00SLuis R. Rodriguez int (*conv)(unsigned long *lvalp, 24114f2fec00SLuis R. Rodriguez unsigned int *valp, 24124f2fec00SLuis R. Rodriguez int write, void *data), 24134f2fec00SLuis R. Rodriguez void *data) 24144f2fec00SLuis R. Rodriguez { 24154f2fec00SLuis R. Rodriguez unsigned long lval; 24164f2fec00SLuis R. Rodriguez int err = 0; 24174f2fec00SLuis R. Rodriguez size_t left; 24184f2fec00SLuis R. Rodriguez bool neg; 24194f2fec00SLuis R. Rodriguez char *kbuf = NULL, *p; 24204f2fec00SLuis R. Rodriguez 24214f2fec00SLuis R. Rodriguez left = *lenp; 24224f2fec00SLuis R. Rodriguez 24234f2fec00SLuis R. Rodriguez if (proc_first_pos_non_zero_ignore(ppos, table)) 24244f2fec00SLuis R. Rodriguez goto bail_early; 24254f2fec00SLuis R. Rodriguez 24264f2fec00SLuis R. Rodriguez if (left > PAGE_SIZE - 1) 24274f2fec00SLuis R. Rodriguez left = PAGE_SIZE - 1; 24284f2fec00SLuis R. Rodriguez 24294f2fec00SLuis R. Rodriguez p = kbuf = memdup_user_nul(buffer, left); 24304f2fec00SLuis R. Rodriguez if (IS_ERR(kbuf)) 24314f2fec00SLuis R. Rodriguez return -EINVAL; 24324f2fec00SLuis R. Rodriguez 24334f2fec00SLuis R. Rodriguez left -= proc_skip_spaces(&p); 24344f2fec00SLuis R. Rodriguez if (!left) { 24354f2fec00SLuis R. Rodriguez err = -EINVAL; 24364f2fec00SLuis R. Rodriguez goto out_free; 24374f2fec00SLuis R. Rodriguez } 24384f2fec00SLuis R. Rodriguez 24394f2fec00SLuis R. Rodriguez err = proc_get_long(&p, &left, &lval, &neg, 24404f2fec00SLuis R. Rodriguez proc_wspace_sep, 24414f2fec00SLuis R. Rodriguez sizeof(proc_wspace_sep), NULL); 24424f2fec00SLuis R. Rodriguez if (err || neg) { 24434f2fec00SLuis R. Rodriguez err = -EINVAL; 24444f2fec00SLuis R. Rodriguez goto out_free; 24454f2fec00SLuis R. Rodriguez } 24464f2fec00SLuis R. Rodriguez 24474f2fec00SLuis R. Rodriguez if (conv(&lval, tbl_data, 1, data)) { 24484f2fec00SLuis R. Rodriguez err = -EINVAL; 24494f2fec00SLuis R. Rodriguez goto out_free; 24504f2fec00SLuis R. Rodriguez } 24514f2fec00SLuis R. Rodriguez 24524f2fec00SLuis R. Rodriguez if (!err && left) 24534f2fec00SLuis R. Rodriguez left -= proc_skip_spaces(&p); 24544f2fec00SLuis R. Rodriguez 24554f2fec00SLuis R. Rodriguez out_free: 24564f2fec00SLuis R. Rodriguez kfree(kbuf); 24574f2fec00SLuis R. Rodriguez if (err) 24584f2fec00SLuis R. Rodriguez return -EINVAL; 24594f2fec00SLuis R. Rodriguez 24604f2fec00SLuis R. Rodriguez return 0; 24614f2fec00SLuis R. Rodriguez 24624f2fec00SLuis R. Rodriguez /* This is in keeping with old __do_proc_dointvec() */ 24634f2fec00SLuis R. Rodriguez bail_early: 24644f2fec00SLuis R. Rodriguez *ppos += *lenp; 24654f2fec00SLuis R. Rodriguez return err; 24664f2fec00SLuis R. Rodriguez } 24674f2fec00SLuis R. Rodriguez 24684f2fec00SLuis R. Rodriguez static int do_proc_douintvec_r(unsigned int *tbl_data, void __user *buffer, 24694f2fec00SLuis R. Rodriguez size_t *lenp, loff_t *ppos, 24704f2fec00SLuis R. Rodriguez int (*conv)(unsigned long *lvalp, 24714f2fec00SLuis R. Rodriguez unsigned int *valp, 24724f2fec00SLuis R. Rodriguez int write, void *data), 24734f2fec00SLuis R. Rodriguez void *data) 24744f2fec00SLuis R. Rodriguez { 24754f2fec00SLuis R. Rodriguez unsigned long lval; 24764f2fec00SLuis R. Rodriguez int err = 0; 24774f2fec00SLuis R. Rodriguez size_t left; 24784f2fec00SLuis R. Rodriguez 24794f2fec00SLuis R. Rodriguez left = *lenp; 24804f2fec00SLuis R. Rodriguez 24814f2fec00SLuis R. Rodriguez if (conv(&lval, tbl_data, 0, data)) { 24824f2fec00SLuis R. Rodriguez err = -EINVAL; 24834f2fec00SLuis R. Rodriguez goto out; 24844f2fec00SLuis R. Rodriguez } 24854f2fec00SLuis R. Rodriguez 24864f2fec00SLuis R. Rodriguez err = proc_put_long(&buffer, &left, lval, false); 24874f2fec00SLuis R. Rodriguez if (err || !left) 24884f2fec00SLuis R. Rodriguez goto out; 24894f2fec00SLuis R. Rodriguez 24904f2fec00SLuis R. Rodriguez err = proc_put_char(&buffer, &left, '\n'); 24914f2fec00SLuis R. Rodriguez 24924f2fec00SLuis R. Rodriguez out: 24934f2fec00SLuis R. Rodriguez *lenp -= left; 24944f2fec00SLuis R. Rodriguez *ppos += *lenp; 24954f2fec00SLuis R. Rodriguez 24964f2fec00SLuis R. Rodriguez return err; 24974f2fec00SLuis R. Rodriguez } 24984f2fec00SLuis R. Rodriguez 24994f2fec00SLuis R. Rodriguez static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table, 25004f2fec00SLuis R. Rodriguez int write, void __user *buffer, 25014f2fec00SLuis R. Rodriguez size_t *lenp, loff_t *ppos, 25024f2fec00SLuis R. Rodriguez int (*conv)(unsigned long *lvalp, 25034f2fec00SLuis R. Rodriguez unsigned int *valp, 25044f2fec00SLuis R. Rodriguez int write, void *data), 25054f2fec00SLuis R. Rodriguez void *data) 25064f2fec00SLuis R. Rodriguez { 25074f2fec00SLuis R. Rodriguez unsigned int *i, vleft; 25084f2fec00SLuis R. Rodriguez 25094f2fec00SLuis R. Rodriguez if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { 25104f2fec00SLuis R. Rodriguez *lenp = 0; 25114f2fec00SLuis R. Rodriguez return 0; 25124f2fec00SLuis R. Rodriguez } 25134f2fec00SLuis R. Rodriguez 25144f2fec00SLuis R. Rodriguez i = (unsigned int *) tbl_data; 25154f2fec00SLuis R. Rodriguez vleft = table->maxlen / sizeof(*i); 25164f2fec00SLuis R. Rodriguez 25174f2fec00SLuis R. Rodriguez /* 25184f2fec00SLuis R. Rodriguez * Arrays are not supported, keep this simple. *Do not* add 25194f2fec00SLuis R. Rodriguez * support for them. 25204f2fec00SLuis R. Rodriguez */ 25214f2fec00SLuis R. Rodriguez if (vleft != 1) { 25224f2fec00SLuis R. Rodriguez *lenp = 0; 25234f2fec00SLuis R. Rodriguez return -EINVAL; 25244f2fec00SLuis R. Rodriguez } 25254f2fec00SLuis R. Rodriguez 25264f2fec00SLuis R. Rodriguez if (!conv) 25274f2fec00SLuis R. Rodriguez conv = do_proc_douintvec_conv; 25284f2fec00SLuis R. Rodriguez 25294f2fec00SLuis R. Rodriguez if (write) 25304f2fec00SLuis R. Rodriguez return do_proc_douintvec_w(i, table, buffer, lenp, ppos, 25314f2fec00SLuis R. Rodriguez conv, data); 25324f2fec00SLuis R. Rodriguez return do_proc_douintvec_r(i, buffer, lenp, ppos, conv, data); 25334f2fec00SLuis R. Rodriguez } 25344f2fec00SLuis R. Rodriguez 25354f2fec00SLuis R. Rodriguez static int do_proc_douintvec(struct ctl_table *table, int write, 25364f2fec00SLuis R. Rodriguez void __user *buffer, size_t *lenp, loff_t *ppos, 25374f2fec00SLuis R. Rodriguez int (*conv)(unsigned long *lvalp, 25384f2fec00SLuis R. Rodriguez unsigned int *valp, 25394f2fec00SLuis R. Rodriguez int write, void *data), 25404f2fec00SLuis R. Rodriguez void *data) 25414f2fec00SLuis R. Rodriguez { 25424f2fec00SLuis R. Rodriguez return __do_proc_douintvec(table->data, table, write, 25434f2fec00SLuis R. Rodriguez buffer, lenp, ppos, conv, data); 25444f2fec00SLuis R. Rodriguez } 25454f2fec00SLuis R. Rodriguez 25461da177e4SLinus Torvalds /** 25471da177e4SLinus Torvalds * proc_dointvec - read a vector of integers 25481da177e4SLinus Torvalds * @table: the sysctl table 25491da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 25501da177e4SLinus Torvalds * @buffer: the user buffer 25511da177e4SLinus Torvalds * @lenp: the size of the user buffer 25521da177e4SLinus Torvalds * @ppos: file position 25531da177e4SLinus Torvalds * 25541da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 25551da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 25561da177e4SLinus Torvalds * 25571da177e4SLinus Torvalds * Returns 0 on success. 25581da177e4SLinus Torvalds */ 25598d65af78SAlexey Dobriyan int proc_dointvec(struct ctl_table *table, int write, 25601da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 25611da177e4SLinus Torvalds { 2562e7d316a0SSubash Abhinov Kasiviswanathan return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL); 2563e7d316a0SSubash Abhinov Kasiviswanathan } 2564e7d316a0SSubash Abhinov Kasiviswanathan 25656923aa0dSSebastian Andrzej Siewior #ifdef CONFIG_COMPACTION 25666923aa0dSSebastian Andrzej Siewior static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table, 25676923aa0dSSebastian Andrzej Siewior int write, void __user *buffer, 25686923aa0dSSebastian Andrzej Siewior size_t *lenp, loff_t *ppos) 25696923aa0dSSebastian Andrzej Siewior { 25706923aa0dSSebastian Andrzej Siewior int ret, old; 25716923aa0dSSebastian Andrzej Siewior 25726923aa0dSSebastian Andrzej Siewior if (!IS_ENABLED(CONFIG_PREEMPT_RT) || !write) 25736923aa0dSSebastian Andrzej Siewior return proc_dointvec_minmax(table, write, buffer, lenp, ppos); 25746923aa0dSSebastian Andrzej Siewior 25756923aa0dSSebastian Andrzej Siewior old = *(int *)table->data; 25766923aa0dSSebastian Andrzej Siewior ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 25776923aa0dSSebastian Andrzej Siewior if (ret) 25786923aa0dSSebastian Andrzej Siewior return ret; 25796923aa0dSSebastian Andrzej Siewior if (old != *(int *)table->data) 25806923aa0dSSebastian Andrzej Siewior pr_warn_once("sysctl attribute %s changed by %s[%d]\n", 25816923aa0dSSebastian Andrzej Siewior table->procname, current->comm, 25826923aa0dSSebastian Andrzej Siewior task_pid_nr(current)); 25836923aa0dSSebastian Andrzej Siewior return ret; 25846923aa0dSSebastian Andrzej Siewior } 25856923aa0dSSebastian Andrzej Siewior #endif 25866923aa0dSSebastian Andrzej Siewior 2587e7d316a0SSubash Abhinov Kasiviswanathan /** 2588e7d316a0SSubash Abhinov Kasiviswanathan * proc_douintvec - read a vector of unsigned integers 2589e7d316a0SSubash Abhinov Kasiviswanathan * @table: the sysctl table 2590e7d316a0SSubash Abhinov Kasiviswanathan * @write: %TRUE if this is a write to the sysctl file 2591e7d316a0SSubash Abhinov Kasiviswanathan * @buffer: the user buffer 2592e7d316a0SSubash Abhinov Kasiviswanathan * @lenp: the size of the user buffer 2593e7d316a0SSubash Abhinov Kasiviswanathan * @ppos: file position 2594e7d316a0SSubash Abhinov Kasiviswanathan * 2595e7d316a0SSubash Abhinov Kasiviswanathan * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer 2596e7d316a0SSubash Abhinov Kasiviswanathan * values from/to the user buffer, treated as an ASCII string. 2597e7d316a0SSubash Abhinov Kasiviswanathan * 2598e7d316a0SSubash Abhinov Kasiviswanathan * Returns 0 on success. 2599e7d316a0SSubash Abhinov Kasiviswanathan */ 2600e7d316a0SSubash Abhinov Kasiviswanathan int proc_douintvec(struct ctl_table *table, int write, 2601e7d316a0SSubash Abhinov Kasiviswanathan void __user *buffer, size_t *lenp, loff_t *ppos) 2602e7d316a0SSubash Abhinov Kasiviswanathan { 26034f2fec00SLuis R. Rodriguez return do_proc_douintvec(table, write, buffer, lenp, ppos, 2604e7d316a0SSubash Abhinov Kasiviswanathan do_proc_douintvec_conv, NULL); 26051da177e4SLinus Torvalds } 26061da177e4SLinus Torvalds 260734f5a398STheodore Ts'o /* 260834f5a398STheodore Ts'o * Taint values can only be increased 260925ddbb18SAndi Kleen * This means we can safely use a temporary. 261034f5a398STheodore Ts'o */ 26118d65af78SAlexey Dobriyan static int proc_taint(struct ctl_table *table, int write, 261234f5a398STheodore Ts'o void __user *buffer, size_t *lenp, loff_t *ppos) 261334f5a398STheodore Ts'o { 261425ddbb18SAndi Kleen struct ctl_table t; 261525ddbb18SAndi Kleen unsigned long tmptaint = get_taint(); 261625ddbb18SAndi Kleen int err; 261734f5a398STheodore Ts'o 261891fcd412SBastian Blank if (write && !capable(CAP_SYS_ADMIN)) 261934f5a398STheodore Ts'o return -EPERM; 262034f5a398STheodore Ts'o 262125ddbb18SAndi Kleen t = *table; 262225ddbb18SAndi Kleen t.data = &tmptaint; 26238d65af78SAlexey Dobriyan err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos); 262425ddbb18SAndi Kleen if (err < 0) 262525ddbb18SAndi Kleen return err; 262625ddbb18SAndi Kleen 262725ddbb18SAndi Kleen if (write) { 262825ddbb18SAndi Kleen /* 262925ddbb18SAndi Kleen * Poor man's atomic or. Not worth adding a primitive 263025ddbb18SAndi Kleen * to everyone's atomic.h for this 263125ddbb18SAndi Kleen */ 263225ddbb18SAndi Kleen int i; 263325ddbb18SAndi Kleen for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) { 263425ddbb18SAndi Kleen if ((tmptaint >> i) & 1) 2635373d4d09SRusty Russell add_taint(i, LOCKDEP_STILL_OK); 263625ddbb18SAndi Kleen } 263725ddbb18SAndi Kleen } 263825ddbb18SAndi Kleen 263925ddbb18SAndi Kleen return err; 264034f5a398STheodore Ts'o } 264134f5a398STheodore Ts'o 2642bfdc0b49SRichard Weinberger #ifdef CONFIG_PRINTK 2643620f6e8eSKees Cook static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, 2644bfdc0b49SRichard Weinberger void __user *buffer, size_t *lenp, loff_t *ppos) 2645bfdc0b49SRichard Weinberger { 2646bfdc0b49SRichard Weinberger if (write && !capable(CAP_SYS_ADMIN)) 2647bfdc0b49SRichard Weinberger return -EPERM; 2648bfdc0b49SRichard Weinberger 2649bfdc0b49SRichard Weinberger return proc_dointvec_minmax(table, write, buffer, lenp, ppos); 2650bfdc0b49SRichard Weinberger } 2651bfdc0b49SRichard Weinberger #endif 2652bfdc0b49SRichard Weinberger 265324704f36SWaiman Long /** 265424704f36SWaiman Long * struct do_proc_dointvec_minmax_conv_param - proc_dointvec_minmax() range checking structure 265524704f36SWaiman Long * @min: pointer to minimum allowable value 265624704f36SWaiman Long * @max: pointer to maximum allowable value 265724704f36SWaiman Long * 265824704f36SWaiman Long * The do_proc_dointvec_minmax_conv_param structure provides the 265924704f36SWaiman Long * minimum and maximum values for doing range checking for those sysctl 266024704f36SWaiman Long * parameters that use the proc_dointvec_minmax() handler. 266124704f36SWaiman Long */ 26621da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param { 26631da177e4SLinus Torvalds int *min; 26641da177e4SLinus Torvalds int *max; 26651da177e4SLinus Torvalds }; 26661da177e4SLinus Torvalds 266700b7c339SAmerigo Wang static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp, 26681da177e4SLinus Torvalds int *valp, 26691da177e4SLinus Torvalds int write, void *data) 26701da177e4SLinus Torvalds { 26712bc4fc60SZev Weiss int tmp, ret; 26721da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param *param = data; 26732bc4fc60SZev Weiss /* 26742bc4fc60SZev Weiss * If writing, first do so via a temporary local int so we can 26752bc4fc60SZev Weiss * bounds-check it before touching *valp. 26762bc4fc60SZev Weiss */ 26772bc4fc60SZev Weiss int *ip = write ? &tmp : valp; 26782bc4fc60SZev Weiss 26792bc4fc60SZev Weiss ret = do_proc_dointvec_conv(negp, lvalp, ip, write, data); 26802bc4fc60SZev Weiss if (ret) 26812bc4fc60SZev Weiss return ret; 26822bc4fc60SZev Weiss 26831da177e4SLinus Torvalds if (write) { 26842bc4fc60SZev Weiss if ((param->min && *param->min > tmp) || 26852bc4fc60SZev Weiss (param->max && *param->max < tmp)) 26868cf7630bSZev Weiss return -EINVAL; 26872bc4fc60SZev Weiss *valp = tmp; 26888cf7630bSZev Weiss } 26892bc4fc60SZev Weiss 26901da177e4SLinus Torvalds return 0; 26911da177e4SLinus Torvalds } 26921da177e4SLinus Torvalds 26931da177e4SLinus Torvalds /** 26941da177e4SLinus Torvalds * proc_dointvec_minmax - read a vector of integers with min/max values 26951da177e4SLinus Torvalds * @table: the sysctl table 26961da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 26971da177e4SLinus Torvalds * @buffer: the user buffer 26981da177e4SLinus Torvalds * @lenp: the size of the user buffer 26991da177e4SLinus Torvalds * @ppos: file position 27001da177e4SLinus Torvalds * 27011da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 27021da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 27031da177e4SLinus Torvalds * 27041da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 27051da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 27061da177e4SLinus Torvalds * 270724704f36SWaiman Long * Returns 0 on success or -EINVAL on write when the range check fails. 27081da177e4SLinus Torvalds */ 27098d65af78SAlexey Dobriyan int proc_dointvec_minmax(struct ctl_table *table, int write, 27101da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27111da177e4SLinus Torvalds { 27121da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param param = { 27131da177e4SLinus Torvalds .min = (int *) table->extra1, 27141da177e4SLinus Torvalds .max = (int *) table->extra2, 27151da177e4SLinus Torvalds }; 27168d65af78SAlexey Dobriyan return do_proc_dointvec(table, write, buffer, lenp, ppos, 27171da177e4SLinus Torvalds do_proc_dointvec_minmax_conv, ¶m); 27181da177e4SLinus Torvalds } 27191da177e4SLinus Torvalds 272024704f36SWaiman Long /** 272124704f36SWaiman Long * struct do_proc_douintvec_minmax_conv_param - proc_douintvec_minmax() range checking structure 272224704f36SWaiman Long * @min: pointer to minimum allowable value 272324704f36SWaiman Long * @max: pointer to maximum allowable value 272424704f36SWaiman Long * 272524704f36SWaiman Long * The do_proc_douintvec_minmax_conv_param structure provides the 272624704f36SWaiman Long * minimum and maximum values for doing range checking for those sysctl 272724704f36SWaiman Long * parameters that use the proc_douintvec_minmax() handler. 272824704f36SWaiman Long */ 272961d9b56aSLuis R. Rodriguez struct do_proc_douintvec_minmax_conv_param { 273061d9b56aSLuis R. Rodriguez unsigned int *min; 273161d9b56aSLuis R. Rodriguez unsigned int *max; 273261d9b56aSLuis R. Rodriguez }; 273361d9b56aSLuis R. Rodriguez 273461d9b56aSLuis R. Rodriguez static int do_proc_douintvec_minmax_conv(unsigned long *lvalp, 273561d9b56aSLuis R. Rodriguez unsigned int *valp, 273661d9b56aSLuis R. Rodriguez int write, void *data) 273761d9b56aSLuis R. Rodriguez { 27382bc4fc60SZev Weiss int ret; 27392bc4fc60SZev Weiss unsigned int tmp; 274061d9b56aSLuis R. Rodriguez struct do_proc_douintvec_minmax_conv_param *param = data; 27412bc4fc60SZev Weiss /* write via temporary local uint for bounds-checking */ 27422bc4fc60SZev Weiss unsigned int *up = write ? &tmp : valp; 27432bc4fc60SZev Weiss 27442bc4fc60SZev Weiss ret = do_proc_douintvec_conv(lvalp, up, write, data); 27452bc4fc60SZev Weiss if (ret) 27462bc4fc60SZev Weiss return ret; 274761d9b56aSLuis R. Rodriguez 274861d9b56aSLuis R. Rodriguez if (write) { 27492bc4fc60SZev Weiss if ((param->min && *param->min > tmp) || 27502bc4fc60SZev Weiss (param->max && *param->max < tmp)) 275161d9b56aSLuis R. Rodriguez return -ERANGE; 275261d9b56aSLuis R. Rodriguez 27532bc4fc60SZev Weiss *valp = tmp; 275461d9b56aSLuis R. Rodriguez } 275561d9b56aSLuis R. Rodriguez 275661d9b56aSLuis R. Rodriguez return 0; 275761d9b56aSLuis R. Rodriguez } 275861d9b56aSLuis R. Rodriguez 275961d9b56aSLuis R. Rodriguez /** 276061d9b56aSLuis R. Rodriguez * proc_douintvec_minmax - read a vector of unsigned ints with min/max values 276161d9b56aSLuis R. Rodriguez * @table: the sysctl table 276261d9b56aSLuis R. Rodriguez * @write: %TRUE if this is a write to the sysctl file 276361d9b56aSLuis R. Rodriguez * @buffer: the user buffer 276461d9b56aSLuis R. Rodriguez * @lenp: the size of the user buffer 276561d9b56aSLuis R. Rodriguez * @ppos: file position 276661d9b56aSLuis R. Rodriguez * 276761d9b56aSLuis R. Rodriguez * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer 276861d9b56aSLuis R. Rodriguez * values from/to the user buffer, treated as an ASCII string. Negative 276961d9b56aSLuis R. Rodriguez * strings are not allowed. 277061d9b56aSLuis R. Rodriguez * 277161d9b56aSLuis R. Rodriguez * This routine will ensure the values are within the range specified by 277261d9b56aSLuis R. Rodriguez * table->extra1 (min) and table->extra2 (max). There is a final sanity 277361d9b56aSLuis R. Rodriguez * check for UINT_MAX to avoid having to support wrap around uses from 277461d9b56aSLuis R. Rodriguez * userspace. 277561d9b56aSLuis R. Rodriguez * 277624704f36SWaiman Long * Returns 0 on success or -ERANGE on write when the range check fails. 277761d9b56aSLuis R. Rodriguez */ 277861d9b56aSLuis R. Rodriguez int proc_douintvec_minmax(struct ctl_table *table, int write, 277961d9b56aSLuis R. Rodriguez void __user *buffer, size_t *lenp, loff_t *ppos) 278061d9b56aSLuis R. Rodriguez { 278161d9b56aSLuis R. Rodriguez struct do_proc_douintvec_minmax_conv_param param = { 278261d9b56aSLuis R. Rodriguez .min = (unsigned int *) table->extra1, 278361d9b56aSLuis R. Rodriguez .max = (unsigned int *) table->extra2, 278461d9b56aSLuis R. Rodriguez }; 278561d9b56aSLuis R. Rodriguez return do_proc_douintvec(table, write, buffer, lenp, ppos, 278661d9b56aSLuis R. Rodriguez do_proc_douintvec_minmax_conv, ¶m); 278761d9b56aSLuis R. Rodriguez } 278861d9b56aSLuis R. Rodriguez 27897a8d1819SJoe Lawrence static int do_proc_dopipe_max_size_conv(unsigned long *lvalp, 27907a8d1819SJoe Lawrence unsigned int *valp, 27917a8d1819SJoe Lawrence int write, void *data) 27927a8d1819SJoe Lawrence { 27937a8d1819SJoe Lawrence if (write) { 2794fb910c42SJoe Lawrence unsigned int val; 27957a8d1819SJoe Lawrence 2796fb910c42SJoe Lawrence val = round_pipe_size(*lvalp); 27977a8d1819SJoe Lawrence if (val == 0) 27987a8d1819SJoe Lawrence return -EINVAL; 27997a8d1819SJoe Lawrence 28007a8d1819SJoe Lawrence *valp = val; 28017a8d1819SJoe Lawrence } else { 28027a8d1819SJoe Lawrence unsigned int val = *valp; 28037a8d1819SJoe Lawrence *lvalp = (unsigned long) val; 28047a8d1819SJoe Lawrence } 28057a8d1819SJoe Lawrence 28067a8d1819SJoe Lawrence return 0; 28077a8d1819SJoe Lawrence } 28087a8d1819SJoe Lawrence 2809319e0a21SEric Biggers static int proc_dopipe_max_size(struct ctl_table *table, int write, 28107a8d1819SJoe Lawrence void __user *buffer, size_t *lenp, loff_t *ppos) 28117a8d1819SJoe Lawrence { 28127a8d1819SJoe Lawrence return do_proc_douintvec(table, write, buffer, lenp, ppos, 28134c2e4befSEric Biggers do_proc_dopipe_max_size_conv, NULL); 28147a8d1819SJoe Lawrence } 28157a8d1819SJoe Lawrence 281654b50199SKees Cook static void validate_coredump_safety(void) 281754b50199SKees Cook { 2818046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 2819e579d2c2SKees Cook if (suid_dumpable == SUID_DUMP_ROOT && 282054b50199SKees Cook core_pattern[0] != '/' && core_pattern[0] != '|') { 2821760c6a91SAlexey Dobriyan printk(KERN_WARNING 2822760c6a91SAlexey Dobriyan "Unsafe core_pattern used with fs.suid_dumpable=2.\n" 2823760c6a91SAlexey Dobriyan "Pipe handler or fully qualified core dump path required.\n" 2824760c6a91SAlexey Dobriyan "Set kernel.core_pattern before fs.suid_dumpable.\n" 2825760c6a91SAlexey Dobriyan ); 282654b50199SKees Cook } 2827046d662fSAlex Kelly #endif 282854b50199SKees Cook } 282954b50199SKees Cook 283054b50199SKees Cook static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, 283154b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos) 283254b50199SKees Cook { 283354b50199SKees Cook int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 283454b50199SKees Cook if (!error) 283554b50199SKees Cook validate_coredump_safety(); 283654b50199SKees Cook return error; 283754b50199SKees Cook } 283854b50199SKees Cook 2839046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 284054b50199SKees Cook static int proc_dostring_coredump(struct ctl_table *table, int write, 284154b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos) 284254b50199SKees Cook { 284354b50199SKees Cook int error = proc_dostring(table, write, buffer, lenp, ppos); 284454b50199SKees Cook if (!error) 284554b50199SKees Cook validate_coredump_safety(); 284654b50199SKees Cook return error; 284754b50199SKees Cook } 2848046d662fSAlex Kelly #endif 284954b50199SKees Cook 2850eaee4172SDmitry Safonov #ifdef CONFIG_MAGIC_SYSRQ 2851eaee4172SDmitry Safonov static int sysrq_sysctl_handler(struct ctl_table *table, int write, 2852eaee4172SDmitry Safonov void __user *buffer, size_t *lenp, loff_t *ppos) 2853eaee4172SDmitry Safonov { 2854eaee4172SDmitry Safonov int tmp, ret; 2855eaee4172SDmitry Safonov 2856eaee4172SDmitry Safonov tmp = sysrq_mask(); 2857eaee4172SDmitry Safonov 2858eaee4172SDmitry Safonov ret = __do_proc_dointvec(&tmp, table, write, buffer, 2859eaee4172SDmitry Safonov lenp, ppos, NULL, NULL); 2860eaee4172SDmitry Safonov if (ret || !write) 2861eaee4172SDmitry Safonov return ret; 2862eaee4172SDmitry Safonov 2863eaee4172SDmitry Safonov if (write) 2864eaee4172SDmitry Safonov sysrq_toggle_support(tmp); 2865eaee4172SDmitry Safonov 2866eaee4172SDmitry Safonov return 0; 2867eaee4172SDmitry Safonov } 2868eaee4172SDmitry Safonov #endif 2869eaee4172SDmitry Safonov 2870d8217f07SEric W. Biederman static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, 28711da177e4SLinus Torvalds void __user *buffer, 28721da177e4SLinus Torvalds size_t *lenp, loff_t *ppos, 28731da177e4SLinus Torvalds unsigned long convmul, 28741da177e4SLinus Torvalds unsigned long convdiv) 28751da177e4SLinus Torvalds { 287600b7c339SAmerigo Wang unsigned long *i, *min, *max; 287700b7c339SAmerigo Wang int vleft, first = 1, err = 0; 287800b7c339SAmerigo Wang size_t left; 287970f6cbb6SAl Viro char *kbuf = NULL, *p; 28801da177e4SLinus Torvalds 288100b7c339SAmerigo Wang if (!data || !table->maxlen || !*lenp || (*ppos && !write)) { 28821da177e4SLinus Torvalds *lenp = 0; 28831da177e4SLinus Torvalds return 0; 28841da177e4SLinus Torvalds } 28851da177e4SLinus Torvalds 2886fcfbd547SKirill Korotaev i = (unsigned long *) data; 28871da177e4SLinus Torvalds min = (unsigned long *) table->extra1; 28881da177e4SLinus Torvalds max = (unsigned long *) table->extra2; 28891da177e4SLinus Torvalds vleft = table->maxlen / sizeof(unsigned long); 28901da177e4SLinus Torvalds left = *lenp; 28911da177e4SLinus Torvalds 28921da177e4SLinus Torvalds if (write) { 2893d383d484SLuis R. Rodriguez if (proc_first_pos_non_zero_ignore(ppos, table)) 2894f4aacea2SKees Cook goto out; 2895f4aacea2SKees Cook 289600b7c339SAmerigo Wang if (left > PAGE_SIZE - 1) 289700b7c339SAmerigo Wang left = PAGE_SIZE - 1; 289870f6cbb6SAl Viro p = kbuf = memdup_user_nul(buffer, left); 289970f6cbb6SAl Viro if (IS_ERR(kbuf)) 290070f6cbb6SAl Viro return PTR_ERR(kbuf); 29011da177e4SLinus Torvalds } 29021da177e4SLinus Torvalds 290327b3d80aSEric Dumazet for (; left && vleft--; i++, first = 0) { 290400b7c339SAmerigo Wang unsigned long val; 290500b7c339SAmerigo Wang 290600b7c339SAmerigo Wang if (write) { 290700b7c339SAmerigo Wang bool neg; 290800b7c339SAmerigo Wang 290970f6cbb6SAl Viro left -= proc_skip_spaces(&p); 291009be1784SCheng Lin if (!left) 291109be1784SCheng Lin break; 291200b7c339SAmerigo Wang 291370f6cbb6SAl Viro err = proc_get_long(&p, &left, &val, &neg, 291400b7c339SAmerigo Wang proc_wspace_sep, 291500b7c339SAmerigo Wang sizeof(proc_wspace_sep), NULL); 291600b7c339SAmerigo Wang if (err) 291700b7c339SAmerigo Wang break; 29181da177e4SLinus Torvalds if (neg) 29191da177e4SLinus Torvalds continue; 2920ff9f8a7cSEric Dumazet val = convmul * val / convdiv; 2921e260ad01SChristian Brauner if ((min && val < *min) || (max && val > *max)) { 2922e260ad01SChristian Brauner err = -EINVAL; 2923e260ad01SChristian Brauner break; 2924e260ad01SChristian Brauner } 29251da177e4SLinus Torvalds *i = val; 29261da177e4SLinus Torvalds } else { 292700b7c339SAmerigo Wang val = convdiv * (*i) / convmul; 29287833819dSChen Gang if (!first) { 292900b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\t'); 29307833819dSChen Gang if (err) 29317833819dSChen Gang break; 29327833819dSChen Gang } 293300b7c339SAmerigo Wang err = proc_put_long(&buffer, &left, val, false); 293400b7c339SAmerigo Wang if (err) 293500b7c339SAmerigo Wang break; 29361da177e4SLinus Torvalds } 29371da177e4SLinus Torvalds } 29381da177e4SLinus Torvalds 293900b7c339SAmerigo Wang if (!write && !first && left && !err) 294000b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\n'); 294100b7c339SAmerigo Wang if (write && !err) 294270f6cbb6SAl Viro left -= proc_skip_spaces(&p); 29431da177e4SLinus Torvalds if (write) { 294470f6cbb6SAl Viro kfree(kbuf); 294500b7c339SAmerigo Wang if (first) 294600b7c339SAmerigo Wang return err ? : -EINVAL; 29471da177e4SLinus Torvalds } 29481da177e4SLinus Torvalds *lenp -= left; 2949f4aacea2SKees Cook out: 29501da177e4SLinus Torvalds *ppos += *lenp; 295100b7c339SAmerigo Wang return err; 29521da177e4SLinus Torvalds } 29531da177e4SLinus Torvalds 2954d8217f07SEric W. Biederman static int do_proc_doulongvec_minmax(struct ctl_table *table, int write, 2955fcfbd547SKirill Korotaev void __user *buffer, 2956fcfbd547SKirill Korotaev size_t *lenp, loff_t *ppos, 2957fcfbd547SKirill Korotaev unsigned long convmul, 2958fcfbd547SKirill Korotaev unsigned long convdiv) 2959fcfbd547SKirill Korotaev { 2960fcfbd547SKirill Korotaev return __do_proc_doulongvec_minmax(table->data, table, write, 29618d65af78SAlexey Dobriyan buffer, lenp, ppos, convmul, convdiv); 2962fcfbd547SKirill Korotaev } 2963fcfbd547SKirill Korotaev 29641da177e4SLinus Torvalds /** 29651da177e4SLinus Torvalds * proc_doulongvec_minmax - read a vector of long integers with min/max values 29661da177e4SLinus Torvalds * @table: the sysctl table 29671da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 29681da177e4SLinus Torvalds * @buffer: the user buffer 29691da177e4SLinus Torvalds * @lenp: the size of the user buffer 29701da177e4SLinus Torvalds * @ppos: file position 29711da177e4SLinus Torvalds * 29721da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long 29731da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 29741da177e4SLinus Torvalds * 29751da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 29761da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 29771da177e4SLinus Torvalds * 29781da177e4SLinus Torvalds * Returns 0 on success. 29791da177e4SLinus Torvalds */ 29808d65af78SAlexey Dobriyan int proc_doulongvec_minmax(struct ctl_table *table, int write, 29811da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 29821da177e4SLinus Torvalds { 29838d65af78SAlexey Dobriyan return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l); 29841da177e4SLinus Torvalds } 29851da177e4SLinus Torvalds 29861da177e4SLinus Torvalds /** 29871da177e4SLinus Torvalds * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values 29881da177e4SLinus Torvalds * @table: the sysctl table 29891da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 29901da177e4SLinus Torvalds * @buffer: the user buffer 29911da177e4SLinus Torvalds * @lenp: the size of the user buffer 29921da177e4SLinus Torvalds * @ppos: file position 29931da177e4SLinus Torvalds * 29941da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long 29951da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. The values 29961da177e4SLinus Torvalds * are treated as milliseconds, and converted to jiffies when they are stored. 29971da177e4SLinus Torvalds * 29981da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 29991da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 30001da177e4SLinus Torvalds * 30011da177e4SLinus Torvalds * Returns 0 on success. 30021da177e4SLinus Torvalds */ 3003d8217f07SEric W. Biederman int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, 30041da177e4SLinus Torvalds void __user *buffer, 30051da177e4SLinus Torvalds size_t *lenp, loff_t *ppos) 30061da177e4SLinus Torvalds { 30078d65af78SAlexey Dobriyan return do_proc_doulongvec_minmax(table, write, buffer, 30081da177e4SLinus Torvalds lenp, ppos, HZ, 1000l); 30091da177e4SLinus Torvalds } 30101da177e4SLinus Torvalds 30111da177e4SLinus Torvalds 301200b7c339SAmerigo Wang static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp, 30131da177e4SLinus Torvalds int *valp, 30141da177e4SLinus Torvalds int write, void *data) 30151da177e4SLinus Torvalds { 30161da177e4SLinus Torvalds if (write) { 301763259457SGao Feng if (*lvalp > INT_MAX / HZ) 3018cba9f33dSBart Samwel return 1; 30191da177e4SLinus Torvalds *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ); 30201da177e4SLinus Torvalds } else { 30211da177e4SLinus Torvalds int val = *valp; 30221da177e4SLinus Torvalds unsigned long lval; 30231da177e4SLinus Torvalds if (val < 0) { 302400b7c339SAmerigo Wang *negp = true; 30259a5bc726SIlya Dryomov lval = -(unsigned long)val; 30261da177e4SLinus Torvalds } else { 302700b7c339SAmerigo Wang *negp = false; 30281da177e4SLinus Torvalds lval = (unsigned long)val; 30291da177e4SLinus Torvalds } 30301da177e4SLinus Torvalds *lvalp = lval / HZ; 30311da177e4SLinus Torvalds } 30321da177e4SLinus Torvalds return 0; 30331da177e4SLinus Torvalds } 30341da177e4SLinus Torvalds 303500b7c339SAmerigo Wang static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp, 30361da177e4SLinus Torvalds int *valp, 30371da177e4SLinus Torvalds int write, void *data) 30381da177e4SLinus Torvalds { 30391da177e4SLinus Torvalds if (write) { 3040cba9f33dSBart Samwel if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ) 3041cba9f33dSBart Samwel return 1; 30421da177e4SLinus Torvalds *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp); 30431da177e4SLinus Torvalds } else { 30441da177e4SLinus Torvalds int val = *valp; 30451da177e4SLinus Torvalds unsigned long lval; 30461da177e4SLinus Torvalds if (val < 0) { 304700b7c339SAmerigo Wang *negp = true; 30489a5bc726SIlya Dryomov lval = -(unsigned long)val; 30491da177e4SLinus Torvalds } else { 305000b7c339SAmerigo Wang *negp = false; 30511da177e4SLinus Torvalds lval = (unsigned long)val; 30521da177e4SLinus Torvalds } 30531da177e4SLinus Torvalds *lvalp = jiffies_to_clock_t(lval); 30541da177e4SLinus Torvalds } 30551da177e4SLinus Torvalds return 0; 30561da177e4SLinus Torvalds } 30571da177e4SLinus Torvalds 305800b7c339SAmerigo Wang static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp, 30591da177e4SLinus Torvalds int *valp, 30601da177e4SLinus Torvalds int write, void *data) 30611da177e4SLinus Torvalds { 30621da177e4SLinus Torvalds if (write) { 3063d738ce8fSFrancesco Fusco unsigned long jif = msecs_to_jiffies(*negp ? -*lvalp : *lvalp); 3064d738ce8fSFrancesco Fusco 3065d738ce8fSFrancesco Fusco if (jif > INT_MAX) 3066d738ce8fSFrancesco Fusco return 1; 3067d738ce8fSFrancesco Fusco *valp = (int)jif; 30681da177e4SLinus Torvalds } else { 30691da177e4SLinus Torvalds int val = *valp; 30701da177e4SLinus Torvalds unsigned long lval; 30711da177e4SLinus Torvalds if (val < 0) { 307200b7c339SAmerigo Wang *negp = true; 30739a5bc726SIlya Dryomov lval = -(unsigned long)val; 30741da177e4SLinus Torvalds } else { 307500b7c339SAmerigo Wang *negp = false; 30761da177e4SLinus Torvalds lval = (unsigned long)val; 30771da177e4SLinus Torvalds } 30781da177e4SLinus Torvalds *lvalp = jiffies_to_msecs(lval); 30791da177e4SLinus Torvalds } 30801da177e4SLinus Torvalds return 0; 30811da177e4SLinus Torvalds } 30821da177e4SLinus Torvalds 30831da177e4SLinus Torvalds /** 30841da177e4SLinus Torvalds * proc_dointvec_jiffies - read a vector of integers as seconds 30851da177e4SLinus Torvalds * @table: the sysctl table 30861da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 30871da177e4SLinus Torvalds * @buffer: the user buffer 30881da177e4SLinus Torvalds * @lenp: the size of the user buffer 30891da177e4SLinus Torvalds * @ppos: file position 30901da177e4SLinus Torvalds * 30911da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 30921da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 30931da177e4SLinus Torvalds * The values read are assumed to be in seconds, and are converted into 30941da177e4SLinus Torvalds * jiffies. 30951da177e4SLinus Torvalds * 30961da177e4SLinus Torvalds * Returns 0 on success. 30971da177e4SLinus Torvalds */ 30988d65af78SAlexey Dobriyan int proc_dointvec_jiffies(struct ctl_table *table, int write, 30991da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 31001da177e4SLinus Torvalds { 31018d65af78SAlexey Dobriyan return do_proc_dointvec(table,write,buffer,lenp,ppos, 31021da177e4SLinus Torvalds do_proc_dointvec_jiffies_conv,NULL); 31031da177e4SLinus Torvalds } 31041da177e4SLinus Torvalds 31051da177e4SLinus Torvalds /** 31061da177e4SLinus Torvalds * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds 31071da177e4SLinus Torvalds * @table: the sysctl table 31081da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 31091da177e4SLinus Torvalds * @buffer: the user buffer 31101da177e4SLinus Torvalds * @lenp: the size of the user buffer 31111e5d5331SRandy Dunlap * @ppos: pointer to the file position 31121da177e4SLinus Torvalds * 31131da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 31141da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 31151da177e4SLinus Torvalds * The values read are assumed to be in 1/USER_HZ seconds, and 31161da177e4SLinus Torvalds * are converted into jiffies. 31171da177e4SLinus Torvalds * 31181da177e4SLinus Torvalds * Returns 0 on success. 31191da177e4SLinus Torvalds */ 31208d65af78SAlexey Dobriyan int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, 31211da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 31221da177e4SLinus Torvalds { 31238d65af78SAlexey Dobriyan return do_proc_dointvec(table,write,buffer,lenp,ppos, 31241da177e4SLinus Torvalds do_proc_dointvec_userhz_jiffies_conv,NULL); 31251da177e4SLinus Torvalds } 31261da177e4SLinus Torvalds 31271da177e4SLinus Torvalds /** 31281da177e4SLinus Torvalds * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds 31291da177e4SLinus Torvalds * @table: the sysctl table 31301da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 31311da177e4SLinus Torvalds * @buffer: the user buffer 31321da177e4SLinus Torvalds * @lenp: the size of the user buffer 313367be2dd1SMartin Waitz * @ppos: file position 313467be2dd1SMartin Waitz * @ppos: the current position in the file 31351da177e4SLinus Torvalds * 31361da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 31371da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 31381da177e4SLinus Torvalds * The values read are assumed to be in 1/1000 seconds, and 31391da177e4SLinus Torvalds * are converted into jiffies. 31401da177e4SLinus Torvalds * 31411da177e4SLinus Torvalds * Returns 0 on success. 31421da177e4SLinus Torvalds */ 31438d65af78SAlexey Dobriyan int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, 31441da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 31451da177e4SLinus Torvalds { 31468d65af78SAlexey Dobriyan return do_proc_dointvec(table, write, buffer, lenp, ppos, 31471da177e4SLinus Torvalds do_proc_dointvec_ms_jiffies_conv, NULL); 31481da177e4SLinus Torvalds } 31491da177e4SLinus Torvalds 31508d65af78SAlexey Dobriyan static int proc_do_cad_pid(struct ctl_table *table, int write, 31519ec52099SCedric Le Goater void __user *buffer, size_t *lenp, loff_t *ppos) 31529ec52099SCedric Le Goater { 31539ec52099SCedric Le Goater struct pid *new_pid; 31549ec52099SCedric Le Goater pid_t tmp; 31559ec52099SCedric Le Goater int r; 31569ec52099SCedric Le Goater 31576c5f3e7bSPavel Emelyanov tmp = pid_vnr(cad_pid); 31589ec52099SCedric Le Goater 31598d65af78SAlexey Dobriyan r = __do_proc_dointvec(&tmp, table, write, buffer, 31609ec52099SCedric Le Goater lenp, ppos, NULL, NULL); 31619ec52099SCedric Le Goater if (r || !write) 31629ec52099SCedric Le Goater return r; 31639ec52099SCedric Le Goater 31649ec52099SCedric Le Goater new_pid = find_get_pid(tmp); 31659ec52099SCedric Le Goater if (!new_pid) 31669ec52099SCedric Le Goater return -ESRCH; 31679ec52099SCedric Le Goater 31689ec52099SCedric Le Goater put_pid(xchg(&cad_pid, new_pid)); 31699ec52099SCedric Le Goater return 0; 31709ec52099SCedric Le Goater } 31719ec52099SCedric Le Goater 31729f977fb7SOctavian Purdila /** 31739f977fb7SOctavian Purdila * proc_do_large_bitmap - read/write from/to a large bitmap 31749f977fb7SOctavian Purdila * @table: the sysctl table 31759f977fb7SOctavian Purdila * @write: %TRUE if this is a write to the sysctl file 31769f977fb7SOctavian Purdila * @buffer: the user buffer 31779f977fb7SOctavian Purdila * @lenp: the size of the user buffer 31789f977fb7SOctavian Purdila * @ppos: file position 31799f977fb7SOctavian Purdila * 31809f977fb7SOctavian Purdila * The bitmap is stored at table->data and the bitmap length (in bits) 31819f977fb7SOctavian Purdila * in table->maxlen. 31829f977fb7SOctavian Purdila * 31839f977fb7SOctavian Purdila * We use a range comma separated format (e.g. 1,3-4,10-10) so that 31849f977fb7SOctavian Purdila * large bitmaps may be represented in a compact manner. Writing into 31859f977fb7SOctavian Purdila * the file will clear the bitmap then update it with the given input. 31869f977fb7SOctavian Purdila * 31879f977fb7SOctavian Purdila * Returns 0 on success. 31889f977fb7SOctavian Purdila */ 31899f977fb7SOctavian Purdila int proc_do_large_bitmap(struct ctl_table *table, int write, 31909f977fb7SOctavian Purdila void __user *buffer, size_t *lenp, loff_t *ppos) 31919f977fb7SOctavian Purdila { 31929f977fb7SOctavian Purdila int err = 0; 31939f977fb7SOctavian Purdila bool first = 1; 31949f977fb7SOctavian Purdila size_t left = *lenp; 31959f977fb7SOctavian Purdila unsigned long bitmap_len = table->maxlen; 3196122ff243SWANG Cong unsigned long *bitmap = *(unsigned long **) table->data; 31979f977fb7SOctavian Purdila unsigned long *tmp_bitmap = NULL; 31989f977fb7SOctavian Purdila char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c; 31999f977fb7SOctavian Purdila 3200122ff243SWANG Cong if (!bitmap || !bitmap_len || !left || (*ppos && !write)) { 32019f977fb7SOctavian Purdila *lenp = 0; 32029f977fb7SOctavian Purdila return 0; 32039f977fb7SOctavian Purdila } 32049f977fb7SOctavian Purdila 32059f977fb7SOctavian Purdila if (write) { 320670f6cbb6SAl Viro char *kbuf, *p; 32073116ad38SEric Sandeen size_t skipped = 0; 32089f977fb7SOctavian Purdila 32093116ad38SEric Sandeen if (left > PAGE_SIZE - 1) { 32109f977fb7SOctavian Purdila left = PAGE_SIZE - 1; 32113116ad38SEric Sandeen /* How much of the buffer we'll skip this pass */ 32123116ad38SEric Sandeen skipped = *lenp - left; 32133116ad38SEric Sandeen } 32149f977fb7SOctavian Purdila 321570f6cbb6SAl Viro p = kbuf = memdup_user_nul(buffer, left); 321670f6cbb6SAl Viro if (IS_ERR(kbuf)) 321770f6cbb6SAl Viro return PTR_ERR(kbuf); 32189f977fb7SOctavian Purdila 3219475dae38SAndy Shevchenko tmp_bitmap = bitmap_zalloc(bitmap_len, GFP_KERNEL); 32209f977fb7SOctavian Purdila if (!tmp_bitmap) { 322170f6cbb6SAl Viro kfree(kbuf); 32229f977fb7SOctavian Purdila return -ENOMEM; 32239f977fb7SOctavian Purdila } 322470f6cbb6SAl Viro proc_skip_char(&p, &left, '\n'); 32259f977fb7SOctavian Purdila while (!err && left) { 32269f977fb7SOctavian Purdila unsigned long val_a, val_b; 32279f977fb7SOctavian Purdila bool neg; 32283116ad38SEric Sandeen size_t saved_left; 32299f977fb7SOctavian Purdila 32303116ad38SEric Sandeen /* In case we stop parsing mid-number, we can reset */ 32313116ad38SEric Sandeen saved_left = left; 323270f6cbb6SAl Viro err = proc_get_long(&p, &left, &val_a, &neg, tr_a, 32339f977fb7SOctavian Purdila sizeof(tr_a), &c); 32343116ad38SEric Sandeen /* 32353116ad38SEric Sandeen * If we consumed the entirety of a truncated buffer or 32363116ad38SEric Sandeen * only one char is left (may be a "-"), then stop here, 32373116ad38SEric Sandeen * reset, & come back for more. 32383116ad38SEric Sandeen */ 32393116ad38SEric Sandeen if ((left <= 1) && skipped) { 32403116ad38SEric Sandeen left = saved_left; 32413116ad38SEric Sandeen break; 32423116ad38SEric Sandeen } 32433116ad38SEric Sandeen 32449f977fb7SOctavian Purdila if (err) 32459f977fb7SOctavian Purdila break; 32469f977fb7SOctavian Purdila if (val_a >= bitmap_len || neg) { 32479f977fb7SOctavian Purdila err = -EINVAL; 32489f977fb7SOctavian Purdila break; 32499f977fb7SOctavian Purdila } 32509f977fb7SOctavian Purdila 32519f977fb7SOctavian Purdila val_b = val_a; 32529f977fb7SOctavian Purdila if (left) { 325370f6cbb6SAl Viro p++; 32549f977fb7SOctavian Purdila left--; 32559f977fb7SOctavian Purdila } 32569f977fb7SOctavian Purdila 32579f977fb7SOctavian Purdila if (c == '-') { 325870f6cbb6SAl Viro err = proc_get_long(&p, &left, &val_b, 32599f977fb7SOctavian Purdila &neg, tr_b, sizeof(tr_b), 32609f977fb7SOctavian Purdila &c); 32613116ad38SEric Sandeen /* 32623116ad38SEric Sandeen * If we consumed all of a truncated buffer or 32633116ad38SEric Sandeen * then stop here, reset, & come back for more. 32643116ad38SEric Sandeen */ 32653116ad38SEric Sandeen if (!left && skipped) { 32663116ad38SEric Sandeen left = saved_left; 32673116ad38SEric Sandeen break; 32683116ad38SEric Sandeen } 32693116ad38SEric Sandeen 32709f977fb7SOctavian Purdila if (err) 32719f977fb7SOctavian Purdila break; 32729f977fb7SOctavian Purdila if (val_b >= bitmap_len || neg || 32739f977fb7SOctavian Purdila val_a > val_b) { 32749f977fb7SOctavian Purdila err = -EINVAL; 32759f977fb7SOctavian Purdila break; 32769f977fb7SOctavian Purdila } 32779f977fb7SOctavian Purdila if (left) { 327870f6cbb6SAl Viro p++; 32799f977fb7SOctavian Purdila left--; 32809f977fb7SOctavian Purdila } 32819f977fb7SOctavian Purdila } 32829f977fb7SOctavian Purdila 32835a04cca6SAkinobu Mita bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1); 32849f977fb7SOctavian Purdila first = 0; 328570f6cbb6SAl Viro proc_skip_char(&p, &left, '\n'); 32869f977fb7SOctavian Purdila } 328770f6cbb6SAl Viro kfree(kbuf); 32883116ad38SEric Sandeen left += skipped; 32899f977fb7SOctavian Purdila } else { 32909f977fb7SOctavian Purdila unsigned long bit_a, bit_b = 0; 32919f977fb7SOctavian Purdila 32929f977fb7SOctavian Purdila while (left) { 32939f977fb7SOctavian Purdila bit_a = find_next_bit(bitmap, bitmap_len, bit_b); 32949f977fb7SOctavian Purdila if (bit_a >= bitmap_len) 32959f977fb7SOctavian Purdila break; 32969f977fb7SOctavian Purdila bit_b = find_next_zero_bit(bitmap, bitmap_len, 32979f977fb7SOctavian Purdila bit_a + 1) - 1; 32989f977fb7SOctavian Purdila 32999f977fb7SOctavian Purdila if (!first) { 33009f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, ','); 33019f977fb7SOctavian Purdila if (err) 33029f977fb7SOctavian Purdila break; 33039f977fb7SOctavian Purdila } 33049f977fb7SOctavian Purdila err = proc_put_long(&buffer, &left, bit_a, false); 33059f977fb7SOctavian Purdila if (err) 33069f977fb7SOctavian Purdila break; 33079f977fb7SOctavian Purdila if (bit_a != bit_b) { 33089f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, '-'); 33099f977fb7SOctavian Purdila if (err) 33109f977fb7SOctavian Purdila break; 33119f977fb7SOctavian Purdila err = proc_put_long(&buffer, &left, bit_b, false); 33129f977fb7SOctavian Purdila if (err) 33139f977fb7SOctavian Purdila break; 33149f977fb7SOctavian Purdila } 33159f977fb7SOctavian Purdila 33169f977fb7SOctavian Purdila first = 0; bit_b++; 33179f977fb7SOctavian Purdila } 33189f977fb7SOctavian Purdila if (!err) 33199f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, '\n'); 33209f977fb7SOctavian Purdila } 33219f977fb7SOctavian Purdila 33229f977fb7SOctavian Purdila if (!err) { 33239f977fb7SOctavian Purdila if (write) { 33249f977fb7SOctavian Purdila if (*ppos) 33259f977fb7SOctavian Purdila bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len); 33269f977fb7SOctavian Purdila else 33275a04cca6SAkinobu Mita bitmap_copy(bitmap, tmp_bitmap, bitmap_len); 33289f977fb7SOctavian Purdila } 33299f977fb7SOctavian Purdila *lenp -= left; 33309f977fb7SOctavian Purdila *ppos += *lenp; 3331f9eb2fddSOla N. Kaldestad } 3332f9eb2fddSOla N. Kaldestad 3333475dae38SAndy Shevchenko bitmap_free(tmp_bitmap); 33349f977fb7SOctavian Purdila return err; 33359f977fb7SOctavian Purdila } 33369f977fb7SOctavian Purdila 333755610500SJovi Zhang #else /* CONFIG_PROC_SYSCTL */ 33381da177e4SLinus Torvalds 33398d65af78SAlexey Dobriyan int proc_dostring(struct ctl_table *table, int write, 33401da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33411da177e4SLinus Torvalds { 33421da177e4SLinus Torvalds return -ENOSYS; 33431da177e4SLinus Torvalds } 33441da177e4SLinus Torvalds 33458d65af78SAlexey Dobriyan int proc_dointvec(struct ctl_table *table, int write, 33461da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33471da177e4SLinus Torvalds { 33481da177e4SLinus Torvalds return -ENOSYS; 33491da177e4SLinus Torvalds } 33501da177e4SLinus Torvalds 3351e7d316a0SSubash Abhinov Kasiviswanathan int proc_douintvec(struct ctl_table *table, int write, 3352e7d316a0SSubash Abhinov Kasiviswanathan void __user *buffer, size_t *lenp, loff_t *ppos) 3353e7d316a0SSubash Abhinov Kasiviswanathan { 3354e7d316a0SSubash Abhinov Kasiviswanathan return -ENOSYS; 3355e7d316a0SSubash Abhinov Kasiviswanathan } 3356e7d316a0SSubash Abhinov Kasiviswanathan 33578d65af78SAlexey Dobriyan int proc_dointvec_minmax(struct ctl_table *table, int write, 33581da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33591da177e4SLinus Torvalds { 33601da177e4SLinus Torvalds return -ENOSYS; 33611da177e4SLinus Torvalds } 33621da177e4SLinus Torvalds 336361d9b56aSLuis R. Rodriguez int proc_douintvec_minmax(struct ctl_table *table, int write, 336461d9b56aSLuis R. Rodriguez void __user *buffer, size_t *lenp, loff_t *ppos) 336561d9b56aSLuis R. Rodriguez { 336661d9b56aSLuis R. Rodriguez return -ENOSYS; 336761d9b56aSLuis R. Rodriguez } 336861d9b56aSLuis R. Rodriguez 33698d65af78SAlexey Dobriyan int proc_dointvec_jiffies(struct ctl_table *table, int write, 33701da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33711da177e4SLinus Torvalds { 33721da177e4SLinus Torvalds return -ENOSYS; 33731da177e4SLinus Torvalds } 33741da177e4SLinus Torvalds 33758d65af78SAlexey Dobriyan int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, 33761da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33771da177e4SLinus Torvalds { 33781da177e4SLinus Torvalds return -ENOSYS; 33791da177e4SLinus Torvalds } 33801da177e4SLinus Torvalds 33818d65af78SAlexey Dobriyan int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, 33821da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33831da177e4SLinus Torvalds { 33841da177e4SLinus Torvalds return -ENOSYS; 33851da177e4SLinus Torvalds } 33861da177e4SLinus Torvalds 33878d65af78SAlexey Dobriyan int proc_doulongvec_minmax(struct ctl_table *table, int write, 33881da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 33891da177e4SLinus Torvalds { 33901da177e4SLinus Torvalds return -ENOSYS; 33911da177e4SLinus Torvalds } 33921da177e4SLinus Torvalds 3393d8217f07SEric W. Biederman int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, 33941da177e4SLinus Torvalds void __user *buffer, 33951da177e4SLinus Torvalds size_t *lenp, loff_t *ppos) 33961da177e4SLinus Torvalds { 33971da177e4SLinus Torvalds return -ENOSYS; 33981da177e4SLinus Torvalds } 33991da177e4SLinus Torvalds 34000bc19985SStephen Suryaputra int proc_do_large_bitmap(struct ctl_table *table, int write, 34010bc19985SStephen Suryaputra void __user *buffer, size_t *lenp, loff_t *ppos) 34020bc19985SStephen Suryaputra { 34030bc19985SStephen Suryaputra return -ENOSYS; 34040bc19985SStephen Suryaputra } 34051da177e4SLinus Torvalds 340655610500SJovi Zhang #endif /* CONFIG_PROC_SYSCTL */ 34071da177e4SLinus Torvalds 3408a8e11e5cSEric Dumazet #if defined(CONFIG_SYSCTL) 3409a8e11e5cSEric Dumazet int proc_do_static_key(struct ctl_table *table, int write, 3410492ecee8SAlexei Starovoitov void __user *buffer, size_t *lenp, 3411492ecee8SAlexei Starovoitov loff_t *ppos) 3412492ecee8SAlexei Starovoitov { 3413a8e11e5cSEric Dumazet struct static_key *key = (struct static_key *)table->data; 3414a8e11e5cSEric Dumazet static DEFINE_MUTEX(static_key_mutex); 3415a8e11e5cSEric Dumazet int val, ret; 3416a8e11e5cSEric Dumazet struct ctl_table tmp = { 3417a8e11e5cSEric Dumazet .data = &val, 3418a8e11e5cSEric Dumazet .maxlen = sizeof(val), 3419a8e11e5cSEric Dumazet .mode = table->mode, 3420eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO, 3421eec4844fSMatteo Croce .extra2 = SYSCTL_ONE, 3422a8e11e5cSEric Dumazet }; 3423492ecee8SAlexei Starovoitov 3424492ecee8SAlexei Starovoitov if (write && !capable(CAP_SYS_ADMIN)) 3425492ecee8SAlexei Starovoitov return -EPERM; 3426492ecee8SAlexei Starovoitov 3427a8e11e5cSEric Dumazet mutex_lock(&static_key_mutex); 3428a8e11e5cSEric Dumazet val = static_key_enabled(key); 3429492ecee8SAlexei Starovoitov ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); 3430492ecee8SAlexei Starovoitov if (write && !ret) { 3431a8e11e5cSEric Dumazet if (val) 3432a8e11e5cSEric Dumazet static_key_enable(key); 3433492ecee8SAlexei Starovoitov else 3434a8e11e5cSEric Dumazet static_key_disable(key); 3435492ecee8SAlexei Starovoitov } 3436a8e11e5cSEric Dumazet mutex_unlock(&static_key_mutex); 3437492ecee8SAlexei Starovoitov return ret; 3438492ecee8SAlexei Starovoitov } 34393fcc5530SAlexei Starovoitov #endif 34401da177e4SLinus Torvalds /* 34411da177e4SLinus Torvalds * No sense putting this after each symbol definition, twice, 34421da177e4SLinus Torvalds * exception granted :-) 34431da177e4SLinus Torvalds */ 34441da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec); 3445e7d316a0SSubash Abhinov Kasiviswanathan EXPORT_SYMBOL(proc_douintvec); 34461da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_jiffies); 34471da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_minmax); 344861d9b56aSLuis R. Rodriguez EXPORT_SYMBOL_GPL(proc_douintvec_minmax); 34491da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); 34501da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_ms_jiffies); 34511da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dostring); 34521da177e4SLinus Torvalds EXPORT_SYMBOL(proc_doulongvec_minmax); 34531da177e4SLinus Torvalds EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); 34540bc19985SStephen Suryaputra EXPORT_SYMBOL(proc_do_large_bitmap); 3455