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