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