11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * sysctl.c: General linux system control interface 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Begun 24 March 1995, Stephen Tweedie 51da177e4SLinus Torvalds * Added /proc support, Dec 1995 61da177e4SLinus Torvalds * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas. 71da177e4SLinus Torvalds * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver. 81da177e4SLinus Torvalds * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver. 91da177e4SLinus Torvalds * Dynamic registration fixes, Stephen Tweedie. 101da177e4SLinus Torvalds * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn. 111da177e4SLinus Torvalds * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris 121da177e4SLinus Torvalds * Horn. 131da177e4SLinus Torvalds * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer. 141da177e4SLinus Torvalds * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer. 151da177e4SLinus Torvalds * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill 161da177e4SLinus Torvalds * Wendling. 171da177e4SLinus Torvalds * The list_for_each() macro wasn't appropriate for the sysctl loop. 181da177e4SLinus Torvalds * Removed it and replaced it with older style, 03/23/00, Bill Wendling 191da177e4SLinus Torvalds */ 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #include <linux/module.h> 22*e2e40f2cSChristoph Hellwig #include <linux/aio.h> 231da177e4SLinus Torvalds #include <linux/mm.h> 241da177e4SLinus Torvalds #include <linux/swap.h> 251da177e4SLinus Torvalds #include <linux/slab.h> 261da177e4SLinus Torvalds #include <linux/sysctl.h> 275a04cca6SAkinobu Mita #include <linux/bitmap.h> 28d33ed52dSDave Young #include <linux/signal.h> 29455cd5abSDan Rosenberg #include <linux/printk.h> 301da177e4SLinus Torvalds #include <linux/proc_fs.h> 3172c2d582SAndrew Morgan #include <linux/security.h> 321da177e4SLinus Torvalds #include <linux/ctype.h> 33dfec072eSVegard Nossum #include <linux/kmemcheck.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> 667984754bSKees Cook #include <linux/kexec.h> 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds #include <asm/uaccess.h> 691da177e4SLinus Torvalds #include <asm/processor.h> 701da177e4SLinus Torvalds 7129cbc78bSAndi Kleen #ifdef CONFIG_X86 7229cbc78bSAndi Kleen #include <asm/nmi.h> 730741f4d2SChuck Ebbert #include <asm/stacktrace.h> 746e7c4025SIngo Molnar #include <asm/io.h> 7529cbc78bSAndi Kleen #endif 76d550bbd4SDavid Howells #ifdef CONFIG_SPARC 77d550bbd4SDavid Howells #include <asm/setup.h> 78d550bbd4SDavid Howells #endif 79c55b7c3eSDave Young #ifdef CONFIG_BSD_PROCESS_ACCT 80c55b7c3eSDave Young #include <linux/acct.h> 81c55b7c3eSDave Young #endif 824f0e056fSDave Young #ifdef CONFIG_RT_MUTEXES 834f0e056fSDave Young #include <linux/rtmutex.h> 844f0e056fSDave Young #endif 852edf5e49SDave Young #if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT) 862edf5e49SDave Young #include <linux/lockdep.h> 872edf5e49SDave Young #endif 8815485a46SDave Young #ifdef CONFIG_CHR_DEV_SG 8915485a46SDave Young #include <scsi/sg.h> 9015485a46SDave Young #endif 9129cbc78bSAndi Kleen 9258687acbSDon Zickus #ifdef CONFIG_LOCKUP_DETECTOR 93504d7cf1SDon Zickus #include <linux/nmi.h> 94504d7cf1SDon Zickus #endif 95504d7cf1SDon Zickus 967058cb02SEric W. Biederman 971da177e4SLinus Torvalds #if defined(CONFIG_SYSCTL) 981da177e4SLinus Torvalds 991da177e4SLinus Torvalds /* External variables not in a header file. */ 1001da177e4SLinus Torvalds extern int max_threads; 101d6e71144SAlan Cox extern int suid_dumpable; 102046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 103046d662fSAlex Kelly extern int core_uses_pid; 1041da177e4SLinus Torvalds extern char core_pattern[]; 105a293980cSNeil Horman extern unsigned int core_pipe_limit; 106046d662fSAlex Kelly #endif 1071da177e4SLinus Torvalds extern int pid_max; 1081da177e4SLinus Torvalds extern int pid_max_min, pid_max_max; 1098ad4b1fbSRohit Seth extern int percpu_pagelist_fraction; 110bebfa101SAndi Kleen extern int compat_log; 1119745512cSArjan van de Ven extern int latencytop_enabled; 112eceea0b3SAl Viro extern int sysctl_nr_open_min, sysctl_nr_open_max; 113dd8632a1SPaul Mundt #ifndef CONFIG_MMU 114dd8632a1SPaul Mundt extern int sysctl_nr_trim_pages; 115dd8632a1SPaul Mundt #endif 1161da177e4SLinus Torvalds 117c4f3b63fSRavikiran G Thirumalai /* Constants used for minimum and maximum */ 1182508ce18SDon Zickus #ifdef CONFIG_LOCKUP_DETECTOR 119c4f3b63fSRavikiran G Thirumalai static int sixty = 60; 120c4f3b63fSRavikiran G Thirumalai #endif 121c4f3b63fSRavikiran G Thirumalai 122270750dbSAaron Tomlin static int __maybe_unused neg_one = -1; 123270750dbSAaron Tomlin 124c4f3b63fSRavikiran G Thirumalai static int zero; 125cd5f9a4cSLinus Torvalds static int __maybe_unused one = 1; 126cd5f9a4cSLinus Torvalds static int __maybe_unused two = 2; 1275509a5d2SDave Hansen static int __maybe_unused four = 4; 128fc3501d4SSven Wegener static unsigned long one_ul = 1; 129c4f3b63fSRavikiran G Thirumalai static int one_hundred = 100; 130af91322eSDave Young #ifdef CONFIG_PRINTK 131af91322eSDave Young static int ten_thousand = 10000; 132af91322eSDave Young #endif 133c4f3b63fSRavikiran G Thirumalai 1349e4a5bdaSAndrea Righi /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */ 1359e4a5bdaSAndrea Righi static unsigned long dirty_bytes_min = 2 * PAGE_SIZE; 1369e4a5bdaSAndrea Righi 1371da177e4SLinus Torvalds /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ 1381da177e4SLinus Torvalds static int maxolduid = 65535; 1391da177e4SLinus Torvalds static int minolduid; 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds static int ngroups_max = NGROUPS_MAX; 14273efc039SDan Ballard static const int cap_last_cap = CAP_LAST_CAP; 1431da177e4SLinus Torvalds 14480df2847SLiu Hua /*this is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs */ 14580df2847SLiu Hua #ifdef CONFIG_DETECT_HUNG_TASK 14680df2847SLiu Hua static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); 14780df2847SLiu Hua #endif 14880df2847SLiu Hua 149d14f1729SDave Young #ifdef CONFIG_INOTIFY_USER 150d14f1729SDave Young #include <linux/inotify.h> 151d14f1729SDave Young #endif 15272c57ed5SDavid S. Miller #ifdef CONFIG_SPARC 1531da177e4SLinus Torvalds #endif 1541da177e4SLinus Torvalds 1551da177e4SLinus Torvalds #ifdef __hppa__ 1561da177e4SLinus Torvalds extern int pwrsw_enabled; 157bf14e3b9SVineet Gupta #endif 158bf14e3b9SVineet Gupta 159bf14e3b9SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW 1601da177e4SLinus Torvalds extern int unaligned_enabled; 1611da177e4SLinus Torvalds #endif 1621da177e4SLinus Torvalds 163d2b176edSJes Sorensen #ifdef CONFIG_IA64 16488fc241fSDoug Chapman extern int unaligned_dump_stack; 165d2b176edSJes Sorensen #endif 166d2b176edSJes Sorensen 167b6fca725SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN 168b6fca725SVineet Gupta extern int no_unaligned_warning; 169b6fca725SVineet Gupta #endif 170b6fca725SVineet Gupta 171d6f8ff73SRandy Dunlap #ifdef CONFIG_PROC_SYSCTL 172f4aacea2SKees Cook 173f4aacea2SKees Cook #define SYSCTL_WRITES_LEGACY -1 174f4aacea2SKees Cook #define SYSCTL_WRITES_WARN 0 175f4aacea2SKees Cook #define SYSCTL_WRITES_STRICT 1 176f4aacea2SKees Cook 177f4aacea2SKees Cook static int sysctl_writes_strict = SYSCTL_WRITES_WARN; 178f4aacea2SKees Cook 1798d65af78SAlexey Dobriyan static int proc_do_cad_pid(struct ctl_table *table, int write, 1809ec52099SCedric Le Goater void __user *buffer, size_t *lenp, loff_t *ppos); 1818d65af78SAlexey Dobriyan static int proc_taint(struct ctl_table *table, int write, 18234f5a398STheodore Ts'o void __user *buffer, size_t *lenp, loff_t *ppos); 183d6f8ff73SRandy Dunlap #endif 1849ec52099SCedric Le Goater 185bfdc0b49SRichard Weinberger #ifdef CONFIG_PRINTK 186620f6e8eSKees Cook static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, 187bfdc0b49SRichard Weinberger void __user *buffer, size_t *lenp, loff_t *ppos); 188bfdc0b49SRichard Weinberger #endif 189bfdc0b49SRichard Weinberger 19054b50199SKees Cook static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, 19154b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos); 192046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 19354b50199SKees Cook static int proc_dostring_coredump(struct ctl_table *table, int write, 19454b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos); 195046d662fSAlex Kelly #endif 19654b50199SKees Cook 19797f5f0cdSDmitry Torokhov #ifdef CONFIG_MAGIC_SYSRQ 1988c6a98b2SAndy Whitcroft /* Note: sysrq code uses it's own private copy */ 1998eaede49SBen Hutchings static int __sysrq_enabled = CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE; 20097f5f0cdSDmitry Torokhov 2016f8fd1d7SJoe Perches static int sysrq_sysctl_handler(struct ctl_table *table, int write, 20297f5f0cdSDmitry Torokhov void __user *buffer, size_t *lenp, 20397f5f0cdSDmitry Torokhov loff_t *ppos) 20497f5f0cdSDmitry Torokhov { 20597f5f0cdSDmitry Torokhov int error; 20697f5f0cdSDmitry Torokhov 20797f5f0cdSDmitry Torokhov error = proc_dointvec(table, write, buffer, lenp, ppos); 20897f5f0cdSDmitry Torokhov if (error) 20997f5f0cdSDmitry Torokhov return error; 21097f5f0cdSDmitry Torokhov 21197f5f0cdSDmitry Torokhov if (write) 21297f5f0cdSDmitry Torokhov sysrq_toggle_support(__sysrq_enabled); 21397f5f0cdSDmitry Torokhov 21497f5f0cdSDmitry Torokhov return 0; 21597f5f0cdSDmitry Torokhov } 21697f5f0cdSDmitry Torokhov 21797f5f0cdSDmitry Torokhov #endif 21897f5f0cdSDmitry Torokhov 219d8217f07SEric W. Biederman static struct ctl_table kern_table[]; 220d8217f07SEric W. Biederman static struct ctl_table vm_table[]; 221d8217f07SEric W. Biederman static struct ctl_table fs_table[]; 222d8217f07SEric W. Biederman static struct ctl_table debug_table[]; 223d8217f07SEric W. Biederman static struct ctl_table dev_table[]; 224d8217f07SEric W. Biederman extern struct ctl_table random_table[]; 2257ef9964eSDavide Libenzi #ifdef CONFIG_EPOLL 2267ef9964eSDavide Libenzi extern struct ctl_table epoll_table[]; 2277ef9964eSDavide Libenzi #endif 2281da177e4SLinus Torvalds 2291da177e4SLinus Torvalds #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT 2301da177e4SLinus Torvalds int sysctl_legacy_va_layout; 2311da177e4SLinus Torvalds #endif 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds /* The default sysctl tables: */ 2341da177e4SLinus Torvalds 235de4e83bdSEric W. Biederman static struct ctl_table sysctl_base_table[] = { 2361da177e4SLinus Torvalds { 2371da177e4SLinus Torvalds .procname = "kernel", 2381da177e4SLinus Torvalds .mode = 0555, 2391da177e4SLinus Torvalds .child = kern_table, 2401da177e4SLinus Torvalds }, 2411da177e4SLinus Torvalds { 2421da177e4SLinus Torvalds .procname = "vm", 2431da177e4SLinus Torvalds .mode = 0555, 2441da177e4SLinus Torvalds .child = vm_table, 2451da177e4SLinus Torvalds }, 2461da177e4SLinus Torvalds { 2471da177e4SLinus Torvalds .procname = "fs", 2481da177e4SLinus Torvalds .mode = 0555, 2491da177e4SLinus Torvalds .child = fs_table, 2501da177e4SLinus Torvalds }, 2511da177e4SLinus Torvalds { 2521da177e4SLinus Torvalds .procname = "debug", 2531da177e4SLinus Torvalds .mode = 0555, 2541da177e4SLinus Torvalds .child = debug_table, 2551da177e4SLinus Torvalds }, 2561da177e4SLinus Torvalds { 2571da177e4SLinus Torvalds .procname = "dev", 2581da177e4SLinus Torvalds .mode = 0555, 2591da177e4SLinus Torvalds .child = dev_table, 2601da177e4SLinus Torvalds }, 2616fce56ecSEric W. Biederman { } 2621da177e4SLinus Torvalds }; 2631da177e4SLinus Torvalds 26477e54a1fSIngo Molnar #ifdef CONFIG_SCHED_DEBUG 26573c4efd2SEric Dumazet static int min_sched_granularity_ns = 100000; /* 100 usecs */ 26673c4efd2SEric Dumazet static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ 26773c4efd2SEric Dumazet static int min_wakeup_granularity_ns; /* 0 usecs */ 26873c4efd2SEric Dumazet static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */ 269cbee9f88SPeter Zijlstra #ifdef CONFIG_SMP 2701983a922SChristian Ehrhardt static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE; 2711983a922SChristian Ehrhardt static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1; 272cbee9f88SPeter Zijlstra #endif /* CONFIG_SMP */ 273cbee9f88SPeter Zijlstra #endif /* CONFIG_SCHED_DEBUG */ 27477e54a1fSIngo Molnar 2755e771905SMel Gorman #ifdef CONFIG_COMPACTION 2765e771905SMel Gorman static int min_extfrag_threshold; 2775e771905SMel Gorman static int max_extfrag_threshold = 1000; 2785e771905SMel Gorman #endif 2795e771905SMel Gorman 280d8217f07SEric W. Biederman static struct ctl_table kern_table[] = { 2812bba22c5SMike Galbraith { 2822bba22c5SMike Galbraith .procname = "sched_child_runs_first", 2832bba22c5SMike Galbraith .data = &sysctl_sched_child_runs_first, 2842bba22c5SMike Galbraith .maxlen = sizeof(unsigned int), 2852bba22c5SMike Galbraith .mode = 0644, 2866d456111SEric W. Biederman .proc_handler = proc_dointvec, 2872bba22c5SMike Galbraith }, 28877e54a1fSIngo Molnar #ifdef CONFIG_SCHED_DEBUG 28977e54a1fSIngo Molnar { 290b2be5e96SPeter Zijlstra .procname = "sched_min_granularity_ns", 291b2be5e96SPeter Zijlstra .data = &sysctl_sched_min_granularity, 29277e54a1fSIngo Molnar .maxlen = sizeof(unsigned int), 29377e54a1fSIngo Molnar .mode = 0644, 294702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 295b2be5e96SPeter Zijlstra .extra1 = &min_sched_granularity_ns, 296b2be5e96SPeter Zijlstra .extra2 = &max_sched_granularity_ns, 29777e54a1fSIngo Molnar }, 29877e54a1fSIngo Molnar { 29921805085SPeter Zijlstra .procname = "sched_latency_ns", 30021805085SPeter Zijlstra .data = &sysctl_sched_latency, 30121805085SPeter Zijlstra .maxlen = sizeof(unsigned int), 30221805085SPeter Zijlstra .mode = 0644, 303702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 30421805085SPeter Zijlstra .extra1 = &min_sched_granularity_ns, 30521805085SPeter Zijlstra .extra2 = &max_sched_granularity_ns, 30621805085SPeter Zijlstra }, 30721805085SPeter Zijlstra { 30877e54a1fSIngo Molnar .procname = "sched_wakeup_granularity_ns", 30977e54a1fSIngo Molnar .data = &sysctl_sched_wakeup_granularity, 31077e54a1fSIngo Molnar .maxlen = sizeof(unsigned int), 31177e54a1fSIngo Molnar .mode = 0644, 312702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 31377e54a1fSIngo Molnar .extra1 = &min_wakeup_granularity_ns, 31477e54a1fSIngo Molnar .extra2 = &max_wakeup_granularity_ns, 31577e54a1fSIngo Molnar }, 316cbee9f88SPeter Zijlstra #ifdef CONFIG_SMP 31777e54a1fSIngo Molnar { 3181983a922SChristian Ehrhardt .procname = "sched_tunable_scaling", 3191983a922SChristian Ehrhardt .data = &sysctl_sched_tunable_scaling, 3201983a922SChristian Ehrhardt .maxlen = sizeof(enum sched_tunable_scaling), 3211983a922SChristian Ehrhardt .mode = 0644, 322702a7c76SLinus Torvalds .proc_handler = sched_proc_update_handler, 3231983a922SChristian Ehrhardt .extra1 = &min_sched_tunable_scaling, 3241983a922SChristian Ehrhardt .extra2 = &max_sched_tunable_scaling, 3252398f2c6SPeter Zijlstra }, 3262398f2c6SPeter Zijlstra { 327d00535dbSNamhyung Kim .procname = "sched_migration_cost_ns", 328da84d961SIngo Molnar .data = &sysctl_sched_migration_cost, 329da84d961SIngo Molnar .maxlen = sizeof(unsigned int), 330da84d961SIngo Molnar .mode = 0644, 3316d456111SEric W. Biederman .proc_handler = proc_dointvec, 332da84d961SIngo Molnar }, 333b82d9fddSPeter Zijlstra { 334b82d9fddSPeter Zijlstra .procname = "sched_nr_migrate", 335b82d9fddSPeter Zijlstra .data = &sysctl_sched_nr_migrate, 336b82d9fddSPeter Zijlstra .maxlen = sizeof(unsigned int), 337fa85ae24SPeter Zijlstra .mode = 0644, 3386d456111SEric W. Biederman .proc_handler = proc_dointvec, 339fa85ae24SPeter Zijlstra }, 340cd1bb94bSArun R Bharadwaj { 341d00535dbSNamhyung Kim .procname = "sched_time_avg_ms", 342e9e9250bSPeter Zijlstra .data = &sysctl_sched_time_avg, 343e9e9250bSPeter Zijlstra .maxlen = sizeof(unsigned int), 344e9e9250bSPeter Zijlstra .mode = 0644, 3456d456111SEric W. Biederman .proc_handler = proc_dointvec, 346e9e9250bSPeter Zijlstra }, 347e9e9250bSPeter Zijlstra { 348d00535dbSNamhyung Kim .procname = "sched_shares_window_ns", 349a7a4f8a7SPaul Turner .data = &sysctl_sched_shares_window, 350a7a4f8a7SPaul Turner .maxlen = sizeof(unsigned int), 351a7a4f8a7SPaul Turner .mode = 0644, 352a7a4f8a7SPaul Turner .proc_handler = proc_dointvec, 353a7a4f8a7SPaul Turner }, 354a7a4f8a7SPaul Turner { 355cd1bb94bSArun R Bharadwaj .procname = "timer_migration", 356cd1bb94bSArun R Bharadwaj .data = &sysctl_timer_migration, 357cd1bb94bSArun R Bharadwaj .maxlen = sizeof(unsigned int), 358cd1bb94bSArun R Bharadwaj .mode = 0644, 3596d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 360bfdb4d9fSArun R Bharadwaj .extra1 = &zero, 361bfdb4d9fSArun R Bharadwaj .extra2 = &one, 362cd1bb94bSArun R Bharadwaj }, 363cbee9f88SPeter Zijlstra #endif /* CONFIG_SMP */ 364cbee9f88SPeter Zijlstra #ifdef CONFIG_NUMA_BALANCING 365cbee9f88SPeter Zijlstra { 3664b96a29bSPeter Zijlstra .procname = "numa_balancing_scan_delay_ms", 3674b96a29bSPeter Zijlstra .data = &sysctl_numa_balancing_scan_delay, 3684b96a29bSPeter Zijlstra .maxlen = sizeof(unsigned int), 3694b96a29bSPeter Zijlstra .mode = 0644, 3704b96a29bSPeter Zijlstra .proc_handler = proc_dointvec, 3714b96a29bSPeter Zijlstra }, 3724b96a29bSPeter Zijlstra { 373cbee9f88SPeter Zijlstra .procname = "numa_balancing_scan_period_min_ms", 374cbee9f88SPeter Zijlstra .data = &sysctl_numa_balancing_scan_period_min, 375cbee9f88SPeter Zijlstra .maxlen = sizeof(unsigned int), 376cbee9f88SPeter Zijlstra .mode = 0644, 377cbee9f88SPeter Zijlstra .proc_handler = proc_dointvec, 378cbee9f88SPeter Zijlstra }, 379cbee9f88SPeter Zijlstra { 380cbee9f88SPeter Zijlstra .procname = "numa_balancing_scan_period_max_ms", 381cbee9f88SPeter Zijlstra .data = &sysctl_numa_balancing_scan_period_max, 382cbee9f88SPeter Zijlstra .maxlen = sizeof(unsigned int), 383cbee9f88SPeter Zijlstra .mode = 0644, 384cbee9f88SPeter Zijlstra .proc_handler = proc_dointvec, 385cbee9f88SPeter Zijlstra }, 3866e5fb223SPeter Zijlstra { 3876e5fb223SPeter Zijlstra .procname = "numa_balancing_scan_size_mb", 3886e5fb223SPeter Zijlstra .data = &sysctl_numa_balancing_scan_size, 3896e5fb223SPeter Zijlstra .maxlen = sizeof(unsigned int), 3906e5fb223SPeter Zijlstra .mode = 0644, 39164192658SKirill Tkhai .proc_handler = proc_dointvec_minmax, 39264192658SKirill Tkhai .extra1 = &one, 3936e5fb223SPeter Zijlstra }, 3943a7053b3SMel Gorman { 39554a43d54SAndi Kleen .procname = "numa_balancing", 39654a43d54SAndi Kleen .data = NULL, /* filled in by handler */ 39754a43d54SAndi Kleen .maxlen = sizeof(unsigned int), 39854a43d54SAndi Kleen .mode = 0644, 39954a43d54SAndi Kleen .proc_handler = sysctl_numa_balancing, 40054a43d54SAndi Kleen .extra1 = &zero, 40154a43d54SAndi Kleen .extra2 = &one, 40254a43d54SAndi Kleen }, 403cbee9f88SPeter Zijlstra #endif /* CONFIG_NUMA_BALANCING */ 404cbee9f88SPeter Zijlstra #endif /* CONFIG_SCHED_DEBUG */ 4051799e35dSIngo Molnar { 4069f0c1e56SPeter Zijlstra .procname = "sched_rt_period_us", 4079f0c1e56SPeter Zijlstra .data = &sysctl_sched_rt_period, 4089f0c1e56SPeter Zijlstra .maxlen = sizeof(unsigned int), 4099f0c1e56SPeter Zijlstra .mode = 0644, 4106d456111SEric W. Biederman .proc_handler = sched_rt_handler, 4119f0c1e56SPeter Zijlstra }, 4129f0c1e56SPeter Zijlstra { 4139f0c1e56SPeter Zijlstra .procname = "sched_rt_runtime_us", 4149f0c1e56SPeter Zijlstra .data = &sysctl_sched_rt_runtime, 4159f0c1e56SPeter Zijlstra .maxlen = sizeof(int), 4169f0c1e56SPeter Zijlstra .mode = 0644, 4176d456111SEric W. Biederman .proc_handler = sched_rt_handler, 4189f0c1e56SPeter Zijlstra }, 419ce0dbbbbSClark Williams { 420ce0dbbbbSClark Williams .procname = "sched_rr_timeslice_ms", 421ce0dbbbbSClark Williams .data = &sched_rr_timeslice, 422ce0dbbbbSClark Williams .maxlen = sizeof(int), 423ce0dbbbbSClark Williams .mode = 0644, 424ce0dbbbbSClark Williams .proc_handler = sched_rr_handler, 425ce0dbbbbSClark Williams }, 4265091faa4SMike Galbraith #ifdef CONFIG_SCHED_AUTOGROUP 4275091faa4SMike Galbraith { 4285091faa4SMike Galbraith .procname = "sched_autogroup_enabled", 4295091faa4SMike Galbraith .data = &sysctl_sched_autogroup_enabled, 4305091faa4SMike Galbraith .maxlen = sizeof(unsigned int), 4315091faa4SMike Galbraith .mode = 0644, 4321747b21fSYong Zhang .proc_handler = proc_dointvec_minmax, 4335091faa4SMike Galbraith .extra1 = &zero, 4345091faa4SMike Galbraith .extra2 = &one, 4355091faa4SMike Galbraith }, 4365091faa4SMike Galbraith #endif 437ec12cb7fSPaul Turner #ifdef CONFIG_CFS_BANDWIDTH 438ec12cb7fSPaul Turner { 439ec12cb7fSPaul Turner .procname = "sched_cfs_bandwidth_slice_us", 440ec12cb7fSPaul Turner .data = &sysctl_sched_cfs_bandwidth_slice, 441ec12cb7fSPaul Turner .maxlen = sizeof(unsigned int), 442ec12cb7fSPaul Turner .mode = 0644, 443ec12cb7fSPaul Turner .proc_handler = proc_dointvec_minmax, 444ec12cb7fSPaul Turner .extra1 = &one, 445ec12cb7fSPaul Turner }, 446ec12cb7fSPaul Turner #endif 447f20786ffSPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 448f20786ffSPeter Zijlstra { 449f20786ffSPeter Zijlstra .procname = "prove_locking", 450f20786ffSPeter Zijlstra .data = &prove_locking, 451f20786ffSPeter Zijlstra .maxlen = sizeof(int), 452f20786ffSPeter Zijlstra .mode = 0644, 4536d456111SEric W. Biederman .proc_handler = proc_dointvec, 454f20786ffSPeter Zijlstra }, 455f20786ffSPeter Zijlstra #endif 456f20786ffSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 457f20786ffSPeter Zijlstra { 458f20786ffSPeter Zijlstra .procname = "lock_stat", 459f20786ffSPeter Zijlstra .data = &lock_stat, 460f20786ffSPeter Zijlstra .maxlen = sizeof(int), 461f20786ffSPeter Zijlstra .mode = 0644, 4626d456111SEric W. Biederman .proc_handler = proc_dointvec, 463f20786ffSPeter Zijlstra }, 464f20786ffSPeter Zijlstra #endif 46577e54a1fSIngo Molnar { 4661da177e4SLinus Torvalds .procname = "panic", 4671da177e4SLinus Torvalds .data = &panic_timeout, 4681da177e4SLinus Torvalds .maxlen = sizeof(int), 4691da177e4SLinus Torvalds .mode = 0644, 4706d456111SEric W. Biederman .proc_handler = proc_dointvec, 4711da177e4SLinus Torvalds }, 472046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 4731da177e4SLinus Torvalds { 4741da177e4SLinus Torvalds .procname = "core_uses_pid", 4751da177e4SLinus Torvalds .data = &core_uses_pid, 4761da177e4SLinus Torvalds .maxlen = sizeof(int), 4771da177e4SLinus Torvalds .mode = 0644, 4786d456111SEric W. Biederman .proc_handler = proc_dointvec, 4791da177e4SLinus Torvalds }, 4801da177e4SLinus Torvalds { 4811da177e4SLinus Torvalds .procname = "core_pattern", 4821da177e4SLinus Torvalds .data = core_pattern, 48371ce92f3SDan Aloni .maxlen = CORENAME_MAX_SIZE, 4841da177e4SLinus Torvalds .mode = 0644, 48554b50199SKees Cook .proc_handler = proc_dostring_coredump, 4861da177e4SLinus Torvalds }, 487a293980cSNeil Horman { 488a293980cSNeil Horman .procname = "core_pipe_limit", 489a293980cSNeil Horman .data = &core_pipe_limit, 490a293980cSNeil Horman .maxlen = sizeof(unsigned int), 491a293980cSNeil Horman .mode = 0644, 4926d456111SEric W. Biederman .proc_handler = proc_dointvec, 493a293980cSNeil Horman }, 494046d662fSAlex Kelly #endif 49534f5a398STheodore Ts'o #ifdef CONFIG_PROC_SYSCTL 4961da177e4SLinus Torvalds { 4971da177e4SLinus Torvalds .procname = "tainted", 49825ddbb18SAndi Kleen .maxlen = sizeof(long), 49934f5a398STheodore Ts'o .mode = 0644, 5006d456111SEric W. Biederman .proc_handler = proc_taint, 5011da177e4SLinus Torvalds }, 502f4aacea2SKees Cook { 503f4aacea2SKees Cook .procname = "sysctl_writes_strict", 504f4aacea2SKees Cook .data = &sysctl_writes_strict, 505f4aacea2SKees Cook .maxlen = sizeof(int), 506f4aacea2SKees Cook .mode = 0644, 507f4aacea2SKees Cook .proc_handler = proc_dointvec_minmax, 508f4aacea2SKees Cook .extra1 = &neg_one, 509f4aacea2SKees Cook .extra2 = &one, 510f4aacea2SKees Cook }, 51134f5a398STheodore Ts'o #endif 5129745512cSArjan van de Ven #ifdef CONFIG_LATENCYTOP 5139745512cSArjan van de Ven { 5149745512cSArjan van de Ven .procname = "latencytop", 5159745512cSArjan van de Ven .data = &latencytop_enabled, 5169745512cSArjan van de Ven .maxlen = sizeof(int), 5179745512cSArjan van de Ven .mode = 0644, 5186d456111SEric W. Biederman .proc_handler = proc_dointvec, 5199745512cSArjan van de Ven }, 5209745512cSArjan van de Ven #endif 5211da177e4SLinus Torvalds #ifdef CONFIG_BLK_DEV_INITRD 5221da177e4SLinus Torvalds { 5231da177e4SLinus Torvalds .procname = "real-root-dev", 5241da177e4SLinus Torvalds .data = &real_root_dev, 5251da177e4SLinus Torvalds .maxlen = sizeof(int), 5261da177e4SLinus Torvalds .mode = 0644, 5276d456111SEric W. Biederman .proc_handler = proc_dointvec, 5281da177e4SLinus Torvalds }, 5291da177e4SLinus Torvalds #endif 53045807a1dSIngo Molnar { 53145807a1dSIngo Molnar .procname = "print-fatal-signals", 53245807a1dSIngo Molnar .data = &print_fatal_signals, 53345807a1dSIngo Molnar .maxlen = sizeof(int), 53445807a1dSIngo Molnar .mode = 0644, 5356d456111SEric W. Biederman .proc_handler = proc_dointvec, 53645807a1dSIngo Molnar }, 53772c57ed5SDavid S. Miller #ifdef CONFIG_SPARC 5381da177e4SLinus Torvalds { 5391da177e4SLinus Torvalds .procname = "reboot-cmd", 5401da177e4SLinus Torvalds .data = reboot_command, 5411da177e4SLinus Torvalds .maxlen = 256, 5421da177e4SLinus Torvalds .mode = 0644, 5436d456111SEric W. Biederman .proc_handler = proc_dostring, 5441da177e4SLinus Torvalds }, 5451da177e4SLinus Torvalds { 5461da177e4SLinus Torvalds .procname = "stop-a", 5471da177e4SLinus Torvalds .data = &stop_a_enabled, 5481da177e4SLinus Torvalds .maxlen = sizeof (int), 5491da177e4SLinus Torvalds .mode = 0644, 5506d456111SEric W. Biederman .proc_handler = proc_dointvec, 5511da177e4SLinus Torvalds }, 5521da177e4SLinus Torvalds { 5531da177e4SLinus Torvalds .procname = "scons-poweroff", 5541da177e4SLinus Torvalds .data = &scons_pwroff, 5551da177e4SLinus Torvalds .maxlen = sizeof (int), 5561da177e4SLinus Torvalds .mode = 0644, 5576d456111SEric W. Biederman .proc_handler = proc_dointvec, 5581da177e4SLinus Torvalds }, 5591da177e4SLinus Torvalds #endif 5600871420fSDavid S. Miller #ifdef CONFIG_SPARC64 5610871420fSDavid S. Miller { 5620871420fSDavid S. Miller .procname = "tsb-ratio", 5630871420fSDavid S. Miller .data = &sysctl_tsb_ratio, 5640871420fSDavid S. Miller .maxlen = sizeof (int), 5650871420fSDavid S. Miller .mode = 0644, 5666d456111SEric W. Biederman .proc_handler = proc_dointvec, 5670871420fSDavid S. Miller }, 5680871420fSDavid S. Miller #endif 5691da177e4SLinus Torvalds #ifdef __hppa__ 5701da177e4SLinus Torvalds { 5711da177e4SLinus Torvalds .procname = "soft-power", 5721da177e4SLinus Torvalds .data = &pwrsw_enabled, 5731da177e4SLinus Torvalds .maxlen = sizeof (int), 5741da177e4SLinus Torvalds .mode = 0644, 5756d456111SEric W. Biederman .proc_handler = proc_dointvec, 5761da177e4SLinus Torvalds }, 577bf14e3b9SVineet Gupta #endif 578bf14e3b9SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW 5791da177e4SLinus Torvalds { 5801da177e4SLinus Torvalds .procname = "unaligned-trap", 5811da177e4SLinus Torvalds .data = &unaligned_enabled, 5821da177e4SLinus Torvalds .maxlen = sizeof (int), 5831da177e4SLinus Torvalds .mode = 0644, 5846d456111SEric W. Biederman .proc_handler = proc_dointvec, 5851da177e4SLinus Torvalds }, 5861da177e4SLinus Torvalds #endif 5871da177e4SLinus Torvalds { 5881da177e4SLinus Torvalds .procname = "ctrl-alt-del", 5891da177e4SLinus Torvalds .data = &C_A_D, 5901da177e4SLinus Torvalds .maxlen = sizeof(int), 5911da177e4SLinus Torvalds .mode = 0644, 5926d456111SEric W. Biederman .proc_handler = proc_dointvec, 5931da177e4SLinus Torvalds }, 594606576ceSSteven Rostedt #ifdef CONFIG_FUNCTION_TRACER 595b0fc494fSSteven Rostedt { 596b0fc494fSSteven Rostedt .procname = "ftrace_enabled", 597b0fc494fSSteven Rostedt .data = &ftrace_enabled, 598b0fc494fSSteven Rostedt .maxlen = sizeof(int), 599b0fc494fSSteven Rostedt .mode = 0644, 6006d456111SEric W. Biederman .proc_handler = ftrace_enable_sysctl, 601b0fc494fSSteven Rostedt }, 602b0fc494fSSteven Rostedt #endif 603f38f1d2aSSteven Rostedt #ifdef CONFIG_STACK_TRACER 604f38f1d2aSSteven Rostedt { 605f38f1d2aSSteven Rostedt .procname = "stack_tracer_enabled", 606f38f1d2aSSteven Rostedt .data = &stack_tracer_enabled, 607f38f1d2aSSteven Rostedt .maxlen = sizeof(int), 608f38f1d2aSSteven Rostedt .mode = 0644, 6096d456111SEric W. Biederman .proc_handler = stack_trace_sysctl, 610f38f1d2aSSteven Rostedt }, 611f38f1d2aSSteven Rostedt #endif 612944ac425SSteven Rostedt #ifdef CONFIG_TRACING 613944ac425SSteven Rostedt { 6143299b4ddSPeter Zijlstra .procname = "ftrace_dump_on_oops", 615944ac425SSteven Rostedt .data = &ftrace_dump_on_oops, 616944ac425SSteven Rostedt .maxlen = sizeof(int), 617944ac425SSteven Rostedt .mode = 0644, 6186d456111SEric W. Biederman .proc_handler = proc_dointvec, 619944ac425SSteven Rostedt }, 620de7edd31SSteven Rostedt (Red Hat) { 621de7edd31SSteven Rostedt (Red Hat) .procname = "traceoff_on_warning", 622de7edd31SSteven Rostedt (Red Hat) .data = &__disable_trace_on_warning, 623de7edd31SSteven Rostedt (Red Hat) .maxlen = sizeof(__disable_trace_on_warning), 624de7edd31SSteven Rostedt (Red Hat) .mode = 0644, 625de7edd31SSteven Rostedt (Red Hat) .proc_handler = proc_dointvec, 626de7edd31SSteven Rostedt (Red Hat) }, 6270daa2302SSteven Rostedt (Red Hat) { 6280daa2302SSteven Rostedt (Red Hat) .procname = "tracepoint_printk", 6290daa2302SSteven Rostedt (Red Hat) .data = &tracepoint_printk, 6300daa2302SSteven Rostedt (Red Hat) .maxlen = sizeof(tracepoint_printk), 6310daa2302SSteven Rostedt (Red Hat) .mode = 0644, 6320daa2302SSteven Rostedt (Red Hat) .proc_handler = proc_dointvec, 6330daa2302SSteven Rostedt (Red Hat) }, 634944ac425SSteven Rostedt #endif 6357984754bSKees Cook #ifdef CONFIG_KEXEC 6367984754bSKees Cook { 6377984754bSKees Cook .procname = "kexec_load_disabled", 6387984754bSKees Cook .data = &kexec_load_disabled, 6397984754bSKees Cook .maxlen = sizeof(int), 6407984754bSKees Cook .mode = 0644, 6417984754bSKees Cook /* only handle a transition from default "0" to "1" */ 6427984754bSKees Cook .proc_handler = proc_dointvec_minmax, 6437984754bSKees Cook .extra1 = &one, 6447984754bSKees Cook .extra2 = &one, 6457984754bSKees Cook }, 6467984754bSKees Cook #endif 647a1ef5adbSJohannes Berg #ifdef CONFIG_MODULES 6481da177e4SLinus Torvalds { 6491da177e4SLinus Torvalds .procname = "modprobe", 6501da177e4SLinus Torvalds .data = &modprobe_path, 6511da177e4SLinus Torvalds .maxlen = KMOD_PATH_LEN, 6521da177e4SLinus Torvalds .mode = 0644, 6536d456111SEric W. Biederman .proc_handler = proc_dostring, 6541da177e4SLinus Torvalds }, 6553d43321bSKees Cook { 6563d43321bSKees Cook .procname = "modules_disabled", 6573d43321bSKees Cook .data = &modules_disabled, 6583d43321bSKees Cook .maxlen = sizeof(int), 6593d43321bSKees Cook .mode = 0644, 6603d43321bSKees Cook /* only handle a transition from default "0" to "1" */ 6616d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 6623d43321bSKees Cook .extra1 = &one, 6633d43321bSKees Cook .extra2 = &one, 6643d43321bSKees Cook }, 6651da177e4SLinus Torvalds #endif 66686d56134SMichael Marineau #ifdef CONFIG_UEVENT_HELPER 6671da177e4SLinus Torvalds { 6681da177e4SLinus Torvalds .procname = "hotplug", 669312c004dSKay Sievers .data = &uevent_helper, 670312c004dSKay Sievers .maxlen = UEVENT_HELPER_PATH_LEN, 6711da177e4SLinus Torvalds .mode = 0644, 6726d456111SEric W. Biederman .proc_handler = proc_dostring, 6731da177e4SLinus Torvalds }, 67486d56134SMichael Marineau #endif 6751da177e4SLinus Torvalds #ifdef CONFIG_CHR_DEV_SG 6761da177e4SLinus Torvalds { 6771da177e4SLinus Torvalds .procname = "sg-big-buff", 6781da177e4SLinus Torvalds .data = &sg_big_buff, 6791da177e4SLinus Torvalds .maxlen = sizeof (int), 6801da177e4SLinus Torvalds .mode = 0444, 6816d456111SEric W. Biederman .proc_handler = proc_dointvec, 6821da177e4SLinus Torvalds }, 6831da177e4SLinus Torvalds #endif 6841da177e4SLinus Torvalds #ifdef CONFIG_BSD_PROCESS_ACCT 6851da177e4SLinus Torvalds { 6861da177e4SLinus Torvalds .procname = "acct", 6871da177e4SLinus Torvalds .data = &acct_parm, 6881da177e4SLinus Torvalds .maxlen = 3*sizeof(int), 6891da177e4SLinus Torvalds .mode = 0644, 6906d456111SEric W. Biederman .proc_handler = proc_dointvec, 6911da177e4SLinus Torvalds }, 6921da177e4SLinus Torvalds #endif 6931da177e4SLinus Torvalds #ifdef CONFIG_MAGIC_SYSRQ 6941da177e4SLinus Torvalds { 6951da177e4SLinus Torvalds .procname = "sysrq", 6965d6f647fSIngo Molnar .data = &__sysrq_enabled, 6971da177e4SLinus Torvalds .maxlen = sizeof (int), 6981da177e4SLinus Torvalds .mode = 0644, 69997f5f0cdSDmitry Torokhov .proc_handler = sysrq_sysctl_handler, 7001da177e4SLinus Torvalds }, 7011da177e4SLinus Torvalds #endif 702d6f8ff73SRandy Dunlap #ifdef CONFIG_PROC_SYSCTL 7031da177e4SLinus Torvalds { 7041da177e4SLinus Torvalds .procname = "cad_pid", 7059ec52099SCedric Le Goater .data = NULL, 7061da177e4SLinus Torvalds .maxlen = sizeof (int), 7071da177e4SLinus Torvalds .mode = 0600, 7086d456111SEric W. Biederman .proc_handler = proc_do_cad_pid, 7091da177e4SLinus Torvalds }, 710d6f8ff73SRandy Dunlap #endif 7111da177e4SLinus Torvalds { 7121da177e4SLinus Torvalds .procname = "threads-max", 7131da177e4SLinus Torvalds .data = &max_threads, 7141da177e4SLinus Torvalds .maxlen = sizeof(int), 7151da177e4SLinus Torvalds .mode = 0644, 7166d456111SEric W. Biederman .proc_handler = proc_dointvec, 7171da177e4SLinus Torvalds }, 7181da177e4SLinus Torvalds { 7191da177e4SLinus Torvalds .procname = "random", 7201da177e4SLinus Torvalds .mode = 0555, 7211da177e4SLinus Torvalds .child = random_table, 7221da177e4SLinus Torvalds }, 7231da177e4SLinus Torvalds { 72417f60a7dSEric Paris .procname = "usermodehelper", 72517f60a7dSEric Paris .mode = 0555, 72617f60a7dSEric Paris .child = usermodehelper_table, 72717f60a7dSEric Paris }, 72817f60a7dSEric Paris { 7291da177e4SLinus Torvalds .procname = "overflowuid", 7301da177e4SLinus Torvalds .data = &overflowuid, 7311da177e4SLinus Torvalds .maxlen = sizeof(int), 7321da177e4SLinus Torvalds .mode = 0644, 7336d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 7341da177e4SLinus Torvalds .extra1 = &minolduid, 7351da177e4SLinus Torvalds .extra2 = &maxolduid, 7361da177e4SLinus Torvalds }, 7371da177e4SLinus Torvalds { 7381da177e4SLinus Torvalds .procname = "overflowgid", 7391da177e4SLinus Torvalds .data = &overflowgid, 7401da177e4SLinus Torvalds .maxlen = sizeof(int), 7411da177e4SLinus Torvalds .mode = 0644, 7426d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 7431da177e4SLinus Torvalds .extra1 = &minolduid, 7441da177e4SLinus Torvalds .extra2 = &maxolduid, 7451da177e4SLinus Torvalds }, 746347a8dc3SMartin Schwidefsky #ifdef CONFIG_S390 7471da177e4SLinus Torvalds #ifdef CONFIG_MATHEMU 7481da177e4SLinus Torvalds { 7491da177e4SLinus Torvalds .procname = "ieee_emulation_warnings", 7501da177e4SLinus Torvalds .data = &sysctl_ieee_emulation_warnings, 7511da177e4SLinus Torvalds .maxlen = sizeof(int), 7521da177e4SLinus Torvalds .mode = 0644, 7536d456111SEric W. Biederman .proc_handler = proc_dointvec, 7541da177e4SLinus Torvalds }, 7551da177e4SLinus Torvalds #endif 7561da177e4SLinus Torvalds { 7571da177e4SLinus Torvalds .procname = "userprocess_debug", 758ab3c68eeSHeiko Carstens .data = &show_unhandled_signals, 7591da177e4SLinus Torvalds .maxlen = sizeof(int), 7601da177e4SLinus Torvalds .mode = 0644, 7616d456111SEric W. Biederman .proc_handler = proc_dointvec, 7621da177e4SLinus Torvalds }, 7631da177e4SLinus Torvalds #endif 7641da177e4SLinus Torvalds { 7651da177e4SLinus Torvalds .procname = "pid_max", 7661da177e4SLinus Torvalds .data = &pid_max, 7671da177e4SLinus Torvalds .maxlen = sizeof (int), 7681da177e4SLinus Torvalds .mode = 0644, 7696d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 7701da177e4SLinus Torvalds .extra1 = &pid_max_min, 7711da177e4SLinus Torvalds .extra2 = &pid_max_max, 7721da177e4SLinus Torvalds }, 7731da177e4SLinus Torvalds { 7741da177e4SLinus Torvalds .procname = "panic_on_oops", 7751da177e4SLinus Torvalds .data = &panic_on_oops, 7761da177e4SLinus Torvalds .maxlen = sizeof(int), 7771da177e4SLinus Torvalds .mode = 0644, 7786d456111SEric W. Biederman .proc_handler = proc_dointvec, 7791da177e4SLinus Torvalds }, 7807ef3d2fdSJoe Perches #if defined CONFIG_PRINTK 7817ef3d2fdSJoe Perches { 7827ef3d2fdSJoe Perches .procname = "printk", 7837ef3d2fdSJoe Perches .data = &console_loglevel, 7847ef3d2fdSJoe Perches .maxlen = 4*sizeof(int), 7857ef3d2fdSJoe Perches .mode = 0644, 7866d456111SEric W. Biederman .proc_handler = proc_dointvec, 7877ef3d2fdSJoe Perches }, 7881da177e4SLinus Torvalds { 7891da177e4SLinus Torvalds .procname = "printk_ratelimit", 790717115e1SDave Young .data = &printk_ratelimit_state.interval, 7911da177e4SLinus Torvalds .maxlen = sizeof(int), 7921da177e4SLinus Torvalds .mode = 0644, 7936d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 7941da177e4SLinus Torvalds }, 7951da177e4SLinus Torvalds { 7961da177e4SLinus Torvalds .procname = "printk_ratelimit_burst", 797717115e1SDave Young .data = &printk_ratelimit_state.burst, 7981da177e4SLinus Torvalds .maxlen = sizeof(int), 7991da177e4SLinus Torvalds .mode = 0644, 8006d456111SEric W. Biederman .proc_handler = proc_dointvec, 8011da177e4SLinus Torvalds }, 802af91322eSDave Young { 803af91322eSDave Young .procname = "printk_delay", 804af91322eSDave Young .data = &printk_delay_msec, 805af91322eSDave Young .maxlen = sizeof(int), 806af91322eSDave Young .mode = 0644, 8076d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 808af91322eSDave Young .extra1 = &zero, 809af91322eSDave Young .extra2 = &ten_thousand, 810af91322eSDave Young }, 8111da177e4SLinus Torvalds { 812eaf06b24SDan Rosenberg .procname = "dmesg_restrict", 813eaf06b24SDan Rosenberg .data = &dmesg_restrict, 814eaf06b24SDan Rosenberg .maxlen = sizeof(int), 815eaf06b24SDan Rosenberg .mode = 0644, 816620f6e8eSKees Cook .proc_handler = proc_dointvec_minmax_sysadmin, 817eaf06b24SDan Rosenberg .extra1 = &zero, 818eaf06b24SDan Rosenberg .extra2 = &one, 819eaf06b24SDan Rosenberg }, 820455cd5abSDan Rosenberg { 821455cd5abSDan Rosenberg .procname = "kptr_restrict", 822455cd5abSDan Rosenberg .data = &kptr_restrict, 823455cd5abSDan Rosenberg .maxlen = sizeof(int), 824455cd5abSDan Rosenberg .mode = 0644, 825620f6e8eSKees Cook .proc_handler = proc_dointvec_minmax_sysadmin, 826455cd5abSDan Rosenberg .extra1 = &zero, 827455cd5abSDan Rosenberg .extra2 = &two, 828455cd5abSDan Rosenberg }, 829df6e61d4SJoe Perches #endif 830eaf06b24SDan Rosenberg { 8311da177e4SLinus Torvalds .procname = "ngroups_max", 8321da177e4SLinus Torvalds .data = &ngroups_max, 8331da177e4SLinus Torvalds .maxlen = sizeof (int), 8341da177e4SLinus Torvalds .mode = 0444, 8356d456111SEric W. Biederman .proc_handler = proc_dointvec, 8361da177e4SLinus Torvalds }, 83773efc039SDan Ballard { 83873efc039SDan Ballard .procname = "cap_last_cap", 83973efc039SDan Ballard .data = (void *)&cap_last_cap, 84073efc039SDan Ballard .maxlen = sizeof(int), 84173efc039SDan Ballard .mode = 0444, 84273efc039SDan Ballard .proc_handler = proc_dointvec, 84373efc039SDan Ballard }, 84458687acbSDon Zickus #if defined(CONFIG_LOCKUP_DETECTOR) 845504d7cf1SDon Zickus { 84658687acbSDon Zickus .procname = "watchdog", 8473c00ea82SFrederic Weisbecker .data = &watchdog_user_enabled, 848504d7cf1SDon Zickus .maxlen = sizeof (int), 849504d7cf1SDon Zickus .mode = 0644, 850586692a5SMandeep Singh Baines .proc_handler = proc_dowatchdog, 851586692a5SMandeep Singh Baines .extra1 = &zero, 852586692a5SMandeep Singh Baines .extra2 = &one, 85358687acbSDon Zickus }, 85458687acbSDon Zickus { 85558687acbSDon Zickus .procname = "watchdog_thresh", 856586692a5SMandeep Singh Baines .data = &watchdog_thresh, 85758687acbSDon Zickus .maxlen = sizeof(int), 85858687acbSDon Zickus .mode = 0644, 859586692a5SMandeep Singh Baines .proc_handler = proc_dowatchdog, 860a6572f84SLi Zefan .extra1 = &zero, 86158687acbSDon Zickus .extra2 = &sixty, 862504d7cf1SDon Zickus }, 8632508ce18SDon Zickus { 8642508ce18SDon Zickus .procname = "softlockup_panic", 8652508ce18SDon Zickus .data = &softlockup_panic, 8662508ce18SDon Zickus .maxlen = sizeof(int), 8672508ce18SDon Zickus .mode = 0644, 8682508ce18SDon Zickus .proc_handler = proc_dointvec_minmax, 8692508ce18SDon Zickus .extra1 = &zero, 8702508ce18SDon Zickus .extra2 = &one, 8712508ce18SDon Zickus }, 872ed235875SAaron Tomlin #ifdef CONFIG_SMP 873ed235875SAaron Tomlin { 874ed235875SAaron Tomlin .procname = "softlockup_all_cpu_backtrace", 875ed235875SAaron Tomlin .data = &sysctl_softlockup_all_cpu_backtrace, 876ed235875SAaron Tomlin .maxlen = sizeof(int), 877ed235875SAaron Tomlin .mode = 0644, 878ed235875SAaron Tomlin .proc_handler = proc_dointvec_minmax, 879ed235875SAaron Tomlin .extra1 = &zero, 880ed235875SAaron Tomlin .extra2 = &one, 881ed235875SAaron Tomlin }, 882ed235875SAaron Tomlin #endif /* CONFIG_SMP */ 8835dc30558SDon Zickus { 8845dc30558SDon Zickus .procname = "nmi_watchdog", 8853c00ea82SFrederic Weisbecker .data = &watchdog_user_enabled, 8865dc30558SDon Zickus .maxlen = sizeof (int), 8875dc30558SDon Zickus .mode = 0644, 888586692a5SMandeep Singh Baines .proc_handler = proc_dowatchdog, 889586692a5SMandeep Singh Baines .extra1 = &zero, 890586692a5SMandeep Singh Baines .extra2 = &one, 8915dc30558SDon Zickus }, 8925dc30558SDon Zickus #endif 8935dc30558SDon Zickus #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) 8945dc30558SDon Zickus { 8955dc30558SDon Zickus .procname = "unknown_nmi_panic", 8965dc30558SDon Zickus .data = &unknown_nmi_panic, 8975dc30558SDon Zickus .maxlen = sizeof (int), 8985dc30558SDon Zickus .mode = 0644, 8995dc30558SDon Zickus .proc_handler = proc_dointvec, 9005dc30558SDon Zickus }, 901504d7cf1SDon Zickus #endif 9021da177e4SLinus Torvalds #if defined(CONFIG_X86) 9031da177e4SLinus Torvalds { 9048da5addaSDon Zickus .procname = "panic_on_unrecovered_nmi", 9058da5addaSDon Zickus .data = &panic_on_unrecovered_nmi, 9068da5addaSDon Zickus .maxlen = sizeof(int), 9078da5addaSDon Zickus .mode = 0644, 9086d456111SEric W. Biederman .proc_handler = proc_dointvec, 9098da5addaSDon Zickus }, 9108da5addaSDon Zickus { 9115211a242SKurt Garloff .procname = "panic_on_io_nmi", 9125211a242SKurt Garloff .data = &panic_on_io_nmi, 9135211a242SKurt Garloff .maxlen = sizeof(int), 9145211a242SKurt Garloff .mode = 0644, 9156d456111SEric W. Biederman .proc_handler = proc_dointvec, 9165211a242SKurt Garloff }, 91755af7796SMitsuo Hayasaka #ifdef CONFIG_DEBUG_STACKOVERFLOW 91855af7796SMitsuo Hayasaka { 91955af7796SMitsuo Hayasaka .procname = "panic_on_stackoverflow", 92055af7796SMitsuo Hayasaka .data = &sysctl_panic_on_stackoverflow, 92155af7796SMitsuo Hayasaka .maxlen = sizeof(int), 92255af7796SMitsuo Hayasaka .mode = 0644, 92355af7796SMitsuo Hayasaka .proc_handler = proc_dointvec, 92455af7796SMitsuo Hayasaka }, 92555af7796SMitsuo Hayasaka #endif 9265211a242SKurt Garloff { 9271da177e4SLinus Torvalds .procname = "bootloader_type", 9281da177e4SLinus Torvalds .data = &bootloader_type, 9291da177e4SLinus Torvalds .maxlen = sizeof (int), 9301da177e4SLinus Torvalds .mode = 0444, 9316d456111SEric W. Biederman .proc_handler = proc_dointvec, 9321da177e4SLinus Torvalds }, 9330741f4d2SChuck Ebbert { 9345031296cSH. Peter Anvin .procname = "bootloader_version", 9355031296cSH. Peter Anvin .data = &bootloader_version, 9365031296cSH. Peter Anvin .maxlen = sizeof (int), 9375031296cSH. Peter Anvin .mode = 0444, 9386d456111SEric W. Biederman .proc_handler = proc_dointvec, 9395031296cSH. Peter Anvin }, 9405031296cSH. Peter Anvin { 9410741f4d2SChuck Ebbert .procname = "kstack_depth_to_print", 9420741f4d2SChuck Ebbert .data = &kstack_depth_to_print, 9430741f4d2SChuck Ebbert .maxlen = sizeof(int), 9440741f4d2SChuck Ebbert .mode = 0644, 9456d456111SEric W. Biederman .proc_handler = proc_dointvec, 9460741f4d2SChuck Ebbert }, 9476e7c4025SIngo Molnar { 9486e7c4025SIngo Molnar .procname = "io_delay_type", 9496e7c4025SIngo Molnar .data = &io_delay_type, 9506e7c4025SIngo Molnar .maxlen = sizeof(int), 9516e7c4025SIngo Molnar .mode = 0644, 9526d456111SEric W. Biederman .proc_handler = proc_dointvec, 9536e7c4025SIngo Molnar }, 9541da177e4SLinus Torvalds #endif 9557a9166e3SLuke Yang #if defined(CONFIG_MMU) 9561da177e4SLinus Torvalds { 9571da177e4SLinus Torvalds .procname = "randomize_va_space", 9581da177e4SLinus Torvalds .data = &randomize_va_space, 9591da177e4SLinus Torvalds .maxlen = sizeof(int), 9601da177e4SLinus Torvalds .mode = 0644, 9616d456111SEric W. Biederman .proc_handler = proc_dointvec, 9621da177e4SLinus Torvalds }, 9637a9166e3SLuke Yang #endif 9640152fb37SMartin Schwidefsky #if defined(CONFIG_S390) && defined(CONFIG_SMP) 965951f22d5SMartin Schwidefsky { 966951f22d5SMartin Schwidefsky .procname = "spin_retry", 967951f22d5SMartin Schwidefsky .data = &spin_retry, 968951f22d5SMartin Schwidefsky .maxlen = sizeof (int), 969951f22d5SMartin Schwidefsky .mode = 0644, 9706d456111SEric W. Biederman .proc_handler = proc_dointvec, 971951f22d5SMartin Schwidefsky }, 972951f22d5SMartin Schwidefsky #endif 973673d5b43SLen Brown #if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86) 974c255d844SPavel Machek { 975c255d844SPavel Machek .procname = "acpi_video_flags", 97677afcf78SPavel Machek .data = &acpi_realmode_flags, 977c255d844SPavel Machek .maxlen = sizeof (unsigned long), 978c255d844SPavel Machek .mode = 0644, 9796d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 980c255d844SPavel Machek }, 981c255d844SPavel Machek #endif 982b6fca725SVineet Gupta #ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN 983d2b176edSJes Sorensen { 984d2b176edSJes Sorensen .procname = "ignore-unaligned-usertrap", 985d2b176edSJes Sorensen .data = &no_unaligned_warning, 986d2b176edSJes Sorensen .maxlen = sizeof (int), 987d2b176edSJes Sorensen .mode = 0644, 9886d456111SEric W. Biederman .proc_handler = proc_dointvec, 989d2b176edSJes Sorensen }, 990b6fca725SVineet Gupta #endif 991b6fca725SVineet Gupta #ifdef CONFIG_IA64 99288fc241fSDoug Chapman { 99388fc241fSDoug Chapman .procname = "unaligned-dump-stack", 99488fc241fSDoug Chapman .data = &unaligned_dump_stack, 99588fc241fSDoug Chapman .maxlen = sizeof (int), 99688fc241fSDoug Chapman .mode = 0644, 9976d456111SEric W. Biederman .proc_handler = proc_dointvec, 99888fc241fSDoug Chapman }, 999d2b176edSJes Sorensen #endif 1000e162b39aSMandeep Singh Baines #ifdef CONFIG_DETECT_HUNG_TASK 1001e162b39aSMandeep Singh Baines { 1002e162b39aSMandeep Singh Baines .procname = "hung_task_panic", 1003e162b39aSMandeep Singh Baines .data = &sysctl_hung_task_panic, 1004e162b39aSMandeep Singh Baines .maxlen = sizeof(int), 1005e162b39aSMandeep Singh Baines .mode = 0644, 10066d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1007e162b39aSMandeep Singh Baines .extra1 = &zero, 1008e162b39aSMandeep Singh Baines .extra2 = &one, 1009e162b39aSMandeep Singh Baines }, 101082a1fcb9SIngo Molnar { 101182a1fcb9SIngo Molnar .procname = "hung_task_check_count", 101282a1fcb9SIngo Molnar .data = &sysctl_hung_task_check_count, 1013cd64647fSLi Zefan .maxlen = sizeof(int), 101482a1fcb9SIngo Molnar .mode = 0644, 1015cd64647fSLi Zefan .proc_handler = proc_dointvec_minmax, 1016cd64647fSLi Zefan .extra1 = &zero, 101782a1fcb9SIngo Molnar }, 101882a1fcb9SIngo Molnar { 101982a1fcb9SIngo Molnar .procname = "hung_task_timeout_secs", 102082a1fcb9SIngo Molnar .data = &sysctl_hung_task_timeout_secs, 102190739081SIngo Molnar .maxlen = sizeof(unsigned long), 102282a1fcb9SIngo Molnar .mode = 0644, 10236d456111SEric W. Biederman .proc_handler = proc_dohung_task_timeout_secs, 102480df2847SLiu Hua .extra2 = &hung_task_timeout_max, 102582a1fcb9SIngo Molnar }, 102682a1fcb9SIngo Molnar { 102782a1fcb9SIngo Molnar .procname = "hung_task_warnings", 102882a1fcb9SIngo Molnar .data = &sysctl_hung_task_warnings, 1029270750dbSAaron Tomlin .maxlen = sizeof(int), 103082a1fcb9SIngo Molnar .mode = 0644, 1031270750dbSAaron Tomlin .proc_handler = proc_dointvec_minmax, 1032270750dbSAaron Tomlin .extra1 = &neg_one, 103382a1fcb9SIngo Molnar }, 1034c4f3b63fSRavikiran G Thirumalai #endif 1035bebfa101SAndi Kleen #ifdef CONFIG_COMPAT 1036bebfa101SAndi Kleen { 1037bebfa101SAndi Kleen .procname = "compat-log", 1038bebfa101SAndi Kleen .data = &compat_log, 1039bebfa101SAndi Kleen .maxlen = sizeof (int), 1040bebfa101SAndi Kleen .mode = 0644, 10416d456111SEric W. Biederman .proc_handler = proc_dointvec, 1042bebfa101SAndi Kleen }, 1043bebfa101SAndi Kleen #endif 104423f78d4aSIngo Molnar #ifdef CONFIG_RT_MUTEXES 104523f78d4aSIngo Molnar { 104623f78d4aSIngo Molnar .procname = "max_lock_depth", 104723f78d4aSIngo Molnar .data = &max_lock_depth, 104823f78d4aSIngo Molnar .maxlen = sizeof(int), 104923f78d4aSIngo Molnar .mode = 0644, 10506d456111SEric W. Biederman .proc_handler = proc_dointvec, 105123f78d4aSIngo Molnar }, 105223f78d4aSIngo Molnar #endif 105310a0a8d4SJeremy Fitzhardinge { 105410a0a8d4SJeremy Fitzhardinge .procname = "poweroff_cmd", 105510a0a8d4SJeremy Fitzhardinge .data = &poweroff_cmd, 105610a0a8d4SJeremy Fitzhardinge .maxlen = POWEROFF_CMD_PATH_LEN, 105710a0a8d4SJeremy Fitzhardinge .mode = 0644, 10586d456111SEric W. Biederman .proc_handler = proc_dostring, 105910a0a8d4SJeremy Fitzhardinge }, 10600b77f5bfSDavid Howells #ifdef CONFIG_KEYS 10610b77f5bfSDavid Howells { 10620b77f5bfSDavid Howells .procname = "keys", 10630b77f5bfSDavid Howells .mode = 0555, 10640b77f5bfSDavid Howells .child = key_sysctls, 10650b77f5bfSDavid Howells }, 10660b77f5bfSDavid Howells #endif 1067cdd6c482SIngo Molnar #ifdef CONFIG_PERF_EVENTS 1068aa4a2218SVince Weaver /* 1069aa4a2218SVince Weaver * User-space scripts rely on the existence of this file 1070aa4a2218SVince Weaver * as a feature check for perf_events being enabled. 1071aa4a2218SVince Weaver * 1072aa4a2218SVince Weaver * So it's an ABI, do not remove! 1073aa4a2218SVince Weaver */ 10741ccd1549SPeter Zijlstra { 1075cdd6c482SIngo Molnar .procname = "perf_event_paranoid", 1076cdd6c482SIngo Molnar .data = &sysctl_perf_event_paranoid, 1077cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_paranoid), 10781ccd1549SPeter Zijlstra .mode = 0644, 10796d456111SEric W. Biederman .proc_handler = proc_dointvec, 10801ccd1549SPeter Zijlstra }, 1081c5078f78SPeter Zijlstra { 1082cdd6c482SIngo Molnar .procname = "perf_event_mlock_kb", 1083cdd6c482SIngo Molnar .data = &sysctl_perf_event_mlock, 1084cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_mlock), 1085c5078f78SPeter Zijlstra .mode = 0644, 10866d456111SEric W. Biederman .proc_handler = proc_dointvec, 1087c5078f78SPeter Zijlstra }, 1088a78ac325SPeter Zijlstra { 1089cdd6c482SIngo Molnar .procname = "perf_event_max_sample_rate", 1090cdd6c482SIngo Molnar .data = &sysctl_perf_event_sample_rate, 1091cdd6c482SIngo Molnar .maxlen = sizeof(sysctl_perf_event_sample_rate), 1092a78ac325SPeter Zijlstra .mode = 0644, 1093163ec435SPeter Zijlstra .proc_handler = perf_proc_update_handler, 1094723478c8SKnut Petersen .extra1 = &one, 1095a78ac325SPeter Zijlstra }, 109614c63f17SDave Hansen { 109714c63f17SDave Hansen .procname = "perf_cpu_time_max_percent", 109814c63f17SDave Hansen .data = &sysctl_perf_cpu_time_max_percent, 109914c63f17SDave Hansen .maxlen = sizeof(sysctl_perf_cpu_time_max_percent), 110014c63f17SDave Hansen .mode = 0644, 110114c63f17SDave Hansen .proc_handler = perf_cpu_time_max_percent_handler, 110214c63f17SDave Hansen .extra1 = &zero, 110314c63f17SDave Hansen .extra2 = &one_hundred, 110414c63f17SDave Hansen }, 11051ccd1549SPeter Zijlstra #endif 1106dfec072eSVegard Nossum #ifdef CONFIG_KMEMCHECK 1107dfec072eSVegard Nossum { 1108dfec072eSVegard Nossum .procname = "kmemcheck", 1109dfec072eSVegard Nossum .data = &kmemcheck_enabled, 1110dfec072eSVegard Nossum .maxlen = sizeof(int), 1111dfec072eSVegard Nossum .mode = 0644, 11126d456111SEric W. Biederman .proc_handler = proc_dointvec, 1113dfec072eSVegard Nossum }, 1114dfec072eSVegard Nossum #endif 11159e3961a0SPrarit Bhargava { 11169e3961a0SPrarit Bhargava .procname = "panic_on_warn", 11179e3961a0SPrarit Bhargava .data = &panic_on_warn, 11189e3961a0SPrarit Bhargava .maxlen = sizeof(int), 11199e3961a0SPrarit Bhargava .mode = 0644, 11209e3961a0SPrarit Bhargava .proc_handler = proc_dointvec_minmax, 11219e3961a0SPrarit Bhargava .extra1 = &zero, 11229e3961a0SPrarit Bhargava .extra2 = &one, 11239e3961a0SPrarit Bhargava }, 11246fce56ecSEric W. Biederman { } 11251da177e4SLinus Torvalds }; 11261da177e4SLinus Torvalds 1127d8217f07SEric W. Biederman static struct ctl_table vm_table[] = { 11281da177e4SLinus Torvalds { 11291da177e4SLinus Torvalds .procname = "overcommit_memory", 11301da177e4SLinus Torvalds .data = &sysctl_overcommit_memory, 11311da177e4SLinus Torvalds .maxlen = sizeof(sysctl_overcommit_memory), 11321da177e4SLinus Torvalds .mode = 0644, 1133cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1134cb16e95fSPetr Holasek .extra1 = &zero, 1135cb16e95fSPetr Holasek .extra2 = &two, 11361da177e4SLinus Torvalds }, 11371da177e4SLinus Torvalds { 1138fadd8fbdSKAMEZAWA Hiroyuki .procname = "panic_on_oom", 1139fadd8fbdSKAMEZAWA Hiroyuki .data = &sysctl_panic_on_oom, 1140fadd8fbdSKAMEZAWA Hiroyuki .maxlen = sizeof(sysctl_panic_on_oom), 1141fadd8fbdSKAMEZAWA Hiroyuki .mode = 0644, 1142cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1143cb16e95fSPetr Holasek .extra1 = &zero, 1144cb16e95fSPetr Holasek .extra2 = &two, 1145fadd8fbdSKAMEZAWA Hiroyuki }, 1146fadd8fbdSKAMEZAWA Hiroyuki { 1147fe071d7eSDavid Rientjes .procname = "oom_kill_allocating_task", 1148fe071d7eSDavid Rientjes .data = &sysctl_oom_kill_allocating_task, 1149fe071d7eSDavid Rientjes .maxlen = sizeof(sysctl_oom_kill_allocating_task), 1150fe071d7eSDavid Rientjes .mode = 0644, 11516d456111SEric W. Biederman .proc_handler = proc_dointvec, 1152fe071d7eSDavid Rientjes }, 1153fe071d7eSDavid Rientjes { 1154fef1bdd6SDavid Rientjes .procname = "oom_dump_tasks", 1155fef1bdd6SDavid Rientjes .data = &sysctl_oom_dump_tasks, 1156fef1bdd6SDavid Rientjes .maxlen = sizeof(sysctl_oom_dump_tasks), 1157fef1bdd6SDavid Rientjes .mode = 0644, 11586d456111SEric W. Biederman .proc_handler = proc_dointvec, 1159fef1bdd6SDavid Rientjes }, 1160fef1bdd6SDavid Rientjes { 11611da177e4SLinus Torvalds .procname = "overcommit_ratio", 11621da177e4SLinus Torvalds .data = &sysctl_overcommit_ratio, 11631da177e4SLinus Torvalds .maxlen = sizeof(sysctl_overcommit_ratio), 11641da177e4SLinus Torvalds .mode = 0644, 116549f0ce5fSJerome Marchand .proc_handler = overcommit_ratio_handler, 116649f0ce5fSJerome Marchand }, 116749f0ce5fSJerome Marchand { 116849f0ce5fSJerome Marchand .procname = "overcommit_kbytes", 116949f0ce5fSJerome Marchand .data = &sysctl_overcommit_kbytes, 117049f0ce5fSJerome Marchand .maxlen = sizeof(sysctl_overcommit_kbytes), 117149f0ce5fSJerome Marchand .mode = 0644, 117249f0ce5fSJerome Marchand .proc_handler = overcommit_kbytes_handler, 11731da177e4SLinus Torvalds }, 11741da177e4SLinus Torvalds { 11751da177e4SLinus Torvalds .procname = "page-cluster", 11761da177e4SLinus Torvalds .data = &page_cluster, 11771da177e4SLinus Torvalds .maxlen = sizeof(int), 11781da177e4SLinus Torvalds .mode = 0644, 1179cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1180cb16e95fSPetr Holasek .extra1 = &zero, 11811da177e4SLinus Torvalds }, 11821da177e4SLinus Torvalds { 11831da177e4SLinus Torvalds .procname = "dirty_background_ratio", 11841da177e4SLinus Torvalds .data = &dirty_background_ratio, 11851da177e4SLinus Torvalds .maxlen = sizeof(dirty_background_ratio), 11861da177e4SLinus Torvalds .mode = 0644, 11876d456111SEric W. Biederman .proc_handler = dirty_background_ratio_handler, 11881da177e4SLinus Torvalds .extra1 = &zero, 11891da177e4SLinus Torvalds .extra2 = &one_hundred, 11901da177e4SLinus Torvalds }, 11911da177e4SLinus Torvalds { 11922da02997SDavid Rientjes .procname = "dirty_background_bytes", 11932da02997SDavid Rientjes .data = &dirty_background_bytes, 11942da02997SDavid Rientjes .maxlen = sizeof(dirty_background_bytes), 11952da02997SDavid Rientjes .mode = 0644, 11966d456111SEric W. Biederman .proc_handler = dirty_background_bytes_handler, 1197fc3501d4SSven Wegener .extra1 = &one_ul, 11982da02997SDavid Rientjes }, 11992da02997SDavid Rientjes { 12001da177e4SLinus Torvalds .procname = "dirty_ratio", 12011da177e4SLinus Torvalds .data = &vm_dirty_ratio, 12021da177e4SLinus Torvalds .maxlen = sizeof(vm_dirty_ratio), 12031da177e4SLinus Torvalds .mode = 0644, 12046d456111SEric W. Biederman .proc_handler = dirty_ratio_handler, 12051da177e4SLinus Torvalds .extra1 = &zero, 12061da177e4SLinus Torvalds .extra2 = &one_hundred, 12071da177e4SLinus Torvalds }, 12081da177e4SLinus Torvalds { 12092da02997SDavid Rientjes .procname = "dirty_bytes", 12102da02997SDavid Rientjes .data = &vm_dirty_bytes, 12112da02997SDavid Rientjes .maxlen = sizeof(vm_dirty_bytes), 12122da02997SDavid Rientjes .mode = 0644, 12136d456111SEric W. Biederman .proc_handler = dirty_bytes_handler, 12149e4a5bdaSAndrea Righi .extra1 = &dirty_bytes_min, 12152da02997SDavid Rientjes }, 12162da02997SDavid Rientjes { 12171da177e4SLinus Torvalds .procname = "dirty_writeback_centisecs", 1218f6ef9438SBart Samwel .data = &dirty_writeback_interval, 1219f6ef9438SBart Samwel .maxlen = sizeof(dirty_writeback_interval), 12201da177e4SLinus Torvalds .mode = 0644, 12216d456111SEric W. Biederman .proc_handler = dirty_writeback_centisecs_handler, 12221da177e4SLinus Torvalds }, 12231da177e4SLinus Torvalds { 12241da177e4SLinus Torvalds .procname = "dirty_expire_centisecs", 1225f6ef9438SBart Samwel .data = &dirty_expire_interval, 1226f6ef9438SBart Samwel .maxlen = sizeof(dirty_expire_interval), 12271da177e4SLinus Torvalds .mode = 0644, 1228cb16e95fSPetr Holasek .proc_handler = proc_dointvec_minmax, 1229cb16e95fSPetr Holasek .extra1 = &zero, 12301da177e4SLinus Torvalds }, 12311da177e4SLinus Torvalds { 12321da177e4SLinus Torvalds .procname = "nr_pdflush_threads", 12331da177e4SLinus Torvalds .mode = 0444 /* read-only */, 12343965c9aeSWanpeng Li .proc_handler = pdflush_proc_obsolete, 12351da177e4SLinus Torvalds }, 12361da177e4SLinus Torvalds { 12371da177e4SLinus Torvalds .procname = "swappiness", 12381da177e4SLinus Torvalds .data = &vm_swappiness, 12391da177e4SLinus Torvalds .maxlen = sizeof(vm_swappiness), 12401da177e4SLinus Torvalds .mode = 0644, 12416d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 12421da177e4SLinus Torvalds .extra1 = &zero, 12431da177e4SLinus Torvalds .extra2 = &one_hundred, 12441da177e4SLinus Torvalds }, 12451da177e4SLinus Torvalds #ifdef CONFIG_HUGETLB_PAGE 12461da177e4SLinus Torvalds { 12471da177e4SLinus Torvalds .procname = "nr_hugepages", 1248e5ff2159SAndi Kleen .data = NULL, 12491da177e4SLinus Torvalds .maxlen = sizeof(unsigned long), 12501da177e4SLinus Torvalds .mode = 0644, 12516d456111SEric W. Biederman .proc_handler = hugetlb_sysctl_handler, 12521da177e4SLinus Torvalds }, 125306808b08SLee Schermerhorn #ifdef CONFIG_NUMA 125406808b08SLee Schermerhorn { 125506808b08SLee Schermerhorn .procname = "nr_hugepages_mempolicy", 125606808b08SLee Schermerhorn .data = NULL, 125706808b08SLee Schermerhorn .maxlen = sizeof(unsigned long), 125806808b08SLee Schermerhorn .mode = 0644, 125906808b08SLee Schermerhorn .proc_handler = &hugetlb_mempolicy_sysctl_handler, 126006808b08SLee Schermerhorn }, 126106808b08SLee Schermerhorn #endif 12621da177e4SLinus Torvalds { 12631da177e4SLinus Torvalds .procname = "hugetlb_shm_group", 12641da177e4SLinus Torvalds .data = &sysctl_hugetlb_shm_group, 12651da177e4SLinus Torvalds .maxlen = sizeof(gid_t), 12661da177e4SLinus Torvalds .mode = 0644, 12676d456111SEric W. Biederman .proc_handler = proc_dointvec, 12681da177e4SLinus Torvalds }, 1269396faf03SMel Gorman { 1270396faf03SMel Gorman .procname = "hugepages_treat_as_movable", 1271396faf03SMel Gorman .data = &hugepages_treat_as_movable, 1272396faf03SMel Gorman .maxlen = sizeof(int), 1273396faf03SMel Gorman .mode = 0644, 127486cdb465SNaoya Horiguchi .proc_handler = proc_dointvec, 1275396faf03SMel Gorman }, 127654f9f80dSAdam Litke { 1277d1c3fb1fSNishanth Aravamudan .procname = "nr_overcommit_hugepages", 1278e5ff2159SAndi Kleen .data = NULL, 1279e5ff2159SAndi Kleen .maxlen = sizeof(unsigned long), 1280d1c3fb1fSNishanth Aravamudan .mode = 0644, 12816d456111SEric W. Biederman .proc_handler = hugetlb_overcommit_handler, 1282d1c3fb1fSNishanth Aravamudan }, 12831da177e4SLinus Torvalds #endif 12841da177e4SLinus Torvalds { 12851da177e4SLinus Torvalds .procname = "lowmem_reserve_ratio", 12861da177e4SLinus Torvalds .data = &sysctl_lowmem_reserve_ratio, 12871da177e4SLinus Torvalds .maxlen = sizeof(sysctl_lowmem_reserve_ratio), 12881da177e4SLinus Torvalds .mode = 0644, 12896d456111SEric W. Biederman .proc_handler = lowmem_reserve_ratio_sysctl_handler, 12901da177e4SLinus Torvalds }, 12911da177e4SLinus Torvalds { 12929d0243bcSAndrew Morton .procname = "drop_caches", 12939d0243bcSAndrew Morton .data = &sysctl_drop_caches, 12949d0243bcSAndrew Morton .maxlen = sizeof(int), 12959d0243bcSAndrew Morton .mode = 0644, 12969d0243bcSAndrew Morton .proc_handler = drop_caches_sysctl_handler, 1297cb16e95fSPetr Holasek .extra1 = &one, 12985509a5d2SDave Hansen .extra2 = &four, 12999d0243bcSAndrew Morton }, 130076ab0f53SMel Gorman #ifdef CONFIG_COMPACTION 130176ab0f53SMel Gorman { 130276ab0f53SMel Gorman .procname = "compact_memory", 130376ab0f53SMel Gorman .data = &sysctl_compact_memory, 130476ab0f53SMel Gorman .maxlen = sizeof(int), 130576ab0f53SMel Gorman .mode = 0200, 130676ab0f53SMel Gorman .proc_handler = sysctl_compaction_handler, 130776ab0f53SMel Gorman }, 13085e771905SMel Gorman { 13095e771905SMel Gorman .procname = "extfrag_threshold", 13105e771905SMel Gorman .data = &sysctl_extfrag_threshold, 13115e771905SMel Gorman .maxlen = sizeof(int), 13125e771905SMel Gorman .mode = 0644, 13135e771905SMel Gorman .proc_handler = sysctl_extfrag_handler, 13145e771905SMel Gorman .extra1 = &min_extfrag_threshold, 13155e771905SMel Gorman .extra2 = &max_extfrag_threshold, 13165e771905SMel Gorman }, 13175e771905SMel Gorman 131876ab0f53SMel Gorman #endif /* CONFIG_COMPACTION */ 13199d0243bcSAndrew Morton { 13201da177e4SLinus Torvalds .procname = "min_free_kbytes", 13211da177e4SLinus Torvalds .data = &min_free_kbytes, 13221da177e4SLinus Torvalds .maxlen = sizeof(min_free_kbytes), 13231da177e4SLinus Torvalds .mode = 0644, 13246d456111SEric W. Biederman .proc_handler = min_free_kbytes_sysctl_handler, 13251da177e4SLinus Torvalds .extra1 = &zero, 13261da177e4SLinus Torvalds }, 13278ad4b1fbSRohit Seth { 13288ad4b1fbSRohit Seth .procname = "percpu_pagelist_fraction", 13298ad4b1fbSRohit Seth .data = &percpu_pagelist_fraction, 13308ad4b1fbSRohit Seth .maxlen = sizeof(percpu_pagelist_fraction), 13318ad4b1fbSRohit Seth .mode = 0644, 13326d456111SEric W. Biederman .proc_handler = percpu_pagelist_fraction_sysctl_handler, 13337cd2b0a3SDavid Rientjes .extra1 = &zero, 13348ad4b1fbSRohit Seth }, 13351da177e4SLinus Torvalds #ifdef CONFIG_MMU 13361da177e4SLinus Torvalds { 13371da177e4SLinus Torvalds .procname = "max_map_count", 13381da177e4SLinus Torvalds .data = &sysctl_max_map_count, 13391da177e4SLinus Torvalds .maxlen = sizeof(sysctl_max_map_count), 13401da177e4SLinus Torvalds .mode = 0644, 13413e26120cSWANG Cong .proc_handler = proc_dointvec_minmax, 134270da2340SAmerigo Wang .extra1 = &zero, 13431da177e4SLinus Torvalds }, 1344dd8632a1SPaul Mundt #else 1345dd8632a1SPaul Mundt { 1346dd8632a1SPaul Mundt .procname = "nr_trim_pages", 1347dd8632a1SPaul Mundt .data = &sysctl_nr_trim_pages, 1348dd8632a1SPaul Mundt .maxlen = sizeof(sysctl_nr_trim_pages), 1349dd8632a1SPaul Mundt .mode = 0644, 13506d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1351dd8632a1SPaul Mundt .extra1 = &zero, 1352dd8632a1SPaul Mundt }, 13531da177e4SLinus Torvalds #endif 13541da177e4SLinus Torvalds { 13551da177e4SLinus Torvalds .procname = "laptop_mode", 13561da177e4SLinus Torvalds .data = &laptop_mode, 13571da177e4SLinus Torvalds .maxlen = sizeof(laptop_mode), 13581da177e4SLinus Torvalds .mode = 0644, 13596d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 13601da177e4SLinus Torvalds }, 13611da177e4SLinus Torvalds { 13621da177e4SLinus Torvalds .procname = "block_dump", 13631da177e4SLinus Torvalds .data = &block_dump, 13641da177e4SLinus Torvalds .maxlen = sizeof(block_dump), 13651da177e4SLinus Torvalds .mode = 0644, 13666d456111SEric W. Biederman .proc_handler = proc_dointvec, 13671da177e4SLinus Torvalds .extra1 = &zero, 13681da177e4SLinus Torvalds }, 13691da177e4SLinus Torvalds { 13701da177e4SLinus Torvalds .procname = "vfs_cache_pressure", 13711da177e4SLinus Torvalds .data = &sysctl_vfs_cache_pressure, 13721da177e4SLinus Torvalds .maxlen = sizeof(sysctl_vfs_cache_pressure), 13731da177e4SLinus Torvalds .mode = 0644, 13746d456111SEric W. Biederman .proc_handler = proc_dointvec, 13751da177e4SLinus Torvalds .extra1 = &zero, 13761da177e4SLinus Torvalds }, 13771da177e4SLinus Torvalds #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT 13781da177e4SLinus Torvalds { 13791da177e4SLinus Torvalds .procname = "legacy_va_layout", 13801da177e4SLinus Torvalds .data = &sysctl_legacy_va_layout, 13811da177e4SLinus Torvalds .maxlen = sizeof(sysctl_legacy_va_layout), 13821da177e4SLinus Torvalds .mode = 0644, 13836d456111SEric W. Biederman .proc_handler = proc_dointvec, 13841da177e4SLinus Torvalds .extra1 = &zero, 13851da177e4SLinus Torvalds }, 13861da177e4SLinus Torvalds #endif 13871743660bSChristoph Lameter #ifdef CONFIG_NUMA 13881743660bSChristoph Lameter { 13891743660bSChristoph Lameter .procname = "zone_reclaim_mode", 13901743660bSChristoph Lameter .data = &zone_reclaim_mode, 13911743660bSChristoph Lameter .maxlen = sizeof(zone_reclaim_mode), 13921743660bSChristoph Lameter .mode = 0644, 13936d456111SEric W. Biederman .proc_handler = proc_dointvec, 1394c84db23cSChristoph Lameter .extra1 = &zero, 13951743660bSChristoph Lameter }, 13969614634fSChristoph Lameter { 13979614634fSChristoph Lameter .procname = "min_unmapped_ratio", 13989614634fSChristoph Lameter .data = &sysctl_min_unmapped_ratio, 13999614634fSChristoph Lameter .maxlen = sizeof(sysctl_min_unmapped_ratio), 14009614634fSChristoph Lameter .mode = 0644, 14016d456111SEric W. Biederman .proc_handler = sysctl_min_unmapped_ratio_sysctl_handler, 14029614634fSChristoph Lameter .extra1 = &zero, 14039614634fSChristoph Lameter .extra2 = &one_hundred, 14049614634fSChristoph Lameter }, 14050ff38490SChristoph Lameter { 14060ff38490SChristoph Lameter .procname = "min_slab_ratio", 14070ff38490SChristoph Lameter .data = &sysctl_min_slab_ratio, 14080ff38490SChristoph Lameter .maxlen = sizeof(sysctl_min_slab_ratio), 14090ff38490SChristoph Lameter .mode = 0644, 14106d456111SEric W. Biederman .proc_handler = sysctl_min_slab_ratio_sysctl_handler, 14110ff38490SChristoph Lameter .extra1 = &zero, 14120ff38490SChristoph Lameter .extra2 = &one_hundred, 14130ff38490SChristoph Lameter }, 14141743660bSChristoph Lameter #endif 141577461ab3SChristoph Lameter #ifdef CONFIG_SMP 141677461ab3SChristoph Lameter { 141777461ab3SChristoph Lameter .procname = "stat_interval", 141877461ab3SChristoph Lameter .data = &sysctl_stat_interval, 141977461ab3SChristoph Lameter .maxlen = sizeof(sysctl_stat_interval), 142077461ab3SChristoph Lameter .mode = 0644, 14216d456111SEric W. Biederman .proc_handler = proc_dointvec_jiffies, 142277461ab3SChristoph Lameter }, 142377461ab3SChristoph Lameter #endif 14246e141546SDavid Howells #ifdef CONFIG_MMU 1425ed032189SEric Paris { 1426ed032189SEric Paris .procname = "mmap_min_addr", 1427788084abSEric Paris .data = &dac_mmap_min_addr, 1428ed032189SEric Paris .maxlen = sizeof(unsigned long), 1429ed032189SEric Paris .mode = 0644, 14306d456111SEric W. Biederman .proc_handler = mmap_min_addr_handler, 1431ed032189SEric Paris }, 14326e141546SDavid Howells #endif 1433f0c0b2b8SKAMEZAWA Hiroyuki #ifdef CONFIG_NUMA 1434f0c0b2b8SKAMEZAWA Hiroyuki { 1435f0c0b2b8SKAMEZAWA Hiroyuki .procname = "numa_zonelist_order", 1436f0c0b2b8SKAMEZAWA Hiroyuki .data = &numa_zonelist_order, 1437f0c0b2b8SKAMEZAWA Hiroyuki .maxlen = NUMA_ZONELIST_ORDER_LEN, 1438f0c0b2b8SKAMEZAWA Hiroyuki .mode = 0644, 14396d456111SEric W. Biederman .proc_handler = numa_zonelist_order_handler, 1440f0c0b2b8SKAMEZAWA Hiroyuki }, 1441f0c0b2b8SKAMEZAWA Hiroyuki #endif 14422b8232ceSAl Viro #if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \ 14435c36e657SPaul Mundt (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL)) 1444e6e5494cSIngo Molnar { 1445e6e5494cSIngo Molnar .procname = "vdso_enabled", 14463d7ee969SAndy Lutomirski #ifdef CONFIG_X86_32 14473d7ee969SAndy Lutomirski .data = &vdso32_enabled, 14483d7ee969SAndy Lutomirski .maxlen = sizeof(vdso32_enabled), 14493d7ee969SAndy Lutomirski #else 1450e6e5494cSIngo Molnar .data = &vdso_enabled, 1451e6e5494cSIngo Molnar .maxlen = sizeof(vdso_enabled), 14523d7ee969SAndy Lutomirski #endif 1453e6e5494cSIngo Molnar .mode = 0644, 14546d456111SEric W. Biederman .proc_handler = proc_dointvec, 1455e6e5494cSIngo Molnar .extra1 = &zero, 1456e6e5494cSIngo Molnar }, 1457e6e5494cSIngo Molnar #endif 1458195cf453SBron Gondwana #ifdef CONFIG_HIGHMEM 1459195cf453SBron Gondwana { 1460195cf453SBron Gondwana .procname = "highmem_is_dirtyable", 1461195cf453SBron Gondwana .data = &vm_highmem_is_dirtyable, 1462195cf453SBron Gondwana .maxlen = sizeof(vm_highmem_is_dirtyable), 1463195cf453SBron Gondwana .mode = 0644, 14646d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1465195cf453SBron Gondwana .extra1 = &zero, 1466195cf453SBron Gondwana .extra2 = &one, 1467195cf453SBron Gondwana }, 1468195cf453SBron Gondwana #endif 14696a46079cSAndi Kleen #ifdef CONFIG_MEMORY_FAILURE 14706a46079cSAndi Kleen { 14716a46079cSAndi Kleen .procname = "memory_failure_early_kill", 14726a46079cSAndi Kleen .data = &sysctl_memory_failure_early_kill, 14736a46079cSAndi Kleen .maxlen = sizeof(sysctl_memory_failure_early_kill), 14746a46079cSAndi Kleen .mode = 0644, 14756d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 14766a46079cSAndi Kleen .extra1 = &zero, 14776a46079cSAndi Kleen .extra2 = &one, 14786a46079cSAndi Kleen }, 14796a46079cSAndi Kleen { 14806a46079cSAndi Kleen .procname = "memory_failure_recovery", 14816a46079cSAndi Kleen .data = &sysctl_memory_failure_recovery, 14826a46079cSAndi Kleen .maxlen = sizeof(sysctl_memory_failure_recovery), 14836a46079cSAndi Kleen .mode = 0644, 14846d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 14856a46079cSAndi Kleen .extra1 = &zero, 14866a46079cSAndi Kleen .extra2 = &one, 14876a46079cSAndi Kleen }, 14886a46079cSAndi Kleen #endif 1489c9b1d098SAndrew Shewmaker { 1490c9b1d098SAndrew Shewmaker .procname = "user_reserve_kbytes", 1491c9b1d098SAndrew Shewmaker .data = &sysctl_user_reserve_kbytes, 1492c9b1d098SAndrew Shewmaker .maxlen = sizeof(sysctl_user_reserve_kbytes), 1493c9b1d098SAndrew Shewmaker .mode = 0644, 1494c9b1d098SAndrew Shewmaker .proc_handler = proc_doulongvec_minmax, 1495c9b1d098SAndrew Shewmaker }, 14964eeab4f5SAndrew Shewmaker { 14974eeab4f5SAndrew Shewmaker .procname = "admin_reserve_kbytes", 14984eeab4f5SAndrew Shewmaker .data = &sysctl_admin_reserve_kbytes, 14994eeab4f5SAndrew Shewmaker .maxlen = sizeof(sysctl_admin_reserve_kbytes), 15004eeab4f5SAndrew Shewmaker .mode = 0644, 15014eeab4f5SAndrew Shewmaker .proc_handler = proc_doulongvec_minmax, 15024eeab4f5SAndrew Shewmaker }, 15036fce56ecSEric W. Biederman { } 15041da177e4SLinus Torvalds }; 15051da177e4SLinus Torvalds 15062abc26fcSEric W. Biederman #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE) 1507d8217f07SEric W. Biederman static struct ctl_table binfmt_misc_table[] = { 15086fce56ecSEric W. Biederman { } 15092abc26fcSEric W. Biederman }; 15102abc26fcSEric W. Biederman #endif 15112abc26fcSEric W. Biederman 1512d8217f07SEric W. Biederman static struct ctl_table fs_table[] = { 15131da177e4SLinus Torvalds { 15141da177e4SLinus Torvalds .procname = "inode-nr", 15151da177e4SLinus Torvalds .data = &inodes_stat, 15163942c07cSGlauber Costa .maxlen = 2*sizeof(long), 15171da177e4SLinus Torvalds .mode = 0444, 1518cffbc8aaSDave Chinner .proc_handler = proc_nr_inodes, 15191da177e4SLinus Torvalds }, 15201da177e4SLinus Torvalds { 15211da177e4SLinus Torvalds .procname = "inode-state", 15221da177e4SLinus Torvalds .data = &inodes_stat, 15233942c07cSGlauber Costa .maxlen = 7*sizeof(long), 15241da177e4SLinus Torvalds .mode = 0444, 1525cffbc8aaSDave Chinner .proc_handler = proc_nr_inodes, 15261da177e4SLinus Torvalds }, 15271da177e4SLinus Torvalds { 15281da177e4SLinus Torvalds .procname = "file-nr", 15291da177e4SLinus Torvalds .data = &files_stat, 1530518de9b3SEric Dumazet .maxlen = sizeof(files_stat), 15311da177e4SLinus Torvalds .mode = 0444, 15326d456111SEric W. Biederman .proc_handler = proc_nr_files, 15331da177e4SLinus Torvalds }, 15341da177e4SLinus Torvalds { 15351da177e4SLinus Torvalds .procname = "file-max", 15361da177e4SLinus Torvalds .data = &files_stat.max_files, 1537518de9b3SEric Dumazet .maxlen = sizeof(files_stat.max_files), 15381da177e4SLinus Torvalds .mode = 0644, 1539518de9b3SEric Dumazet .proc_handler = proc_doulongvec_minmax, 15401da177e4SLinus Torvalds }, 15411da177e4SLinus Torvalds { 15429cfe015aSEric Dumazet .procname = "nr_open", 15439cfe015aSEric Dumazet .data = &sysctl_nr_open, 15449cfe015aSEric Dumazet .maxlen = sizeof(int), 15459cfe015aSEric Dumazet .mode = 0644, 15466d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 1547eceea0b3SAl Viro .extra1 = &sysctl_nr_open_min, 1548eceea0b3SAl Viro .extra2 = &sysctl_nr_open_max, 15499cfe015aSEric Dumazet }, 15509cfe015aSEric Dumazet { 15511da177e4SLinus Torvalds .procname = "dentry-state", 15521da177e4SLinus Torvalds .data = &dentry_stat, 15533942c07cSGlauber Costa .maxlen = 6*sizeof(long), 15541da177e4SLinus Torvalds .mode = 0444, 1555312d3ca8SChristoph Hellwig .proc_handler = proc_nr_dentry, 15561da177e4SLinus Torvalds }, 15571da177e4SLinus Torvalds { 15581da177e4SLinus Torvalds .procname = "overflowuid", 15591da177e4SLinus Torvalds .data = &fs_overflowuid, 15601da177e4SLinus Torvalds .maxlen = sizeof(int), 15611da177e4SLinus Torvalds .mode = 0644, 15626d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 15631da177e4SLinus Torvalds .extra1 = &minolduid, 15641da177e4SLinus Torvalds .extra2 = &maxolduid, 15651da177e4SLinus Torvalds }, 15661da177e4SLinus Torvalds { 15671da177e4SLinus Torvalds .procname = "overflowgid", 15681da177e4SLinus Torvalds .data = &fs_overflowgid, 15691da177e4SLinus Torvalds .maxlen = sizeof(int), 15701da177e4SLinus Torvalds .mode = 0644, 15716d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 15721da177e4SLinus Torvalds .extra1 = &minolduid, 15731da177e4SLinus Torvalds .extra2 = &maxolduid, 15741da177e4SLinus Torvalds }, 1575bfcd17a6SThomas Petazzoni #ifdef CONFIG_FILE_LOCKING 15761da177e4SLinus Torvalds { 15771da177e4SLinus Torvalds .procname = "leases-enable", 15781da177e4SLinus Torvalds .data = &leases_enable, 15791da177e4SLinus Torvalds .maxlen = sizeof(int), 15801da177e4SLinus Torvalds .mode = 0644, 15816d456111SEric W. Biederman .proc_handler = proc_dointvec, 15821da177e4SLinus Torvalds }, 1583bfcd17a6SThomas Petazzoni #endif 15841da177e4SLinus Torvalds #ifdef CONFIG_DNOTIFY 15851da177e4SLinus Torvalds { 15861da177e4SLinus Torvalds .procname = "dir-notify-enable", 15871da177e4SLinus Torvalds .data = &dir_notify_enable, 15881da177e4SLinus Torvalds .maxlen = sizeof(int), 15891da177e4SLinus Torvalds .mode = 0644, 15906d456111SEric W. Biederman .proc_handler = proc_dointvec, 15911da177e4SLinus Torvalds }, 15921da177e4SLinus Torvalds #endif 15931da177e4SLinus Torvalds #ifdef CONFIG_MMU 1594bfcd17a6SThomas Petazzoni #ifdef CONFIG_FILE_LOCKING 15951da177e4SLinus Torvalds { 15961da177e4SLinus Torvalds .procname = "lease-break-time", 15971da177e4SLinus Torvalds .data = &lease_break_time, 15981da177e4SLinus Torvalds .maxlen = sizeof(int), 15991da177e4SLinus Torvalds .mode = 0644, 16006d456111SEric W. Biederman .proc_handler = proc_dointvec, 16011da177e4SLinus Torvalds }, 1602bfcd17a6SThomas Petazzoni #endif 1603ebf3f09cSThomas Petazzoni #ifdef CONFIG_AIO 16041da177e4SLinus Torvalds { 16051da177e4SLinus Torvalds .procname = "aio-nr", 16061da177e4SLinus Torvalds .data = &aio_nr, 16071da177e4SLinus Torvalds .maxlen = sizeof(aio_nr), 16081da177e4SLinus Torvalds .mode = 0444, 16096d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 16101da177e4SLinus Torvalds }, 16111da177e4SLinus Torvalds { 16121da177e4SLinus Torvalds .procname = "aio-max-nr", 16131da177e4SLinus Torvalds .data = &aio_max_nr, 16141da177e4SLinus Torvalds .maxlen = sizeof(aio_max_nr), 16151da177e4SLinus Torvalds .mode = 0644, 16166d456111SEric W. Biederman .proc_handler = proc_doulongvec_minmax, 16171da177e4SLinus Torvalds }, 1618ebf3f09cSThomas Petazzoni #endif /* CONFIG_AIO */ 16192d9048e2SAmy Griffis #ifdef CONFIG_INOTIFY_USER 16200399cb08SRobert Love { 16210399cb08SRobert Love .procname = "inotify", 16220399cb08SRobert Love .mode = 0555, 16230399cb08SRobert Love .child = inotify_table, 16240399cb08SRobert Love }, 16250399cb08SRobert Love #endif 16267ef9964eSDavide Libenzi #ifdef CONFIG_EPOLL 16277ef9964eSDavide Libenzi { 16287ef9964eSDavide Libenzi .procname = "epoll", 16297ef9964eSDavide Libenzi .mode = 0555, 16307ef9964eSDavide Libenzi .child = epoll_table, 16317ef9964eSDavide Libenzi }, 16327ef9964eSDavide Libenzi #endif 16331da177e4SLinus Torvalds #endif 1634d6e71144SAlan Cox { 1635800179c9SKees Cook .procname = "protected_symlinks", 1636800179c9SKees Cook .data = &sysctl_protected_symlinks, 1637800179c9SKees Cook .maxlen = sizeof(int), 1638800179c9SKees Cook .mode = 0600, 1639800179c9SKees Cook .proc_handler = proc_dointvec_minmax, 1640800179c9SKees Cook .extra1 = &zero, 1641800179c9SKees Cook .extra2 = &one, 1642800179c9SKees Cook }, 1643800179c9SKees Cook { 1644800179c9SKees Cook .procname = "protected_hardlinks", 1645800179c9SKees Cook .data = &sysctl_protected_hardlinks, 1646800179c9SKees Cook .maxlen = sizeof(int), 1647800179c9SKees Cook .mode = 0600, 1648800179c9SKees Cook .proc_handler = proc_dointvec_minmax, 1649800179c9SKees Cook .extra1 = &zero, 1650800179c9SKees Cook .extra2 = &one, 1651800179c9SKees Cook }, 1652800179c9SKees Cook { 1653d6e71144SAlan Cox .procname = "suid_dumpable", 1654d6e71144SAlan Cox .data = &suid_dumpable, 1655d6e71144SAlan Cox .maxlen = sizeof(int), 1656d6e71144SAlan Cox .mode = 0644, 165754b50199SKees Cook .proc_handler = proc_dointvec_minmax_coredump, 16588e654fbaSMatthew Wilcox .extra1 = &zero, 16598e654fbaSMatthew Wilcox .extra2 = &two, 1660d6e71144SAlan Cox }, 16612abc26fcSEric W. Biederman #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE) 16622abc26fcSEric W. Biederman { 16632abc26fcSEric W. Biederman .procname = "binfmt_misc", 16642abc26fcSEric W. Biederman .mode = 0555, 16652abc26fcSEric W. Biederman .child = binfmt_misc_table, 16662abc26fcSEric W. Biederman }, 16672abc26fcSEric W. Biederman #endif 1668b492e95bSJens Axboe { 1669ff9da691SJens Axboe .procname = "pipe-max-size", 1670ff9da691SJens Axboe .data = &pipe_max_size, 1671b492e95bSJens Axboe .maxlen = sizeof(int), 1672b492e95bSJens Axboe .mode = 0644, 1673ff9da691SJens Axboe .proc_handler = &pipe_proc_fn, 1674ff9da691SJens Axboe .extra1 = &pipe_min_size, 1675b492e95bSJens Axboe }, 16766fce56ecSEric W. Biederman { } 16771da177e4SLinus Torvalds }; 16781da177e4SLinus Torvalds 1679d8217f07SEric W. Biederman static struct ctl_table debug_table[] = { 16807ac57a89SCatalin Marinas #ifdef CONFIG_SYSCTL_EXCEPTION_TRACE 1681abd4f750SMasoud Asgharifard Sharbiani { 1682abd4f750SMasoud Asgharifard Sharbiani .procname = "exception-trace", 1683abd4f750SMasoud Asgharifard Sharbiani .data = &show_unhandled_signals, 1684abd4f750SMasoud Asgharifard Sharbiani .maxlen = sizeof(int), 1685abd4f750SMasoud Asgharifard Sharbiani .mode = 0644, 1686abd4f750SMasoud Asgharifard Sharbiani .proc_handler = proc_dointvec 1687abd4f750SMasoud Asgharifard Sharbiani }, 1688abd4f750SMasoud Asgharifard Sharbiani #endif 1689b2be84dfSMasami Hiramatsu #if defined(CONFIG_OPTPROBES) 1690b2be84dfSMasami Hiramatsu { 1691b2be84dfSMasami Hiramatsu .procname = "kprobes-optimization", 1692b2be84dfSMasami Hiramatsu .data = &sysctl_kprobes_optimization, 1693b2be84dfSMasami Hiramatsu .maxlen = sizeof(int), 1694b2be84dfSMasami Hiramatsu .mode = 0644, 1695b2be84dfSMasami Hiramatsu .proc_handler = proc_kprobes_optimization_handler, 1696b2be84dfSMasami Hiramatsu .extra1 = &zero, 1697b2be84dfSMasami Hiramatsu .extra2 = &one, 1698b2be84dfSMasami Hiramatsu }, 1699b2be84dfSMasami Hiramatsu #endif 17006fce56ecSEric W. Biederman { } 17011da177e4SLinus Torvalds }; 17021da177e4SLinus Torvalds 1703d8217f07SEric W. Biederman static struct ctl_table dev_table[] = { 17046fce56ecSEric W. Biederman { } 17051da177e4SLinus Torvalds }; 17061da177e4SLinus Torvalds 1707de4e83bdSEric W. Biederman int __init sysctl_init(void) 1708330d57fbSAl Viro { 1709fd4b616bSSteven Rostedt struct ctl_table_header *hdr; 1710fd4b616bSSteven Rostedt 1711fd4b616bSSteven Rostedt hdr = register_sysctl_table(sysctl_base_table); 1712fd4b616bSSteven Rostedt kmemleak_not_leak(hdr); 1713330d57fbSAl Viro return 0; 1714f7e6ced4SAl Viro } 1715f7e6ced4SAl Viro 1716b89a8171SEric W. Biederman #endif /* CONFIG_SYSCTL */ 1717b89a8171SEric W. Biederman 17181da177e4SLinus Torvalds /* 17191da177e4SLinus Torvalds * /proc/sys support 17201da177e4SLinus Torvalds */ 17211da177e4SLinus Torvalds 1722b89a8171SEric W. Biederman #ifdef CONFIG_PROC_SYSCTL 17231da177e4SLinus Torvalds 1724f8808300SKees Cook static int _proc_do_string(char *data, int maxlen, int write, 1725f8808300SKees Cook char __user *buffer, 1726b1ba4dddSAdrian Bunk size_t *lenp, loff_t *ppos) 1727f5dd3d6fSSam Vilain { 1728f5dd3d6fSSam Vilain size_t len; 1729f5dd3d6fSSam Vilain char __user *p; 1730f5dd3d6fSSam Vilain char c; 1731f5dd3d6fSSam Vilain 17328d060877SOleg Nesterov if (!data || !maxlen || !*lenp) { 1733f5dd3d6fSSam Vilain *lenp = 0; 1734f5dd3d6fSSam Vilain return 0; 1735f5dd3d6fSSam Vilain } 1736f5dd3d6fSSam Vilain 1737f5dd3d6fSSam Vilain if (write) { 1738f4aacea2SKees Cook if (sysctl_writes_strict == SYSCTL_WRITES_STRICT) { 1739f4aacea2SKees Cook /* Only continue writes not past the end of buffer. */ 1740f4aacea2SKees Cook len = strlen(data); 1741f4aacea2SKees Cook if (len > maxlen - 1) 1742f4aacea2SKees Cook len = maxlen - 1; 1743f4aacea2SKees Cook 1744f4aacea2SKees Cook if (*ppos > len) 1745f4aacea2SKees Cook return 0; 1746f4aacea2SKees Cook len = *ppos; 1747f4aacea2SKees Cook } else { 17482ca9bb45SKees Cook /* Start writing from beginning of buffer. */ 1749f5dd3d6fSSam Vilain len = 0; 1750f4aacea2SKees Cook } 1751f4aacea2SKees Cook 17522ca9bb45SKees Cook *ppos += *lenp; 1753f5dd3d6fSSam Vilain p = buffer; 17542ca9bb45SKees Cook while ((p - buffer) < *lenp && len < maxlen - 1) { 1755f5dd3d6fSSam Vilain if (get_user(c, p++)) 1756f5dd3d6fSSam Vilain return -EFAULT; 1757f5dd3d6fSSam Vilain if (c == 0 || c == '\n') 1758f5dd3d6fSSam Vilain break; 17592ca9bb45SKees Cook data[len++] = c; 1760f5dd3d6fSSam Vilain } 1761f8808300SKees Cook data[len] = 0; 1762f5dd3d6fSSam Vilain } else { 1763f5dd3d6fSSam Vilain len = strlen(data); 1764f5dd3d6fSSam Vilain if (len > maxlen) 1765f5dd3d6fSSam Vilain len = maxlen; 17668d060877SOleg Nesterov 17678d060877SOleg Nesterov if (*ppos > len) { 17688d060877SOleg Nesterov *lenp = 0; 17698d060877SOleg Nesterov return 0; 17708d060877SOleg Nesterov } 17718d060877SOleg Nesterov 17728d060877SOleg Nesterov data += *ppos; 17738d060877SOleg Nesterov len -= *ppos; 17748d060877SOleg Nesterov 1775f5dd3d6fSSam Vilain if (len > *lenp) 1776f5dd3d6fSSam Vilain len = *lenp; 1777f5dd3d6fSSam Vilain if (len) 1778f5dd3d6fSSam Vilain if (copy_to_user(buffer, data, len)) 1779f5dd3d6fSSam Vilain return -EFAULT; 1780f5dd3d6fSSam Vilain if (len < *lenp) { 1781f8808300SKees Cook if (put_user('\n', buffer + len)) 1782f5dd3d6fSSam Vilain return -EFAULT; 1783f5dd3d6fSSam Vilain len++; 1784f5dd3d6fSSam Vilain } 1785f5dd3d6fSSam Vilain *lenp = len; 1786f5dd3d6fSSam Vilain *ppos += len; 1787f5dd3d6fSSam Vilain } 1788f5dd3d6fSSam Vilain return 0; 1789f5dd3d6fSSam Vilain } 1790f5dd3d6fSSam Vilain 1791f4aacea2SKees Cook static void warn_sysctl_write(struct ctl_table *table) 1792f4aacea2SKees Cook { 1793f4aacea2SKees Cook pr_warn_once("%s wrote to %s when file position was not 0!\n" 1794f4aacea2SKees Cook "This will not be supported in the future. To silence this\n" 1795f4aacea2SKees Cook "warning, set kernel.sysctl_writes_strict = -1\n", 1796f4aacea2SKees Cook current->comm, table->procname); 1797f4aacea2SKees Cook } 1798f4aacea2SKees Cook 17991da177e4SLinus Torvalds /** 18001da177e4SLinus Torvalds * proc_dostring - read a string sysctl 18011da177e4SLinus Torvalds * @table: the sysctl table 18021da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 18031da177e4SLinus Torvalds * @buffer: the user buffer 18041da177e4SLinus Torvalds * @lenp: the size of the user buffer 18051da177e4SLinus Torvalds * @ppos: file position 18061da177e4SLinus Torvalds * 18071da177e4SLinus Torvalds * Reads/writes a string from/to the user buffer. If the kernel 18081da177e4SLinus Torvalds * buffer provided is not large enough to hold the string, the 18091da177e4SLinus Torvalds * string is truncated. The copied string is %NULL-terminated. 18101da177e4SLinus Torvalds * If the string is being read by the user process, it is copied 18111da177e4SLinus Torvalds * and a newline '\n' is added. It is truncated if the buffer is 18121da177e4SLinus Torvalds * not large enough. 18131da177e4SLinus Torvalds * 18141da177e4SLinus Torvalds * Returns 0 on success. 18151da177e4SLinus Torvalds */ 18168d65af78SAlexey Dobriyan int proc_dostring(struct ctl_table *table, int write, 18171da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 18181da177e4SLinus Torvalds { 1819f4aacea2SKees Cook if (write && *ppos && sysctl_writes_strict == SYSCTL_WRITES_WARN) 1820f4aacea2SKees Cook warn_sysctl_write(table); 1821f4aacea2SKees Cook 1822f8808300SKees Cook return _proc_do_string((char *)(table->data), table->maxlen, write, 1823f8808300SKees Cook (char __user *)buffer, lenp, ppos); 18241da177e4SLinus Torvalds } 18251da177e4SLinus Torvalds 182600b7c339SAmerigo Wang static size_t proc_skip_spaces(char **buf) 182700b7c339SAmerigo Wang { 182800b7c339SAmerigo Wang size_t ret; 182900b7c339SAmerigo Wang char *tmp = skip_spaces(*buf); 183000b7c339SAmerigo Wang ret = tmp - *buf; 183100b7c339SAmerigo Wang *buf = tmp; 183200b7c339SAmerigo Wang return ret; 183300b7c339SAmerigo Wang } 18341da177e4SLinus Torvalds 18359f977fb7SOctavian Purdila static void proc_skip_char(char **buf, size_t *size, const char v) 18369f977fb7SOctavian Purdila { 18379f977fb7SOctavian Purdila while (*size) { 18389f977fb7SOctavian Purdila if (**buf != v) 18399f977fb7SOctavian Purdila break; 18409f977fb7SOctavian Purdila (*size)--; 18419f977fb7SOctavian Purdila (*buf)++; 18429f977fb7SOctavian Purdila } 18439f977fb7SOctavian Purdila } 18449f977fb7SOctavian Purdila 184500b7c339SAmerigo Wang #define TMPBUFLEN 22 184600b7c339SAmerigo Wang /** 18470fc377bdSRandy Dunlap * proc_get_long - reads an ASCII formatted integer from a user buffer 184800b7c339SAmerigo Wang * 18490fc377bdSRandy Dunlap * @buf: a kernel buffer 18500fc377bdSRandy Dunlap * @size: size of the kernel buffer 18510fc377bdSRandy Dunlap * @val: this is where the number will be stored 18520fc377bdSRandy Dunlap * @neg: set to %TRUE if number is negative 18530fc377bdSRandy Dunlap * @perm_tr: a vector which contains the allowed trailers 18540fc377bdSRandy Dunlap * @perm_tr_len: size of the perm_tr vector 18550fc377bdSRandy Dunlap * @tr: pointer to store the trailer character 185600b7c339SAmerigo Wang * 18570fc377bdSRandy Dunlap * In case of success %0 is returned and @buf and @size are updated with 18580fc377bdSRandy Dunlap * the amount of bytes read. If @tr is non-NULL and a trailing 18590fc377bdSRandy Dunlap * character exists (size is non-zero after returning from this 18600fc377bdSRandy Dunlap * function), @tr is updated with the trailing character. 186100b7c339SAmerigo Wang */ 186200b7c339SAmerigo Wang static int proc_get_long(char **buf, size_t *size, 186300b7c339SAmerigo Wang unsigned long *val, bool *neg, 186400b7c339SAmerigo Wang const char *perm_tr, unsigned perm_tr_len, char *tr) 186500b7c339SAmerigo Wang { 186600b7c339SAmerigo Wang int len; 186700b7c339SAmerigo Wang char *p, tmp[TMPBUFLEN]; 186800b7c339SAmerigo Wang 186900b7c339SAmerigo Wang if (!*size) 187000b7c339SAmerigo Wang return -EINVAL; 187100b7c339SAmerigo Wang 187200b7c339SAmerigo Wang len = *size; 187300b7c339SAmerigo Wang if (len > TMPBUFLEN - 1) 187400b7c339SAmerigo Wang len = TMPBUFLEN - 1; 187500b7c339SAmerigo Wang 187600b7c339SAmerigo Wang memcpy(tmp, *buf, len); 187700b7c339SAmerigo Wang 187800b7c339SAmerigo Wang tmp[len] = 0; 187900b7c339SAmerigo Wang p = tmp; 188000b7c339SAmerigo Wang if (*p == '-' && *size > 1) { 188100b7c339SAmerigo Wang *neg = true; 188200b7c339SAmerigo Wang p++; 188300b7c339SAmerigo Wang } else 188400b7c339SAmerigo Wang *neg = false; 188500b7c339SAmerigo Wang if (!isdigit(*p)) 188600b7c339SAmerigo Wang return -EINVAL; 188700b7c339SAmerigo Wang 188800b7c339SAmerigo Wang *val = simple_strtoul(p, &p, 0); 188900b7c339SAmerigo Wang 189000b7c339SAmerigo Wang len = p - tmp; 189100b7c339SAmerigo Wang 189200b7c339SAmerigo Wang /* We don't know if the next char is whitespace thus we may accept 189300b7c339SAmerigo Wang * invalid integers (e.g. 1234...a) or two integers instead of one 189400b7c339SAmerigo Wang * (e.g. 123...1). So lets not allow such large numbers. */ 189500b7c339SAmerigo Wang if (len == TMPBUFLEN - 1) 189600b7c339SAmerigo Wang return -EINVAL; 189700b7c339SAmerigo Wang 189800b7c339SAmerigo Wang if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len)) 189900b7c339SAmerigo Wang return -EINVAL; 190000b7c339SAmerigo Wang 190100b7c339SAmerigo Wang if (tr && (len < *size)) 190200b7c339SAmerigo Wang *tr = *p; 190300b7c339SAmerigo Wang 190400b7c339SAmerigo Wang *buf += len; 190500b7c339SAmerigo Wang *size -= len; 190600b7c339SAmerigo Wang 190700b7c339SAmerigo Wang return 0; 190800b7c339SAmerigo Wang } 190900b7c339SAmerigo Wang 191000b7c339SAmerigo Wang /** 19110fc377bdSRandy Dunlap * proc_put_long - converts an integer to a decimal ASCII formatted string 191200b7c339SAmerigo Wang * 19130fc377bdSRandy Dunlap * @buf: the user buffer 19140fc377bdSRandy Dunlap * @size: the size of the user buffer 19150fc377bdSRandy Dunlap * @val: the integer to be converted 19160fc377bdSRandy Dunlap * @neg: sign of the number, %TRUE for negative 191700b7c339SAmerigo Wang * 19180fc377bdSRandy Dunlap * In case of success %0 is returned and @buf and @size are updated with 19190fc377bdSRandy Dunlap * the amount of bytes written. 192000b7c339SAmerigo Wang */ 192100b7c339SAmerigo Wang static int proc_put_long(void __user **buf, size_t *size, unsigned long val, 192200b7c339SAmerigo Wang bool neg) 192300b7c339SAmerigo Wang { 192400b7c339SAmerigo Wang int len; 192500b7c339SAmerigo Wang char tmp[TMPBUFLEN], *p = tmp; 192600b7c339SAmerigo Wang 192700b7c339SAmerigo Wang sprintf(p, "%s%lu", neg ? "-" : "", val); 192800b7c339SAmerigo Wang len = strlen(tmp); 192900b7c339SAmerigo Wang if (len > *size) 193000b7c339SAmerigo Wang len = *size; 193100b7c339SAmerigo Wang if (copy_to_user(*buf, tmp, len)) 193200b7c339SAmerigo Wang return -EFAULT; 193300b7c339SAmerigo Wang *size -= len; 193400b7c339SAmerigo Wang *buf += len; 193500b7c339SAmerigo Wang return 0; 193600b7c339SAmerigo Wang } 193700b7c339SAmerigo Wang #undef TMPBUFLEN 193800b7c339SAmerigo Wang 193900b7c339SAmerigo Wang static int proc_put_char(void __user **buf, size_t *size, char c) 194000b7c339SAmerigo Wang { 194100b7c339SAmerigo Wang if (*size) { 194200b7c339SAmerigo Wang char __user **buffer = (char __user **)buf; 194300b7c339SAmerigo Wang if (put_user(c, *buffer)) 194400b7c339SAmerigo Wang return -EFAULT; 194500b7c339SAmerigo Wang (*size)--, (*buffer)++; 194600b7c339SAmerigo Wang *buf = *buffer; 194700b7c339SAmerigo Wang } 194800b7c339SAmerigo Wang return 0; 194900b7c339SAmerigo Wang } 195000b7c339SAmerigo Wang 195100b7c339SAmerigo Wang static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, 19521da177e4SLinus Torvalds int *valp, 19531da177e4SLinus Torvalds int write, void *data) 19541da177e4SLinus Torvalds { 19551da177e4SLinus Torvalds if (write) { 19561da177e4SLinus Torvalds *valp = *negp ? -*lvalp : *lvalp; 19571da177e4SLinus Torvalds } else { 19581da177e4SLinus Torvalds int val = *valp; 19591da177e4SLinus Torvalds if (val < 0) { 196000b7c339SAmerigo Wang *negp = true; 19611da177e4SLinus Torvalds *lvalp = (unsigned long)-val; 19621da177e4SLinus Torvalds } else { 196300b7c339SAmerigo Wang *negp = false; 19641da177e4SLinus Torvalds *lvalp = (unsigned long)val; 19651da177e4SLinus Torvalds } 19661da177e4SLinus Torvalds } 19671da177e4SLinus Torvalds return 0; 19681da177e4SLinus Torvalds } 19691da177e4SLinus Torvalds 197000b7c339SAmerigo Wang static const char proc_wspace_sep[] = { ' ', '\t', '\n' }; 197100b7c339SAmerigo Wang 1972d8217f07SEric W. Biederman static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, 19738d65af78SAlexey Dobriyan int write, void __user *buffer, 1974fcfbd547SKirill Korotaev size_t *lenp, loff_t *ppos, 197500b7c339SAmerigo Wang int (*conv)(bool *negp, unsigned long *lvalp, int *valp, 19761da177e4SLinus Torvalds int write, void *data), 19771da177e4SLinus Torvalds void *data) 19781da177e4SLinus Torvalds { 197900b7c339SAmerigo Wang int *i, vleft, first = 1, err = 0; 198000b7c339SAmerigo Wang unsigned long page = 0; 198100b7c339SAmerigo Wang size_t left; 198200b7c339SAmerigo Wang char *kbuf; 19831da177e4SLinus Torvalds 198400b7c339SAmerigo Wang if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { 19851da177e4SLinus Torvalds *lenp = 0; 19861da177e4SLinus Torvalds return 0; 19871da177e4SLinus Torvalds } 19881da177e4SLinus Torvalds 1989fcfbd547SKirill Korotaev i = (int *) tbl_data; 19901da177e4SLinus Torvalds vleft = table->maxlen / sizeof(*i); 19911da177e4SLinus Torvalds left = *lenp; 19921da177e4SLinus Torvalds 19931da177e4SLinus Torvalds if (!conv) 19941da177e4SLinus Torvalds conv = do_proc_dointvec_conv; 19951da177e4SLinus Torvalds 199600b7c339SAmerigo Wang if (write) { 1997f4aacea2SKees Cook if (*ppos) { 1998f4aacea2SKees Cook switch (sysctl_writes_strict) { 1999f4aacea2SKees Cook case SYSCTL_WRITES_STRICT: 2000f4aacea2SKees Cook goto out; 2001f4aacea2SKees Cook case SYSCTL_WRITES_WARN: 2002f4aacea2SKees Cook warn_sysctl_write(table); 2003f4aacea2SKees Cook break; 2004f4aacea2SKees Cook default: 2005f4aacea2SKees Cook break; 2006f4aacea2SKees Cook } 2007f4aacea2SKees Cook } 2008f4aacea2SKees Cook 200900b7c339SAmerigo Wang if (left > PAGE_SIZE - 1) 201000b7c339SAmerigo Wang left = PAGE_SIZE - 1; 201100b7c339SAmerigo Wang page = __get_free_page(GFP_TEMPORARY); 201200b7c339SAmerigo Wang kbuf = (char *) page; 201300b7c339SAmerigo Wang if (!kbuf) 201400b7c339SAmerigo Wang return -ENOMEM; 201500b7c339SAmerigo Wang if (copy_from_user(kbuf, buffer, left)) { 201600b7c339SAmerigo Wang err = -EFAULT; 201700b7c339SAmerigo Wang goto free; 201800b7c339SAmerigo Wang } 201900b7c339SAmerigo Wang kbuf[left] = 0; 202000b7c339SAmerigo Wang } 202100b7c339SAmerigo Wang 20221da177e4SLinus Torvalds for (; left && vleft--; i++, first=0) { 202300b7c339SAmerigo Wang unsigned long lval; 202400b7c339SAmerigo Wang bool neg; 202500b7c339SAmerigo Wang 20261da177e4SLinus Torvalds if (write) { 202700b7c339SAmerigo Wang left -= proc_skip_spaces(&kbuf); 202800b7c339SAmerigo Wang 2029563b0467SJ. R. Okajima if (!left) 2030563b0467SJ. R. Okajima break; 203100b7c339SAmerigo Wang err = proc_get_long(&kbuf, &left, &lval, &neg, 203200b7c339SAmerigo Wang proc_wspace_sep, 203300b7c339SAmerigo Wang sizeof(proc_wspace_sep), NULL); 203400b7c339SAmerigo Wang if (err) 20351da177e4SLinus Torvalds break; 203600b7c339SAmerigo Wang if (conv(&neg, &lval, i, 1, data)) { 203700b7c339SAmerigo Wang err = -EINVAL; 203800b7c339SAmerigo Wang break; 20391da177e4SLinus Torvalds } 20401da177e4SLinus Torvalds } else { 204100b7c339SAmerigo Wang if (conv(&neg, &lval, i, 0, data)) { 204200b7c339SAmerigo Wang err = -EINVAL; 204300b7c339SAmerigo Wang break; 204400b7c339SAmerigo Wang } 20451da177e4SLinus Torvalds if (!first) 204600b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\t'); 204700b7c339SAmerigo Wang if (err) 20481da177e4SLinus Torvalds break; 204900b7c339SAmerigo Wang err = proc_put_long(&buffer, &left, lval, neg); 205000b7c339SAmerigo Wang if (err) 205100b7c339SAmerigo Wang break; 20521da177e4SLinus Torvalds } 20531da177e4SLinus Torvalds } 20541da177e4SLinus Torvalds 205500b7c339SAmerigo Wang if (!write && !first && left && !err) 205600b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\n'); 2057563b0467SJ. R. Okajima if (write && !err && left) 205800b7c339SAmerigo Wang left -= proc_skip_spaces(&kbuf); 205900b7c339SAmerigo Wang free: 20601da177e4SLinus Torvalds if (write) { 206100b7c339SAmerigo Wang free_page(page); 206200b7c339SAmerigo Wang if (first) 206300b7c339SAmerigo Wang return err ? : -EINVAL; 20641da177e4SLinus Torvalds } 20651da177e4SLinus Torvalds *lenp -= left; 2066f4aacea2SKees Cook out: 20671da177e4SLinus Torvalds *ppos += *lenp; 206800b7c339SAmerigo Wang return err; 20691da177e4SLinus Torvalds } 20701da177e4SLinus Torvalds 20718d65af78SAlexey Dobriyan static int do_proc_dointvec(struct ctl_table *table, int write, 2072fcfbd547SKirill Korotaev void __user *buffer, size_t *lenp, loff_t *ppos, 207300b7c339SAmerigo Wang int (*conv)(bool *negp, unsigned long *lvalp, int *valp, 2074fcfbd547SKirill Korotaev int write, void *data), 2075fcfbd547SKirill Korotaev void *data) 2076fcfbd547SKirill Korotaev { 20778d65af78SAlexey Dobriyan return __do_proc_dointvec(table->data, table, write, 2078fcfbd547SKirill Korotaev buffer, lenp, ppos, conv, data); 2079fcfbd547SKirill Korotaev } 2080fcfbd547SKirill Korotaev 20811da177e4SLinus Torvalds /** 20821da177e4SLinus Torvalds * proc_dointvec - read a vector of integers 20831da177e4SLinus Torvalds * @table: the sysctl table 20841da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 20851da177e4SLinus Torvalds * @buffer: the user buffer 20861da177e4SLinus Torvalds * @lenp: the size of the user buffer 20871da177e4SLinus Torvalds * @ppos: file position 20881da177e4SLinus Torvalds * 20891da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 20901da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 20911da177e4SLinus Torvalds * 20921da177e4SLinus Torvalds * Returns 0 on success. 20931da177e4SLinus Torvalds */ 20948d65af78SAlexey Dobriyan int proc_dointvec(struct ctl_table *table, int write, 20951da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 20961da177e4SLinus Torvalds { 20978d65af78SAlexey Dobriyan return do_proc_dointvec(table,write,buffer,lenp,ppos, 20981da177e4SLinus Torvalds NULL,NULL); 20991da177e4SLinus Torvalds } 21001da177e4SLinus Torvalds 210134f5a398STheodore Ts'o /* 210234f5a398STheodore Ts'o * Taint values can only be increased 210325ddbb18SAndi Kleen * This means we can safely use a temporary. 210434f5a398STheodore Ts'o */ 21058d65af78SAlexey Dobriyan static int proc_taint(struct ctl_table *table, int write, 210634f5a398STheodore Ts'o void __user *buffer, size_t *lenp, loff_t *ppos) 210734f5a398STheodore Ts'o { 210825ddbb18SAndi Kleen struct ctl_table t; 210925ddbb18SAndi Kleen unsigned long tmptaint = get_taint(); 211025ddbb18SAndi Kleen int err; 211134f5a398STheodore Ts'o 211291fcd412SBastian Blank if (write && !capable(CAP_SYS_ADMIN)) 211334f5a398STheodore Ts'o return -EPERM; 211434f5a398STheodore Ts'o 211525ddbb18SAndi Kleen t = *table; 211625ddbb18SAndi Kleen t.data = &tmptaint; 21178d65af78SAlexey Dobriyan err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos); 211825ddbb18SAndi Kleen if (err < 0) 211925ddbb18SAndi Kleen return err; 212025ddbb18SAndi Kleen 212125ddbb18SAndi Kleen if (write) { 212225ddbb18SAndi Kleen /* 212325ddbb18SAndi Kleen * Poor man's atomic or. Not worth adding a primitive 212425ddbb18SAndi Kleen * to everyone's atomic.h for this 212525ddbb18SAndi Kleen */ 212625ddbb18SAndi Kleen int i; 212725ddbb18SAndi Kleen for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) { 212825ddbb18SAndi Kleen if ((tmptaint >> i) & 1) 2129373d4d09SRusty Russell add_taint(i, LOCKDEP_STILL_OK); 213025ddbb18SAndi Kleen } 213125ddbb18SAndi Kleen } 213225ddbb18SAndi Kleen 213325ddbb18SAndi Kleen return err; 213434f5a398STheodore Ts'o } 213534f5a398STheodore Ts'o 2136bfdc0b49SRichard Weinberger #ifdef CONFIG_PRINTK 2137620f6e8eSKees Cook static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, 2138bfdc0b49SRichard Weinberger void __user *buffer, size_t *lenp, loff_t *ppos) 2139bfdc0b49SRichard Weinberger { 2140bfdc0b49SRichard Weinberger if (write && !capable(CAP_SYS_ADMIN)) 2141bfdc0b49SRichard Weinberger return -EPERM; 2142bfdc0b49SRichard Weinberger 2143bfdc0b49SRichard Weinberger return proc_dointvec_minmax(table, write, buffer, lenp, ppos); 2144bfdc0b49SRichard Weinberger } 2145bfdc0b49SRichard Weinberger #endif 2146bfdc0b49SRichard Weinberger 21471da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param { 21481da177e4SLinus Torvalds int *min; 21491da177e4SLinus Torvalds int *max; 21501da177e4SLinus Torvalds }; 21511da177e4SLinus Torvalds 215200b7c339SAmerigo Wang static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp, 21531da177e4SLinus Torvalds int *valp, 21541da177e4SLinus Torvalds int write, void *data) 21551da177e4SLinus Torvalds { 21561da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param *param = data; 21571da177e4SLinus Torvalds if (write) { 21581da177e4SLinus Torvalds int val = *negp ? -*lvalp : *lvalp; 21591da177e4SLinus Torvalds if ((param->min && *param->min > val) || 21601da177e4SLinus Torvalds (param->max && *param->max < val)) 21611da177e4SLinus Torvalds return -EINVAL; 21621da177e4SLinus Torvalds *valp = val; 21631da177e4SLinus Torvalds } else { 21641da177e4SLinus Torvalds int val = *valp; 21651da177e4SLinus Torvalds if (val < 0) { 216600b7c339SAmerigo Wang *negp = true; 21671da177e4SLinus Torvalds *lvalp = (unsigned long)-val; 21681da177e4SLinus Torvalds } else { 216900b7c339SAmerigo Wang *negp = false; 21701da177e4SLinus Torvalds *lvalp = (unsigned long)val; 21711da177e4SLinus Torvalds } 21721da177e4SLinus Torvalds } 21731da177e4SLinus Torvalds return 0; 21741da177e4SLinus Torvalds } 21751da177e4SLinus Torvalds 21761da177e4SLinus Torvalds /** 21771da177e4SLinus Torvalds * proc_dointvec_minmax - read a vector of integers with min/max values 21781da177e4SLinus Torvalds * @table: the sysctl table 21791da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 21801da177e4SLinus Torvalds * @buffer: the user buffer 21811da177e4SLinus Torvalds * @lenp: the size of the user buffer 21821da177e4SLinus Torvalds * @ppos: file position 21831da177e4SLinus Torvalds * 21841da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 21851da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 21861da177e4SLinus Torvalds * 21871da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 21881da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 21891da177e4SLinus Torvalds * 21901da177e4SLinus Torvalds * Returns 0 on success. 21911da177e4SLinus Torvalds */ 21928d65af78SAlexey Dobriyan int proc_dointvec_minmax(struct ctl_table *table, int write, 21931da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 21941da177e4SLinus Torvalds { 21951da177e4SLinus Torvalds struct do_proc_dointvec_minmax_conv_param param = { 21961da177e4SLinus Torvalds .min = (int *) table->extra1, 21971da177e4SLinus Torvalds .max = (int *) table->extra2, 21981da177e4SLinus Torvalds }; 21998d65af78SAlexey Dobriyan return do_proc_dointvec(table, write, buffer, lenp, ppos, 22001da177e4SLinus Torvalds do_proc_dointvec_minmax_conv, ¶m); 22011da177e4SLinus Torvalds } 22021da177e4SLinus Torvalds 220354b50199SKees Cook static void validate_coredump_safety(void) 220454b50199SKees Cook { 2205046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 2206e579d2c2SKees Cook if (suid_dumpable == SUID_DUMP_ROOT && 220754b50199SKees Cook core_pattern[0] != '/' && core_pattern[0] != '|') { 220854b50199SKees Cook printk(KERN_WARNING "Unsafe core_pattern used with "\ 220954b50199SKees Cook "suid_dumpable=2. Pipe handler or fully qualified "\ 221054b50199SKees Cook "core dump path required.\n"); 221154b50199SKees Cook } 2212046d662fSAlex Kelly #endif 221354b50199SKees Cook } 221454b50199SKees Cook 221554b50199SKees Cook static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, 221654b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos) 221754b50199SKees Cook { 221854b50199SKees Cook int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 221954b50199SKees Cook if (!error) 222054b50199SKees Cook validate_coredump_safety(); 222154b50199SKees Cook return error; 222254b50199SKees Cook } 222354b50199SKees Cook 2224046d662fSAlex Kelly #ifdef CONFIG_COREDUMP 222554b50199SKees Cook static int proc_dostring_coredump(struct ctl_table *table, int write, 222654b50199SKees Cook void __user *buffer, size_t *lenp, loff_t *ppos) 222754b50199SKees Cook { 222854b50199SKees Cook int error = proc_dostring(table, write, buffer, lenp, ppos); 222954b50199SKees Cook if (!error) 223054b50199SKees Cook validate_coredump_safety(); 223154b50199SKees Cook return error; 223254b50199SKees Cook } 2233046d662fSAlex Kelly #endif 223454b50199SKees Cook 2235d8217f07SEric W. Biederman static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, 22361da177e4SLinus Torvalds void __user *buffer, 22371da177e4SLinus Torvalds size_t *lenp, loff_t *ppos, 22381da177e4SLinus Torvalds unsigned long convmul, 22391da177e4SLinus Torvalds unsigned long convdiv) 22401da177e4SLinus Torvalds { 224100b7c339SAmerigo Wang unsigned long *i, *min, *max; 224200b7c339SAmerigo Wang int vleft, first = 1, err = 0; 224300b7c339SAmerigo Wang unsigned long page = 0; 224400b7c339SAmerigo Wang size_t left; 224500b7c339SAmerigo Wang char *kbuf; 22461da177e4SLinus Torvalds 224700b7c339SAmerigo Wang if (!data || !table->maxlen || !*lenp || (*ppos && !write)) { 22481da177e4SLinus Torvalds *lenp = 0; 22491da177e4SLinus Torvalds return 0; 22501da177e4SLinus Torvalds } 22511da177e4SLinus Torvalds 2252fcfbd547SKirill Korotaev i = (unsigned long *) data; 22531da177e4SLinus Torvalds min = (unsigned long *) table->extra1; 22541da177e4SLinus Torvalds max = (unsigned long *) table->extra2; 22551da177e4SLinus Torvalds vleft = table->maxlen / sizeof(unsigned long); 22561da177e4SLinus Torvalds left = *lenp; 22571da177e4SLinus Torvalds 22581da177e4SLinus Torvalds if (write) { 2259f4aacea2SKees Cook if (*ppos) { 2260f4aacea2SKees Cook switch (sysctl_writes_strict) { 2261f4aacea2SKees Cook case SYSCTL_WRITES_STRICT: 2262f4aacea2SKees Cook goto out; 2263f4aacea2SKees Cook case SYSCTL_WRITES_WARN: 2264f4aacea2SKees Cook warn_sysctl_write(table); 2265f4aacea2SKees Cook break; 2266f4aacea2SKees Cook default: 2267f4aacea2SKees Cook break; 2268f4aacea2SKees Cook } 2269f4aacea2SKees Cook } 2270f4aacea2SKees Cook 227100b7c339SAmerigo Wang if (left > PAGE_SIZE - 1) 227200b7c339SAmerigo Wang left = PAGE_SIZE - 1; 227300b7c339SAmerigo Wang page = __get_free_page(GFP_TEMPORARY); 227400b7c339SAmerigo Wang kbuf = (char *) page; 227500b7c339SAmerigo Wang if (!kbuf) 227600b7c339SAmerigo Wang return -ENOMEM; 227700b7c339SAmerigo Wang if (copy_from_user(kbuf, buffer, left)) { 227800b7c339SAmerigo Wang err = -EFAULT; 227900b7c339SAmerigo Wang goto free; 22801da177e4SLinus Torvalds } 228100b7c339SAmerigo Wang kbuf[left] = 0; 22821da177e4SLinus Torvalds } 22831da177e4SLinus Torvalds 228427b3d80aSEric Dumazet for (; left && vleft--; i++, first = 0) { 228500b7c339SAmerigo Wang unsigned long val; 228600b7c339SAmerigo Wang 228700b7c339SAmerigo Wang if (write) { 228800b7c339SAmerigo Wang bool neg; 228900b7c339SAmerigo Wang 229000b7c339SAmerigo Wang left -= proc_skip_spaces(&kbuf); 229100b7c339SAmerigo Wang 229200b7c339SAmerigo Wang err = proc_get_long(&kbuf, &left, &val, &neg, 229300b7c339SAmerigo Wang proc_wspace_sep, 229400b7c339SAmerigo Wang sizeof(proc_wspace_sep), NULL); 229500b7c339SAmerigo Wang if (err) 229600b7c339SAmerigo Wang break; 22971da177e4SLinus Torvalds if (neg) 22981da177e4SLinus Torvalds continue; 22991da177e4SLinus Torvalds if ((min && val < *min) || (max && val > *max)) 23001da177e4SLinus Torvalds continue; 23011da177e4SLinus Torvalds *i = val; 23021da177e4SLinus Torvalds } else { 230300b7c339SAmerigo Wang val = convdiv * (*i) / convmul; 23047833819dSChen Gang if (!first) { 230500b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\t'); 23067833819dSChen Gang if (err) 23077833819dSChen Gang break; 23087833819dSChen Gang } 230900b7c339SAmerigo Wang err = proc_put_long(&buffer, &left, val, false); 231000b7c339SAmerigo Wang if (err) 231100b7c339SAmerigo Wang break; 23121da177e4SLinus Torvalds } 23131da177e4SLinus Torvalds } 23141da177e4SLinus Torvalds 231500b7c339SAmerigo Wang if (!write && !first && left && !err) 231600b7c339SAmerigo Wang err = proc_put_char(&buffer, &left, '\n'); 231700b7c339SAmerigo Wang if (write && !err) 231800b7c339SAmerigo Wang left -= proc_skip_spaces(&kbuf); 231900b7c339SAmerigo Wang free: 23201da177e4SLinus Torvalds if (write) { 232100b7c339SAmerigo Wang free_page(page); 232200b7c339SAmerigo Wang if (first) 232300b7c339SAmerigo Wang return err ? : -EINVAL; 23241da177e4SLinus Torvalds } 23251da177e4SLinus Torvalds *lenp -= left; 2326f4aacea2SKees Cook out: 23271da177e4SLinus Torvalds *ppos += *lenp; 232800b7c339SAmerigo Wang return err; 23291da177e4SLinus Torvalds } 23301da177e4SLinus Torvalds 2331d8217f07SEric W. Biederman static int do_proc_doulongvec_minmax(struct ctl_table *table, int write, 2332fcfbd547SKirill Korotaev void __user *buffer, 2333fcfbd547SKirill Korotaev size_t *lenp, loff_t *ppos, 2334fcfbd547SKirill Korotaev unsigned long convmul, 2335fcfbd547SKirill Korotaev unsigned long convdiv) 2336fcfbd547SKirill Korotaev { 2337fcfbd547SKirill Korotaev return __do_proc_doulongvec_minmax(table->data, table, write, 23388d65af78SAlexey Dobriyan buffer, lenp, ppos, convmul, convdiv); 2339fcfbd547SKirill Korotaev } 2340fcfbd547SKirill Korotaev 23411da177e4SLinus Torvalds /** 23421da177e4SLinus Torvalds * proc_doulongvec_minmax - read a vector of long integers with min/max values 23431da177e4SLinus Torvalds * @table: the sysctl table 23441da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 23451da177e4SLinus Torvalds * @buffer: the user buffer 23461da177e4SLinus Torvalds * @lenp: the size of the user buffer 23471da177e4SLinus Torvalds * @ppos: file position 23481da177e4SLinus Torvalds * 23491da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long 23501da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 23511da177e4SLinus Torvalds * 23521da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 23531da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 23541da177e4SLinus Torvalds * 23551da177e4SLinus Torvalds * Returns 0 on success. 23561da177e4SLinus Torvalds */ 23578d65af78SAlexey Dobriyan int proc_doulongvec_minmax(struct ctl_table *table, int write, 23581da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 23591da177e4SLinus Torvalds { 23608d65af78SAlexey Dobriyan return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l); 23611da177e4SLinus Torvalds } 23621da177e4SLinus Torvalds 23631da177e4SLinus Torvalds /** 23641da177e4SLinus Torvalds * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values 23651da177e4SLinus Torvalds * @table: the sysctl table 23661da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 23671da177e4SLinus Torvalds * @buffer: the user buffer 23681da177e4SLinus Torvalds * @lenp: the size of the user buffer 23691da177e4SLinus Torvalds * @ppos: file position 23701da177e4SLinus Torvalds * 23711da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long 23721da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. The values 23731da177e4SLinus Torvalds * are treated as milliseconds, and converted to jiffies when they are stored. 23741da177e4SLinus Torvalds * 23751da177e4SLinus Torvalds * This routine will ensure the values are within the range specified by 23761da177e4SLinus Torvalds * table->extra1 (min) and table->extra2 (max). 23771da177e4SLinus Torvalds * 23781da177e4SLinus Torvalds * Returns 0 on success. 23791da177e4SLinus Torvalds */ 2380d8217f07SEric W. Biederman int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, 23811da177e4SLinus Torvalds void __user *buffer, 23821da177e4SLinus Torvalds size_t *lenp, loff_t *ppos) 23831da177e4SLinus Torvalds { 23848d65af78SAlexey Dobriyan return do_proc_doulongvec_minmax(table, write, buffer, 23851da177e4SLinus Torvalds lenp, ppos, HZ, 1000l); 23861da177e4SLinus Torvalds } 23871da177e4SLinus Torvalds 23881da177e4SLinus Torvalds 238900b7c339SAmerigo Wang static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp, 23901da177e4SLinus Torvalds int *valp, 23911da177e4SLinus Torvalds int write, void *data) 23921da177e4SLinus Torvalds { 23931da177e4SLinus Torvalds if (write) { 2394cba9f33dSBart Samwel if (*lvalp > LONG_MAX / HZ) 2395cba9f33dSBart Samwel return 1; 23961da177e4SLinus Torvalds *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ); 23971da177e4SLinus Torvalds } else { 23981da177e4SLinus Torvalds int val = *valp; 23991da177e4SLinus Torvalds unsigned long lval; 24001da177e4SLinus Torvalds if (val < 0) { 240100b7c339SAmerigo Wang *negp = true; 24021da177e4SLinus Torvalds lval = (unsigned long)-val; 24031da177e4SLinus Torvalds } else { 240400b7c339SAmerigo Wang *negp = false; 24051da177e4SLinus Torvalds lval = (unsigned long)val; 24061da177e4SLinus Torvalds } 24071da177e4SLinus Torvalds *lvalp = lval / HZ; 24081da177e4SLinus Torvalds } 24091da177e4SLinus Torvalds return 0; 24101da177e4SLinus Torvalds } 24111da177e4SLinus Torvalds 241200b7c339SAmerigo Wang static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp, 24131da177e4SLinus Torvalds int *valp, 24141da177e4SLinus Torvalds int write, void *data) 24151da177e4SLinus Torvalds { 24161da177e4SLinus Torvalds if (write) { 2417cba9f33dSBart Samwel if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ) 2418cba9f33dSBart Samwel return 1; 24191da177e4SLinus Torvalds *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp); 24201da177e4SLinus Torvalds } else { 24211da177e4SLinus Torvalds int val = *valp; 24221da177e4SLinus Torvalds unsigned long lval; 24231da177e4SLinus Torvalds if (val < 0) { 242400b7c339SAmerigo Wang *negp = true; 24251da177e4SLinus Torvalds lval = (unsigned long)-val; 24261da177e4SLinus Torvalds } else { 242700b7c339SAmerigo Wang *negp = false; 24281da177e4SLinus Torvalds lval = (unsigned long)val; 24291da177e4SLinus Torvalds } 24301da177e4SLinus Torvalds *lvalp = jiffies_to_clock_t(lval); 24311da177e4SLinus Torvalds } 24321da177e4SLinus Torvalds return 0; 24331da177e4SLinus Torvalds } 24341da177e4SLinus Torvalds 243500b7c339SAmerigo Wang static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp, 24361da177e4SLinus Torvalds int *valp, 24371da177e4SLinus Torvalds int write, void *data) 24381da177e4SLinus Torvalds { 24391da177e4SLinus Torvalds if (write) { 2440d738ce8fSFrancesco Fusco unsigned long jif = msecs_to_jiffies(*negp ? -*lvalp : *lvalp); 2441d738ce8fSFrancesco Fusco 2442d738ce8fSFrancesco Fusco if (jif > INT_MAX) 2443d738ce8fSFrancesco Fusco return 1; 2444d738ce8fSFrancesco Fusco *valp = (int)jif; 24451da177e4SLinus Torvalds } else { 24461da177e4SLinus Torvalds int val = *valp; 24471da177e4SLinus Torvalds unsigned long lval; 24481da177e4SLinus Torvalds if (val < 0) { 244900b7c339SAmerigo Wang *negp = true; 24501da177e4SLinus Torvalds lval = (unsigned long)-val; 24511da177e4SLinus Torvalds } else { 245200b7c339SAmerigo Wang *negp = false; 24531da177e4SLinus Torvalds lval = (unsigned long)val; 24541da177e4SLinus Torvalds } 24551da177e4SLinus Torvalds *lvalp = jiffies_to_msecs(lval); 24561da177e4SLinus Torvalds } 24571da177e4SLinus Torvalds return 0; 24581da177e4SLinus Torvalds } 24591da177e4SLinus Torvalds 24601da177e4SLinus Torvalds /** 24611da177e4SLinus Torvalds * proc_dointvec_jiffies - read a vector of integers as seconds 24621da177e4SLinus Torvalds * @table: the sysctl table 24631da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 24641da177e4SLinus Torvalds * @buffer: the user buffer 24651da177e4SLinus Torvalds * @lenp: the size of the user buffer 24661da177e4SLinus Torvalds * @ppos: file position 24671da177e4SLinus Torvalds * 24681da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 24691da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 24701da177e4SLinus Torvalds * The values read are assumed to be in seconds, and are converted into 24711da177e4SLinus Torvalds * jiffies. 24721da177e4SLinus Torvalds * 24731da177e4SLinus Torvalds * Returns 0 on success. 24741da177e4SLinus Torvalds */ 24758d65af78SAlexey Dobriyan int proc_dointvec_jiffies(struct ctl_table *table, int write, 24761da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 24771da177e4SLinus Torvalds { 24788d65af78SAlexey Dobriyan return do_proc_dointvec(table,write,buffer,lenp,ppos, 24791da177e4SLinus Torvalds do_proc_dointvec_jiffies_conv,NULL); 24801da177e4SLinus Torvalds } 24811da177e4SLinus Torvalds 24821da177e4SLinus Torvalds /** 24831da177e4SLinus Torvalds * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds 24841da177e4SLinus Torvalds * @table: the sysctl table 24851da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 24861da177e4SLinus Torvalds * @buffer: the user buffer 24871da177e4SLinus Torvalds * @lenp: the size of the user buffer 24881e5d5331SRandy Dunlap * @ppos: pointer to the file position 24891da177e4SLinus Torvalds * 24901da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 24911da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 24921da177e4SLinus Torvalds * The values read are assumed to be in 1/USER_HZ seconds, and 24931da177e4SLinus Torvalds * are converted into jiffies. 24941da177e4SLinus Torvalds * 24951da177e4SLinus Torvalds * Returns 0 on success. 24961da177e4SLinus Torvalds */ 24978d65af78SAlexey Dobriyan int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, 24981da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 24991da177e4SLinus Torvalds { 25008d65af78SAlexey Dobriyan return do_proc_dointvec(table,write,buffer,lenp,ppos, 25011da177e4SLinus Torvalds do_proc_dointvec_userhz_jiffies_conv,NULL); 25021da177e4SLinus Torvalds } 25031da177e4SLinus Torvalds 25041da177e4SLinus Torvalds /** 25051da177e4SLinus Torvalds * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds 25061da177e4SLinus Torvalds * @table: the sysctl table 25071da177e4SLinus Torvalds * @write: %TRUE if this is a write to the sysctl file 25081da177e4SLinus Torvalds * @buffer: the user buffer 25091da177e4SLinus Torvalds * @lenp: the size of the user buffer 251067be2dd1SMartin Waitz * @ppos: file position 251167be2dd1SMartin Waitz * @ppos: the current position in the file 25121da177e4SLinus Torvalds * 25131da177e4SLinus Torvalds * Reads/writes up to table->maxlen/sizeof(unsigned int) integer 25141da177e4SLinus Torvalds * values from/to the user buffer, treated as an ASCII string. 25151da177e4SLinus Torvalds * The values read are assumed to be in 1/1000 seconds, and 25161da177e4SLinus Torvalds * are converted into jiffies. 25171da177e4SLinus Torvalds * 25181da177e4SLinus Torvalds * Returns 0 on success. 25191da177e4SLinus Torvalds */ 25208d65af78SAlexey Dobriyan int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, 25211da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 25221da177e4SLinus Torvalds { 25238d65af78SAlexey Dobriyan return do_proc_dointvec(table, write, buffer, lenp, ppos, 25241da177e4SLinus Torvalds do_proc_dointvec_ms_jiffies_conv, NULL); 25251da177e4SLinus Torvalds } 25261da177e4SLinus Torvalds 25278d65af78SAlexey Dobriyan static int proc_do_cad_pid(struct ctl_table *table, int write, 25289ec52099SCedric Le Goater void __user *buffer, size_t *lenp, loff_t *ppos) 25299ec52099SCedric Le Goater { 25309ec52099SCedric Le Goater struct pid *new_pid; 25319ec52099SCedric Le Goater pid_t tmp; 25329ec52099SCedric Le Goater int r; 25339ec52099SCedric Le Goater 25346c5f3e7bSPavel Emelyanov tmp = pid_vnr(cad_pid); 25359ec52099SCedric Le Goater 25368d65af78SAlexey Dobriyan r = __do_proc_dointvec(&tmp, table, write, buffer, 25379ec52099SCedric Le Goater lenp, ppos, NULL, NULL); 25389ec52099SCedric Le Goater if (r || !write) 25399ec52099SCedric Le Goater return r; 25409ec52099SCedric Le Goater 25419ec52099SCedric Le Goater new_pid = find_get_pid(tmp); 25429ec52099SCedric Le Goater if (!new_pid) 25439ec52099SCedric Le Goater return -ESRCH; 25449ec52099SCedric Le Goater 25459ec52099SCedric Le Goater put_pid(xchg(&cad_pid, new_pid)); 25469ec52099SCedric Le Goater return 0; 25479ec52099SCedric Le Goater } 25489ec52099SCedric Le Goater 25499f977fb7SOctavian Purdila /** 25509f977fb7SOctavian Purdila * proc_do_large_bitmap - read/write from/to a large bitmap 25519f977fb7SOctavian Purdila * @table: the sysctl table 25529f977fb7SOctavian Purdila * @write: %TRUE if this is a write to the sysctl file 25539f977fb7SOctavian Purdila * @buffer: the user buffer 25549f977fb7SOctavian Purdila * @lenp: the size of the user buffer 25559f977fb7SOctavian Purdila * @ppos: file position 25569f977fb7SOctavian Purdila * 25579f977fb7SOctavian Purdila * The bitmap is stored at table->data and the bitmap length (in bits) 25589f977fb7SOctavian Purdila * in table->maxlen. 25599f977fb7SOctavian Purdila * 25609f977fb7SOctavian Purdila * We use a range comma separated format (e.g. 1,3-4,10-10) so that 25619f977fb7SOctavian Purdila * large bitmaps may be represented in a compact manner. Writing into 25629f977fb7SOctavian Purdila * the file will clear the bitmap then update it with the given input. 25639f977fb7SOctavian Purdila * 25649f977fb7SOctavian Purdila * Returns 0 on success. 25659f977fb7SOctavian Purdila */ 25669f977fb7SOctavian Purdila int proc_do_large_bitmap(struct ctl_table *table, int write, 25679f977fb7SOctavian Purdila void __user *buffer, size_t *lenp, loff_t *ppos) 25689f977fb7SOctavian Purdila { 25699f977fb7SOctavian Purdila int err = 0; 25709f977fb7SOctavian Purdila bool first = 1; 25719f977fb7SOctavian Purdila size_t left = *lenp; 25729f977fb7SOctavian Purdila unsigned long bitmap_len = table->maxlen; 2573122ff243SWANG Cong unsigned long *bitmap = *(unsigned long **) table->data; 25749f977fb7SOctavian Purdila unsigned long *tmp_bitmap = NULL; 25759f977fb7SOctavian Purdila char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c; 25769f977fb7SOctavian Purdila 2577122ff243SWANG Cong if (!bitmap || !bitmap_len || !left || (*ppos && !write)) { 25789f977fb7SOctavian Purdila *lenp = 0; 25799f977fb7SOctavian Purdila return 0; 25809f977fb7SOctavian Purdila } 25819f977fb7SOctavian Purdila 25829f977fb7SOctavian Purdila if (write) { 25839f977fb7SOctavian Purdila unsigned long page = 0; 25849f977fb7SOctavian Purdila char *kbuf; 25859f977fb7SOctavian Purdila 25869f977fb7SOctavian Purdila if (left > PAGE_SIZE - 1) 25879f977fb7SOctavian Purdila left = PAGE_SIZE - 1; 25889f977fb7SOctavian Purdila 25899f977fb7SOctavian Purdila page = __get_free_page(GFP_TEMPORARY); 25909f977fb7SOctavian Purdila kbuf = (char *) page; 25919f977fb7SOctavian Purdila if (!kbuf) 25929f977fb7SOctavian Purdila return -ENOMEM; 25939f977fb7SOctavian Purdila if (copy_from_user(kbuf, buffer, left)) { 25949f977fb7SOctavian Purdila free_page(page); 25959f977fb7SOctavian Purdila return -EFAULT; 25969f977fb7SOctavian Purdila } 25979f977fb7SOctavian Purdila kbuf[left] = 0; 25989f977fb7SOctavian Purdila 25999f977fb7SOctavian Purdila tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long), 26009f977fb7SOctavian Purdila GFP_KERNEL); 26019f977fb7SOctavian Purdila if (!tmp_bitmap) { 26029f977fb7SOctavian Purdila free_page(page); 26039f977fb7SOctavian Purdila return -ENOMEM; 26049f977fb7SOctavian Purdila } 26059f977fb7SOctavian Purdila proc_skip_char(&kbuf, &left, '\n'); 26069f977fb7SOctavian Purdila while (!err && left) { 26079f977fb7SOctavian Purdila unsigned long val_a, val_b; 26089f977fb7SOctavian Purdila bool neg; 26099f977fb7SOctavian Purdila 26109f977fb7SOctavian Purdila err = proc_get_long(&kbuf, &left, &val_a, &neg, tr_a, 26119f977fb7SOctavian Purdila sizeof(tr_a), &c); 26129f977fb7SOctavian Purdila if (err) 26139f977fb7SOctavian Purdila break; 26149f977fb7SOctavian Purdila if (val_a >= bitmap_len || neg) { 26159f977fb7SOctavian Purdila err = -EINVAL; 26169f977fb7SOctavian Purdila break; 26179f977fb7SOctavian Purdila } 26189f977fb7SOctavian Purdila 26199f977fb7SOctavian Purdila val_b = val_a; 26209f977fb7SOctavian Purdila if (left) { 26219f977fb7SOctavian Purdila kbuf++; 26229f977fb7SOctavian Purdila left--; 26239f977fb7SOctavian Purdila } 26249f977fb7SOctavian Purdila 26259f977fb7SOctavian Purdila if (c == '-') { 26269f977fb7SOctavian Purdila err = proc_get_long(&kbuf, &left, &val_b, 26279f977fb7SOctavian Purdila &neg, tr_b, sizeof(tr_b), 26289f977fb7SOctavian Purdila &c); 26299f977fb7SOctavian Purdila if (err) 26309f977fb7SOctavian Purdila break; 26319f977fb7SOctavian Purdila if (val_b >= bitmap_len || neg || 26329f977fb7SOctavian Purdila val_a > val_b) { 26339f977fb7SOctavian Purdila err = -EINVAL; 26349f977fb7SOctavian Purdila break; 26359f977fb7SOctavian Purdila } 26369f977fb7SOctavian Purdila if (left) { 26379f977fb7SOctavian Purdila kbuf++; 26389f977fb7SOctavian Purdila left--; 26399f977fb7SOctavian Purdila } 26409f977fb7SOctavian Purdila } 26419f977fb7SOctavian Purdila 26425a04cca6SAkinobu Mita bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1); 26439f977fb7SOctavian Purdila first = 0; 26449f977fb7SOctavian Purdila proc_skip_char(&kbuf, &left, '\n'); 26459f977fb7SOctavian Purdila } 26469f977fb7SOctavian Purdila free_page(page); 26479f977fb7SOctavian Purdila } else { 26489f977fb7SOctavian Purdila unsigned long bit_a, bit_b = 0; 26499f977fb7SOctavian Purdila 26509f977fb7SOctavian Purdila while (left) { 26519f977fb7SOctavian Purdila bit_a = find_next_bit(bitmap, bitmap_len, bit_b); 26529f977fb7SOctavian Purdila if (bit_a >= bitmap_len) 26539f977fb7SOctavian Purdila break; 26549f977fb7SOctavian Purdila bit_b = find_next_zero_bit(bitmap, bitmap_len, 26559f977fb7SOctavian Purdila bit_a + 1) - 1; 26569f977fb7SOctavian Purdila 26579f977fb7SOctavian Purdila if (!first) { 26589f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, ','); 26599f977fb7SOctavian Purdila if (err) 26609f977fb7SOctavian Purdila break; 26619f977fb7SOctavian Purdila } 26629f977fb7SOctavian Purdila err = proc_put_long(&buffer, &left, bit_a, false); 26639f977fb7SOctavian Purdila if (err) 26649f977fb7SOctavian Purdila break; 26659f977fb7SOctavian Purdila if (bit_a != bit_b) { 26669f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, '-'); 26679f977fb7SOctavian Purdila if (err) 26689f977fb7SOctavian Purdila break; 26699f977fb7SOctavian Purdila err = proc_put_long(&buffer, &left, bit_b, false); 26709f977fb7SOctavian Purdila if (err) 26719f977fb7SOctavian Purdila break; 26729f977fb7SOctavian Purdila } 26739f977fb7SOctavian Purdila 26749f977fb7SOctavian Purdila first = 0; bit_b++; 26759f977fb7SOctavian Purdila } 26769f977fb7SOctavian Purdila if (!err) 26779f977fb7SOctavian Purdila err = proc_put_char(&buffer, &left, '\n'); 26789f977fb7SOctavian Purdila } 26799f977fb7SOctavian Purdila 26809f977fb7SOctavian Purdila if (!err) { 26819f977fb7SOctavian Purdila if (write) { 26829f977fb7SOctavian Purdila if (*ppos) 26839f977fb7SOctavian Purdila bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len); 26849f977fb7SOctavian Purdila else 26855a04cca6SAkinobu Mita bitmap_copy(bitmap, tmp_bitmap, bitmap_len); 26869f977fb7SOctavian Purdila } 26879f977fb7SOctavian Purdila kfree(tmp_bitmap); 26889f977fb7SOctavian Purdila *lenp -= left; 26899f977fb7SOctavian Purdila *ppos += *lenp; 26909f977fb7SOctavian Purdila return 0; 26919f977fb7SOctavian Purdila } else { 26929f977fb7SOctavian Purdila kfree(tmp_bitmap); 26939f977fb7SOctavian Purdila return err; 26949f977fb7SOctavian Purdila } 26959f977fb7SOctavian Purdila } 26969f977fb7SOctavian Purdila 269755610500SJovi Zhang #else /* CONFIG_PROC_SYSCTL */ 26981da177e4SLinus Torvalds 26998d65af78SAlexey Dobriyan int proc_dostring(struct ctl_table *table, int write, 27001da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27011da177e4SLinus Torvalds { 27021da177e4SLinus Torvalds return -ENOSYS; 27031da177e4SLinus Torvalds } 27041da177e4SLinus Torvalds 27058d65af78SAlexey Dobriyan int proc_dointvec(struct ctl_table *table, int write, 27061da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27071da177e4SLinus Torvalds { 27081da177e4SLinus Torvalds return -ENOSYS; 27091da177e4SLinus Torvalds } 27101da177e4SLinus Torvalds 27118d65af78SAlexey Dobriyan int proc_dointvec_minmax(struct ctl_table *table, int write, 27121da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27131da177e4SLinus Torvalds { 27141da177e4SLinus Torvalds return -ENOSYS; 27151da177e4SLinus Torvalds } 27161da177e4SLinus Torvalds 27178d65af78SAlexey Dobriyan int proc_dointvec_jiffies(struct ctl_table *table, int write, 27181da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27191da177e4SLinus Torvalds { 27201da177e4SLinus Torvalds return -ENOSYS; 27211da177e4SLinus Torvalds } 27221da177e4SLinus Torvalds 27238d65af78SAlexey Dobriyan int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, 27241da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27251da177e4SLinus Torvalds { 27261da177e4SLinus Torvalds return -ENOSYS; 27271da177e4SLinus Torvalds } 27281da177e4SLinus Torvalds 27298d65af78SAlexey Dobriyan int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, 27301da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27311da177e4SLinus Torvalds { 27321da177e4SLinus Torvalds return -ENOSYS; 27331da177e4SLinus Torvalds } 27341da177e4SLinus Torvalds 27358d65af78SAlexey Dobriyan int proc_doulongvec_minmax(struct ctl_table *table, int write, 27361da177e4SLinus Torvalds void __user *buffer, size_t *lenp, loff_t *ppos) 27371da177e4SLinus Torvalds { 27381da177e4SLinus Torvalds return -ENOSYS; 27391da177e4SLinus Torvalds } 27401da177e4SLinus Torvalds 2741d8217f07SEric W. Biederman int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, 27421da177e4SLinus Torvalds void __user *buffer, 27431da177e4SLinus Torvalds size_t *lenp, loff_t *ppos) 27441da177e4SLinus Torvalds { 27451da177e4SLinus Torvalds return -ENOSYS; 27461da177e4SLinus Torvalds } 27471da177e4SLinus Torvalds 27481da177e4SLinus Torvalds 274955610500SJovi Zhang #endif /* CONFIG_PROC_SYSCTL */ 27501da177e4SLinus Torvalds 27511da177e4SLinus Torvalds /* 27521da177e4SLinus Torvalds * No sense putting this after each symbol definition, twice, 27531da177e4SLinus Torvalds * exception granted :-) 27541da177e4SLinus Torvalds */ 27551da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec); 27561da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_jiffies); 27571da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_minmax); 27581da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); 27591da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dointvec_ms_jiffies); 27601da177e4SLinus Torvalds EXPORT_SYMBOL(proc_dostring); 27611da177e4SLinus Torvalds EXPORT_SYMBOL(proc_doulongvec_minmax); 27621da177e4SLinus Torvalds EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); 2763