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