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_dointvec_minmax_sysadmin(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_sysadmin,
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_dointvec_minmax_sysadmin,
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#ifdef CONFIG_DEBUG_STACKOVERFLOW
807 {
808 .procname = "panic_on_stackoverflow",
809 .data = &sysctl_panic_on_stackoverflow,
810 .maxlen = sizeof(int),
811 .mode = 0644,
812 .proc_handler = proc_dointvec,
813 },
814#endif
815 {
816 .procname = "bootloader_type",
817 .data = &bootloader_type,
818 .maxlen = sizeof (int),
819 .mode = 0444,
820 .proc_handler = proc_dointvec,
821 },
822 {
823 .procname = "bootloader_version",
824 .data = &bootloader_version,
825 .maxlen = sizeof (int),
826 .mode = 0444,
827 .proc_handler = proc_dointvec,
828 },
829 {
830 .procname = "kstack_depth_to_print",
831 .data = &kstack_depth_to_print,
832 .maxlen = sizeof(int),
833 .mode = 0644,
834 .proc_handler = proc_dointvec,
835 },
836 {
837 .procname = "io_delay_type",
838 .data = &io_delay_type,
839 .maxlen = sizeof(int),
840 .mode = 0644,
841 .proc_handler = proc_dointvec,
842 },
843#endif
844#if defined(CONFIG_MMU)
845 {
846 .procname = "randomize_va_space",
847 .data = &randomize_va_space,
848 .maxlen = sizeof(int),
849 .mode = 0644,
850 .proc_handler = proc_dointvec,
851 },
852#endif
853#if defined(CONFIG_S390) && defined(CONFIG_SMP)
854 {
855 .procname = "spin_retry",
856 .data = &spin_retry,
857 .maxlen = sizeof (int),
858 .mode = 0644,
859 .proc_handler = proc_dointvec,
860 },
861#endif
862#if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
863 {
864 .procname = "acpi_video_flags",
865 .data = &acpi_realmode_flags,
866 .maxlen = sizeof (unsigned long),
867 .mode = 0644,
868 .proc_handler = proc_doulongvec_minmax,
869 },
870#endif
871#ifdef CONFIG_IA64
872 {
873 .procname = "ignore-unaligned-usertrap",
874 .data = &no_unaligned_warning,
875 .maxlen = sizeof (int),
876 .mode = 0644,
877 .proc_handler = proc_dointvec,
878 },
879 {
880 .procname = "unaligned-dump-stack",
881 .data = &unaligned_dump_stack,
882 .maxlen = sizeof (int),
883 .mode = 0644,
884 .proc_handler = proc_dointvec,
885 },
886#endif
887#ifdef CONFIG_DETECT_HUNG_TASK
888 {
889 .procname = "hung_task_panic",
890 .data = &sysctl_hung_task_panic,
891 .maxlen = sizeof(int),
892 .mode = 0644,
893 .proc_handler = proc_dointvec_minmax,
894 .extra1 = &zero,
895 .extra2 = &one,
896 },
897 {
898 .procname = "hung_task_check_count",
899 .data = &sysctl_hung_task_check_count,
900 .maxlen = sizeof(unsigned long),
901 .mode = 0644,
902 .proc_handler = proc_doulongvec_minmax,
903 },
904 {
905 .procname = "hung_task_timeout_secs",
906 .data = &sysctl_hung_task_timeout_secs,
907 .maxlen = sizeof(unsigned long),
908 .mode = 0644,
909 .proc_handler = proc_dohung_task_timeout_secs,
910 },
911 {
912 .procname = "hung_task_warnings",
913 .data = &sysctl_hung_task_warnings,
914 .maxlen = sizeof(unsigned long),
915 .mode = 0644,
916 .proc_handler = proc_doulongvec_minmax,
917 },
918#endif
919#ifdef CONFIG_COMPAT
920 {
921 .procname = "compat-log",
922 .data = &compat_log,
923 .maxlen = sizeof (int),
924 .mode = 0644,
925 .proc_handler = proc_dointvec,
926 },
927#endif
928#ifdef CONFIG_RT_MUTEXES
929 {
930 .procname = "max_lock_depth",
931 .data = &max_lock_depth,
932 .maxlen = sizeof(int),
933 .mode = 0644,
934 .proc_handler = proc_dointvec,
935 },
936#endif
937 {
938 .procname = "poweroff_cmd",
939 .data = &poweroff_cmd,
940 .maxlen = POWEROFF_CMD_PATH_LEN,
941 .mode = 0644,
942 .proc_handler = proc_dostring,
943 },
944#ifdef CONFIG_KEYS
945 {
946 .procname = "keys",
947 .mode = 0555,
948 .child = key_sysctls,
949 },
950#endif
951#ifdef CONFIG_RCU_TORTURE_TEST
952 {
953 .procname = "rcutorture_runnable",
954 .data = &rcutorture_runnable,
955 .maxlen = sizeof(int),
956 .mode = 0644,
957 .proc_handler = proc_dointvec,
958 },
959#endif
960#ifdef CONFIG_PERF_EVENTS
961
962
963
964
965
966
967 {
968 .procname = "perf_event_paranoid",
969 .data = &sysctl_perf_event_paranoid,
970 .maxlen = sizeof(sysctl_perf_event_paranoid),
971 .mode = 0644,
972 .proc_handler = proc_dointvec,
973 },
974 {
975 .procname = "perf_event_mlock_kb",
976 .data = &sysctl_perf_event_mlock,
977 .maxlen = sizeof(sysctl_perf_event_mlock),
978 .mode = 0644,
979 .proc_handler = proc_dointvec,
980 },
981 {
982 .procname = "perf_event_max_sample_rate",
983 .data = &sysctl_perf_event_sample_rate,
984 .maxlen = sizeof(sysctl_perf_event_sample_rate),
985 .mode = 0644,
986 .proc_handler = perf_proc_update_handler,
987 },
988#endif
989#ifdef CONFIG_KMEMCHECK
990 {
991 .procname = "kmemcheck",
992 .data = &kmemcheck_enabled,
993 .maxlen = sizeof(int),
994 .mode = 0644,
995 .proc_handler = proc_dointvec,
996 },
997#endif
998#ifdef CONFIG_BLOCK
999 {
1000 .procname = "blk_iopoll",
1001 .data = &blk_iopoll_enabled,
1002 .maxlen = sizeof(int),
1003 .mode = 0644,
1004 .proc_handler = proc_dointvec,
1005 },
1006#endif
1007 { }
1008};
1009
1010static struct ctl_table vm_table[] = {
1011 {
1012 .procname = "overcommit_memory",
1013 .data = &sysctl_overcommit_memory,
1014 .maxlen = sizeof(sysctl_overcommit_memory),
1015 .mode = 0644,
1016 .proc_handler = proc_dointvec_minmax,
1017 .extra1 = &zero,
1018 .extra2 = &two,
1019 },
1020 {
1021 .procname = "panic_on_oom",
1022 .data = &sysctl_panic_on_oom,
1023 .maxlen = sizeof(sysctl_panic_on_oom),
1024 .mode = 0644,
1025 .proc_handler = proc_dointvec_minmax,
1026 .extra1 = &zero,
1027 .extra2 = &two,
1028 },
1029 {
1030 .procname = "oom_kill_allocating_task",
1031 .data = &sysctl_oom_kill_allocating_task,
1032 .maxlen = sizeof(sysctl_oom_kill_allocating_task),
1033 .mode = 0644,
1034 .proc_handler = proc_dointvec,
1035 },
1036 {
1037 .procname = "oom_dump_tasks",
1038 .data = &sysctl_oom_dump_tasks,
1039 .maxlen = sizeof(sysctl_oom_dump_tasks),
1040 .mode = 0644,
1041 .proc_handler = proc_dointvec,
1042 },
1043 {
1044 .procname = "overcommit_ratio",
1045 .data = &sysctl_overcommit_ratio,
1046 .maxlen = sizeof(sysctl_overcommit_ratio),
1047 .mode = 0644,
1048 .proc_handler = proc_dointvec,
1049 },
1050 {
1051 .procname = "page-cluster",
1052 .data = &page_cluster,
1053 .maxlen = sizeof(int),
1054 .mode = 0644,
1055 .proc_handler = proc_dointvec_minmax,
1056 .extra1 = &zero,
1057 },
1058 {
1059 .procname = "dirty_background_ratio",
1060 .data = &dirty_background_ratio,
1061 .maxlen = sizeof(dirty_background_ratio),
1062 .mode = 0644,
1063 .proc_handler = dirty_background_ratio_handler,
1064 .extra1 = &zero,
1065 .extra2 = &one_hundred,
1066 },
1067 {
1068 .procname = "dirty_background_bytes",
1069 .data = &dirty_background_bytes,
1070 .maxlen = sizeof(dirty_background_bytes),
1071 .mode = 0644,
1072 .proc_handler = dirty_background_bytes_handler,
1073 .extra1 = &one_ul,
1074 },
1075 {
1076 .procname = "dirty_ratio",
1077 .data = &vm_dirty_ratio,
1078 .maxlen = sizeof(vm_dirty_ratio),
1079 .mode = 0644,
1080 .proc_handler = dirty_ratio_handler,
1081 .extra1 = &zero,
1082 .extra2 = &one_hundred,
1083 },
1084 {
1085 .procname = "dirty_bytes",
1086 .data = &vm_dirty_bytes,
1087 .maxlen = sizeof(vm_dirty_bytes),
1088 .mode = 0644,
1089 .proc_handler = dirty_bytes_handler,
1090 .extra1 = &dirty_bytes_min,
1091 },
1092 {
1093 .procname = "dirty_writeback_centisecs",
1094 .data = &dirty_writeback_interval,
1095 .maxlen = sizeof(dirty_writeback_interval),
1096 .mode = 0644,
1097 .proc_handler = dirty_writeback_centisecs_handler,
1098 },
1099 {
1100 .procname = "dirty_expire_centisecs",
1101 .data = &dirty_expire_interval,
1102 .maxlen = sizeof(dirty_expire_interval),
1103 .mode = 0644,
1104 .proc_handler = proc_dointvec_minmax,
1105 .extra1 = &zero,
1106 },
1107 {
1108 .procname = "nr_pdflush_threads",
1109 .data = &nr_pdflush_threads,
1110 .maxlen = sizeof nr_pdflush_threads,
1111 .mode = 0444 ,
1112 .proc_handler = proc_dointvec,
1113 },
1114 {
1115 .procname = "swappiness",
1116 .data = &vm_swappiness,
1117 .maxlen = sizeof(vm_swappiness),
1118 .mode = 0644,
1119 .proc_handler = proc_dointvec_minmax,
1120 .extra1 = &zero,
1121 .extra2 = &one_hundred,
1122 },
1123#ifdef CONFIG_HUGETLB_PAGE
1124 {
1125 .procname = "nr_hugepages",
1126 .data = NULL,
1127 .maxlen = sizeof(unsigned long),
1128 .mode = 0644,
1129 .proc_handler = hugetlb_sysctl_handler,
1130 .extra1 = (void *)&hugetlb_zero,
1131 .extra2 = (void *)&hugetlb_infinity,
1132 },
1133#ifdef CONFIG_NUMA
1134 {
1135 .procname = "nr_hugepages_mempolicy",
1136 .data = NULL,
1137 .maxlen = sizeof(unsigned long),
1138 .mode = 0644,
1139 .proc_handler = &hugetlb_mempolicy_sysctl_handler,
1140 .extra1 = (void *)&hugetlb_zero,
1141 .extra2 = (void *)&hugetlb_infinity,
1142 },
1143#endif
1144 {
1145 .procname = "hugetlb_shm_group",
1146 .data = &sysctl_hugetlb_shm_group,
1147 .maxlen = sizeof(gid_t),
1148 .mode = 0644,
1149 .proc_handler = proc_dointvec,
1150 },
1151 {
1152 .procname = "hugepages_treat_as_movable",
1153 .data = &hugepages_treat_as_movable,
1154 .maxlen = sizeof(int),
1155 .mode = 0644,
1156 .proc_handler = hugetlb_treat_movable_handler,
1157 },
1158 {
1159 .procname = "nr_overcommit_hugepages",
1160 .data = NULL,
1161 .maxlen = sizeof(unsigned long),
1162 .mode = 0644,
1163 .proc_handler = hugetlb_overcommit_handler,
1164 .extra1 = (void *)&hugetlb_zero,
1165 .extra2 = (void *)&hugetlb_infinity,
1166 },
1167#endif
1168 {
1169 .procname = "lowmem_reserve_ratio",
1170 .data = &sysctl_lowmem_reserve_ratio,
1171 .maxlen = sizeof(sysctl_lowmem_reserve_ratio),
1172 .mode = 0644,
1173 .proc_handler = lowmem_reserve_ratio_sysctl_handler,
1174 },
1175 {
1176 .procname = "drop_caches",
1177 .data = &sysctl_drop_caches,
1178 .maxlen = sizeof(int),
1179 .mode = 0644,
1180 .proc_handler = drop_caches_sysctl_handler,
1181 .extra1 = &one,
1182 .extra2 = &three,
1183 },
1184#ifdef CONFIG_COMPACTION
1185 {
1186 .procname = "compact_memory",
1187 .data = &sysctl_compact_memory,
1188 .maxlen = sizeof(int),
1189 .mode = 0200,
1190 .proc_handler = sysctl_compaction_handler,
1191 },
1192 {
1193 .procname = "extfrag_threshold",
1194 .data = &sysctl_extfrag_threshold,
1195 .maxlen = sizeof(int),
1196 .mode = 0644,
1197 .proc_handler = sysctl_extfrag_handler,
1198 .extra1 = &min_extfrag_threshold,
1199 .extra2 = &max_extfrag_threshold,
1200 },
1201
1202#endif
1203 {
1204 .procname = "min_free_kbytes",
1205 .data = &min_free_kbytes,
1206 .maxlen = sizeof(min_free_kbytes),
1207 .mode = 0644,
1208 .proc_handler = min_free_kbytes_sysctl_handler,
1209 .extra1 = &zero,
1210 },
1211 {
1212 .procname = "percpu_pagelist_fraction",
1213 .data = &percpu_pagelist_fraction,
1214 .maxlen = sizeof(percpu_pagelist_fraction),
1215 .mode = 0644,
1216 .proc_handler = percpu_pagelist_fraction_sysctl_handler,
1217 .extra1 = &min_percpu_pagelist_fract,
1218 },
1219#ifdef CONFIG_MMU
1220 {
1221 .procname = "max_map_count",
1222 .data = &sysctl_max_map_count,
1223 .maxlen = sizeof(sysctl_max_map_count),
1224 .mode = 0644,
1225 .proc_handler = proc_dointvec_minmax,
1226 .extra1 = &zero,
1227 },
1228#else
1229 {
1230 .procname = "nr_trim_pages",
1231 .data = &sysctl_nr_trim_pages,
1232 .maxlen = sizeof(sysctl_nr_trim_pages),
1233 .mode = 0644,
1234 .proc_handler = proc_dointvec_minmax,
1235 .extra1 = &zero,
1236 },
1237#endif
1238 {
1239 .procname = "laptop_mode",
1240 .data = &laptop_mode,
1241 .maxlen = sizeof(laptop_mode),
1242 .mode = 0644,
1243 .proc_handler = proc_dointvec_jiffies,
1244 },
1245 {
1246 .procname = "block_dump",
1247 .data = &block_dump,
1248 .maxlen = sizeof(block_dump),
1249 .mode = 0644,
1250 .proc_handler = proc_dointvec,
1251 .extra1 = &zero,
1252 },
1253 {
1254 .procname = "vfs_cache_pressure",
1255 .data = &sysctl_vfs_cache_pressure,
1256 .maxlen = sizeof(sysctl_vfs_cache_pressure),
1257 .mode = 0644,
1258 .proc_handler = proc_dointvec,
1259 .extra1 = &zero,
1260 },
1261#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
1262 {
1263 .procname = "legacy_va_layout",
1264 .data = &sysctl_legacy_va_layout,
1265 .maxlen = sizeof(sysctl_legacy_va_layout),
1266 .mode = 0644,
1267 .proc_handler = proc_dointvec,
1268 .extra1 = &zero,
1269 },
1270#endif
1271#ifdef CONFIG_NUMA
1272 {
1273 .procname = "zone_reclaim_mode",
1274 .data = &zone_reclaim_mode,
1275 .maxlen = sizeof(zone_reclaim_mode),
1276 .mode = 0644,
1277 .proc_handler = proc_dointvec,
1278 .extra1 = &zero,
1279 },
1280 {
1281 .procname = "min_unmapped_ratio",
1282 .data = &sysctl_min_unmapped_ratio,
1283 .maxlen = sizeof(sysctl_min_unmapped_ratio),
1284 .mode = 0644,
1285 .proc_handler = sysctl_min_unmapped_ratio_sysctl_handler,
1286 .extra1 = &zero,
1287 .extra2 = &one_hundred,
1288 },
1289 {
1290 .procname = "min_slab_ratio",
1291 .data = &sysctl_min_slab_ratio,
1292 .maxlen = sizeof(sysctl_min_slab_ratio),
1293 .mode = 0644,
1294 .proc_handler = sysctl_min_slab_ratio_sysctl_handler,
1295 .extra1 = &zero,
1296 .extra2 = &one_hundred,
1297 },
1298#endif
1299#ifdef CONFIG_SMP
1300 {
1301 .procname = "stat_interval",
1302 .data = &sysctl_stat_interval,
1303 .maxlen = sizeof(sysctl_stat_interval),
1304 .mode = 0644,
1305 .proc_handler = proc_dointvec_jiffies,
1306 },
1307#endif
1308#ifdef CONFIG_MMU
1309 {
1310 .procname = "mmap_min_addr",
1311 .data = &dac_mmap_min_addr,
1312 .maxlen = sizeof(unsigned long),
1313 .mode = 0644,
1314 .proc_handler = mmap_min_addr_handler,
1315 },
1316#endif
1317#ifdef CONFIG_NUMA
1318 {
1319 .procname = "numa_zonelist_order",
1320 .data = &numa_zonelist_order,
1321 .maxlen = NUMA_ZONELIST_ORDER_LEN,
1322 .mode = 0644,
1323 .proc_handler = numa_zonelist_order_handler,
1324 },
1325#endif
1326#if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
1327 (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
1328 {
1329 .procname = "vdso_enabled",
1330 .data = &vdso_enabled,
1331 .maxlen = sizeof(vdso_enabled),
1332 .mode = 0644,
1333 .proc_handler = proc_dointvec,
1334 .extra1 = &zero,
1335 },
1336#endif
1337#ifdef CONFIG_HIGHMEM
1338 {
1339 .procname = "highmem_is_dirtyable",
1340 .data = &vm_highmem_is_dirtyable,
1341 .maxlen = sizeof(vm_highmem_is_dirtyable),
1342 .mode = 0644,
1343 .proc_handler = proc_dointvec_minmax,
1344 .extra1 = &zero,
1345 .extra2 = &one,
1346 },
1347#endif
1348 {
1349 .procname = "scan_unevictable_pages",
1350 .data = &scan_unevictable_pages,
1351 .maxlen = sizeof(scan_unevictable_pages),
1352 .mode = 0644,
1353 .proc_handler = scan_unevictable_handler,
1354 },
1355#ifdef CONFIG_MEMORY_FAILURE
1356 {
1357 .procname = "memory_failure_early_kill",
1358 .data = &sysctl_memory_failure_early_kill,
1359 .maxlen = sizeof(sysctl_memory_failure_early_kill),
1360 .mode = 0644,
1361 .proc_handler = proc_dointvec_minmax,
1362 .extra1 = &zero,
1363 .extra2 = &one,
1364 },
1365 {
1366 .procname = "memory_failure_recovery",
1367 .data = &sysctl_memory_failure_recovery,
1368 .maxlen = sizeof(sysctl_memory_failure_recovery),
1369 .mode = 0644,
1370 .proc_handler = proc_dointvec_minmax,
1371 .extra1 = &zero,
1372 .extra2 = &one,
1373 },
1374#endif
1375 { }
1376};
1377
1378#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
1379static struct ctl_table binfmt_misc_table[] = {
1380 { }
1381};
1382#endif
1383
1384static struct ctl_table fs_table[] = {
1385 {
1386 .procname = "inode-nr",
1387 .data = &inodes_stat,
1388 .maxlen = 2*sizeof(int),
1389 .mode = 0444,
1390 .proc_handler = proc_nr_inodes,
1391 },
1392 {
1393 .procname = "inode-state",
1394 .data = &inodes_stat,
1395 .maxlen = 7*sizeof(int),
1396 .mode = 0444,
1397 .proc_handler = proc_nr_inodes,
1398 },
1399 {
1400 .procname = "file-nr",
1401 .data = &files_stat,
1402 .maxlen = sizeof(files_stat),
1403 .mode = 0444,
1404 .proc_handler = proc_nr_files,
1405 },
1406 {
1407 .procname = "file-max",
1408 .data = &files_stat.max_files,
1409 .maxlen = sizeof(files_stat.max_files),
1410 .mode = 0644,
1411 .proc_handler = proc_doulongvec_minmax,
1412 },
1413 {
1414 .procname = "nr_open",
1415 .data = &sysctl_nr_open,
1416 .maxlen = sizeof(int),
1417 .mode = 0644,
1418 .proc_handler = proc_dointvec_minmax,
1419 .extra1 = &sysctl_nr_open_min,
1420 .extra2 = &sysctl_nr_open_max,
1421 },
1422 {
1423 .procname = "dentry-state",
1424 .data = &dentry_stat,
1425 .maxlen = 6*sizeof(int),
1426 .mode = 0444,
1427 .proc_handler = proc_nr_dentry,
1428 },
1429 {
1430 .procname = "overflowuid",
1431 .data = &fs_overflowuid,
1432 .maxlen = sizeof(int),
1433 .mode = 0644,
1434 .proc_handler = proc_dointvec_minmax,
1435 .extra1 = &minolduid,
1436 .extra2 = &maxolduid,
1437 },
1438 {
1439 .procname = "overflowgid",
1440 .data = &fs_overflowgid,
1441 .maxlen = sizeof(int),
1442 .mode = 0644,
1443 .proc_handler = proc_dointvec_minmax,
1444 .extra1 = &minolduid,
1445 .extra2 = &maxolduid,
1446 },
1447#ifdef CONFIG_FILE_LOCKING
1448 {
1449 .procname = "leases-enable",
1450 .data = &leases_enable,
1451 .maxlen = sizeof(int),
1452 .mode = 0644,
1453 .proc_handler = proc_dointvec,
1454 },
1455#endif
1456#ifdef CONFIG_DNOTIFY
1457 {
1458 .procname = "dir-notify-enable",
1459 .data = &dir_notify_enable,
1460 .maxlen = sizeof(int),
1461 .mode = 0644,
1462 .proc_handler = proc_dointvec,
1463 },
1464#endif
1465#ifdef CONFIG_MMU
1466#ifdef CONFIG_FILE_LOCKING
1467 {
1468 .procname = "lease-break-time",
1469 .data = &lease_break_time,
1470 .maxlen = sizeof(int),
1471 .mode = 0644,
1472 .proc_handler = proc_dointvec,
1473 },
1474#endif
1475#ifdef CONFIG_AIO
1476 {
1477 .procname = "aio-nr",
1478 .data = &aio_nr,
1479 .maxlen = sizeof(aio_nr),
1480 .mode = 0444,
1481 .proc_handler = proc_doulongvec_minmax,
1482 },
1483 {
1484 .procname = "aio-max-nr",
1485 .data = &aio_max_nr,
1486 .maxlen = sizeof(aio_max_nr),
1487 .mode = 0644,
1488 .proc_handler = proc_doulongvec_minmax,
1489 },
1490#endif
1491#ifdef CONFIG_INOTIFY_USER
1492 {
1493 .procname = "inotify",
1494 .mode = 0555,
1495 .child = inotify_table,
1496 },
1497#endif
1498#ifdef CONFIG_EPOLL
1499 {
1500 .procname = "epoll",
1501 .mode = 0555,
1502 .child = epoll_table,
1503 },
1504#endif
1505#endif
1506 {
1507 .procname = "suid_dumpable",
1508 .data = &suid_dumpable,
1509 .maxlen = sizeof(int),
1510 .mode = 0644,
1511 .proc_handler = proc_dointvec_minmax,
1512 .extra1 = &zero,
1513 .extra2 = &two,
1514 },
1515#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
1516 {
1517 .procname = "binfmt_misc",
1518 .mode = 0555,
1519 .child = binfmt_misc_table,
1520 },
1521#endif
1522 {
1523 .procname = "pipe-max-size",
1524 .data = &pipe_max_size,
1525 .maxlen = sizeof(int),
1526 .mode = 0644,
1527 .proc_handler = &pipe_proc_fn,
1528 .extra1 = &pipe_min_size,
1529 },
1530 { }
1531};
1532
1533static struct ctl_table debug_table[] = {
1534#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) || \
1535 defined(CONFIG_S390) || defined(CONFIG_TILE)
1536 {
1537 .procname = "exception-trace",
1538 .data = &show_unhandled_signals,
1539 .maxlen = sizeof(int),
1540 .mode = 0644,
1541 .proc_handler = proc_dointvec
1542 },
1543#endif
1544#if defined(CONFIG_OPTPROBES)
1545 {
1546 .procname = "kprobes-optimization",
1547 .data = &sysctl_kprobes_optimization,
1548 .maxlen = sizeof(int),
1549 .mode = 0644,
1550 .proc_handler = proc_kprobes_optimization_handler,
1551 .extra1 = &zero,
1552 .extra2 = &one,
1553 },
1554#endif
1555 { }
1556};
1557
1558static struct ctl_table dev_table[] = {
1559 { }
1560};
1561
1562static DEFINE_SPINLOCK(sysctl_lock);
1563
1564
1565static int use_table(struct ctl_table_header *p)
1566{
1567 if (unlikely(p->unregistering))
1568 return 0;
1569 p->used++;
1570 return 1;
1571}
1572
1573
1574static void unuse_table(struct ctl_table_header *p)
1575{
1576 if (!--p->used)
1577 if (unlikely(p->unregistering))
1578 complete(p->unregistering);
1579}
1580
1581
1582static void start_unregistering(struct ctl_table_header *p)
1583{
1584
1585
1586
1587
1588 if (unlikely(p->used)) {
1589 struct completion wait;
1590 init_completion(&wait);
1591 p->unregistering = &wait;
1592 spin_unlock(&sysctl_lock);
1593 wait_for_completion(&wait);
1594 spin_lock(&sysctl_lock);
1595 } else {
1596
1597 p->unregistering = ERR_PTR(-EINVAL);
1598 }
1599
1600
1601
1602
1603 list_del_init(&p->ctl_entry);
1604}
1605
1606void sysctl_head_get(struct ctl_table_header *head)
1607{
1608 spin_lock(&sysctl_lock);
1609 head->count++;
1610 spin_unlock(&sysctl_lock);
1611}
1612
1613void sysctl_head_put(struct ctl_table_header *head)
1614{
1615 spin_lock(&sysctl_lock);
1616 if (!--head->count)
1617 kfree_rcu(head, rcu);
1618 spin_unlock(&sysctl_lock);
1619}
1620
1621struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
1622{
1623 if (!head)
1624 BUG();
1625 spin_lock(&sysctl_lock);
1626 if (!use_table(head))
1627 head = ERR_PTR(-ENOENT);
1628 spin_unlock(&sysctl_lock);
1629 return head;
1630}
1631
1632void sysctl_head_finish(struct ctl_table_header *head)
1633{
1634 if (!head)
1635 return;
1636 spin_lock(&sysctl_lock);
1637 unuse_table(head);
1638 spin_unlock(&sysctl_lock);
1639}
1640
1641static struct ctl_table_set *
1642lookup_header_set(struct ctl_table_root *root, struct nsproxy *namespaces)
1643{
1644 struct ctl_table_set *set = &root->default_set;
1645 if (root->lookup)
1646 set = root->lookup(root, namespaces);
1647 return set;
1648}
1649
1650static struct list_head *
1651lookup_header_list(struct ctl_table_root *root, struct nsproxy *namespaces)
1652{
1653 struct ctl_table_set *set = lookup_header_set(root, namespaces);
1654 return &set->list;
1655}
1656
1657struct ctl_table_header *__sysctl_head_next(struct nsproxy *namespaces,
1658 struct ctl_table_header *prev)
1659{
1660 struct ctl_table_root *root;
1661 struct list_head *header_list;
1662 struct ctl_table_header *head;
1663 struct list_head *tmp;
1664
1665 spin_lock(&sysctl_lock);
1666 if (prev) {
1667 head = prev;
1668 tmp = &prev->ctl_entry;
1669 unuse_table(prev);
1670 goto next;
1671 }
1672 tmp = &root_table_header.ctl_entry;
1673 for (;;) {
1674 head = list_entry(tmp, struct ctl_table_header, ctl_entry);
1675
1676 if (!use_table(head))
1677 goto next;
1678 spin_unlock(&sysctl_lock);
1679 return head;
1680 next:
1681 root = head->root;
1682 tmp = tmp->next;
1683 header_list = lookup_header_list(root, namespaces);
1684 if (tmp != header_list)
1685 continue;
1686
1687 do {
1688 root = list_entry(root->root_list.next,
1689 struct ctl_table_root, root_list);
1690 if (root == &sysctl_table_root)
1691 goto out;
1692 header_list = lookup_header_list(root, namespaces);
1693 } while (list_empty(header_list));
1694 tmp = header_list->next;
1695 }
1696out:
1697 spin_unlock(&sysctl_lock);
1698 return NULL;
1699}
1700
1701struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev)
1702{
1703 return __sysctl_head_next(current->nsproxy, prev);
1704}
1705
1706void register_sysctl_root(struct ctl_table_root *root)
1707{
1708 spin_lock(&sysctl_lock);
1709 list_add_tail(&root->root_list, &sysctl_table_root.root_list);
1710 spin_unlock(&sysctl_lock);
1711}
1712
1713
1714
1715
1716
1717
1718static int test_perm(int mode, int op)
1719{
1720 if (!current_euid())
1721 mode >>= 6;
1722 else if (in_egroup_p(0))
1723 mode >>= 3;
1724 if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
1725 return 0;
1726 return -EACCES;
1727}
1728
1729int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op)
1730{
1731 int mode;
1732
1733 if (root->permissions)
1734 mode = root->permissions(root, current->nsproxy, table);
1735 else
1736 mode = table->mode;
1737
1738 return test_perm(mode, op);
1739}
1740
1741static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
1742{
1743 for (; table->procname; table++) {
1744 table->parent = parent;
1745 if (table->child)
1746 sysctl_set_parent(table, table->child);
1747 }
1748}
1749
1750static __init int sysctl_init(void)
1751{
1752 sysctl_set_parent(NULL, root_table);
1753#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
1754 sysctl_check_table(current->nsproxy, root_table);
1755#endif
1756 return 0;
1757}
1758
1759core_initcall(sysctl_init);
1760
1761static struct ctl_table *is_branch_in(struct ctl_table *branch,
1762 struct ctl_table *table)
1763{
1764 struct ctl_table *p;
1765 const char *s = branch->procname;
1766
1767
1768 if (!s || !branch->child)
1769 return NULL;
1770
1771
1772 if (branch[1].procname)
1773 return NULL;
1774
1775
1776 for (p = table; p->procname; p++) {
1777 if (!p->child)
1778 continue;
1779 if (p->procname && strcmp(p->procname, s) == 0)
1780 return p;
1781 }
1782 return NULL;
1783}
1784
1785
1786static void try_attach(struct ctl_table_header *p, struct ctl_table_header *q)
1787{
1788 struct ctl_table *to = p->ctl_table, *by = q->ctl_table;
1789 struct ctl_table *next;
1790 int is_better = 0;
1791 int not_in_parent = !p->attached_by;
1792
1793 while ((next = is_branch_in(by, to)) != NULL) {
1794 if (by == q->attached_by)
1795 is_better = 1;
1796 if (to == p->attached_by)
1797 not_in_parent = 1;
1798 by = by->child;
1799 to = next->child;
1800 }
1801
1802 if (is_better && not_in_parent) {
1803 q->attached_by = by;
1804 q->attached_to = to;
1805 q->parent = p;
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
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862struct ctl_table_header *__register_sysctl_paths(
1863 struct ctl_table_root *root,
1864 struct nsproxy *namespaces,
1865 const struct ctl_path *path, struct ctl_table *table)
1866{
1867 struct ctl_table_header *header;
1868 struct ctl_table *new, **prevp;
1869 unsigned int n, npath;
1870 struct ctl_table_set *set;
1871
1872
1873 for (npath = 0; path[npath].procname; ++npath)
1874 ;
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884 header = kzalloc(sizeof(struct ctl_table_header) +
1885 (2 * npath * sizeof(struct ctl_table)), GFP_KERNEL);
1886 if (!header)
1887 return NULL;
1888
1889 new = (struct ctl_table *) (header + 1);
1890
1891
1892 prevp = &header->ctl_table;
1893 for (n = 0; n < npath; ++n, ++path) {
1894
1895 new->procname = path->procname;
1896 new->mode = 0555;
1897
1898 *prevp = new;
1899 prevp = &new->child;
1900
1901 new += 2;
1902 }
1903 *prevp = table;
1904 header->ctl_table_arg = table;
1905
1906 INIT_LIST_HEAD(&header->ctl_entry);
1907 header->used = 0;
1908 header->unregistering = NULL;
1909 header->root = root;
1910 sysctl_set_parent(NULL, header->ctl_table);
1911 header->count = 1;
1912#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
1913 if (sysctl_check_table(namespaces, header->ctl_table)) {
1914 kfree(header);
1915 return NULL;
1916 }
1917#endif
1918 spin_lock(&sysctl_lock);
1919 header->set = lookup_header_set(root, namespaces);
1920 header->attached_by = header->ctl_table;
1921 header->attached_to = root_table;
1922 header->parent = &root_table_header;
1923 for (set = header->set; set; set = set->parent) {
1924 struct ctl_table_header *p;
1925 list_for_each_entry(p, &set->list, ctl_entry) {
1926 if (p->unregistering)
1927 continue;
1928 try_attach(p, header);
1929 }
1930 }
1931 header->parent->count++;
1932 list_add_tail(&header->ctl_entry, &header->set->list);
1933 spin_unlock(&sysctl_lock);
1934
1935 return header;
1936}
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
1949 struct ctl_table *table)
1950{
1951 return __register_sysctl_paths(&sysctl_table_root, current->nsproxy,
1952 path, table);
1953}
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
1965{
1966 static const struct ctl_path null_path[] = { {} };
1967
1968 return register_sysctl_paths(null_path, table);
1969}
1970
1971
1972
1973
1974
1975
1976
1977
1978void unregister_sysctl_table(struct ctl_table_header * header)
1979{
1980 might_sleep();
1981
1982 if (header == NULL)
1983 return;
1984
1985 spin_lock(&sysctl_lock);
1986 start_unregistering(header);
1987 if (!--header->parent->count) {
1988 WARN_ON(1);
1989 kfree_rcu(header->parent, rcu);
1990 }
1991 if (!--header->count)
1992 kfree_rcu(header, rcu);
1993 spin_unlock(&sysctl_lock);
1994}
1995
1996int sysctl_is_seen(struct ctl_table_header *p)
1997{
1998 struct ctl_table_set *set = p->set;
1999 int res;
2000 spin_lock(&sysctl_lock);
2001 if (p->unregistering)
2002 res = 0;
2003 else if (!set->is_seen)
2004 res = 1;
2005 else
2006 res = set->is_seen(set);
2007 spin_unlock(&sysctl_lock);
2008 return res;
2009}
2010
2011void setup_sysctl_set(struct ctl_table_set *p,
2012 struct ctl_table_set *parent,
2013 int (*is_seen)(struct ctl_table_set *))
2014{
2015 INIT_LIST_HEAD(&p->list);
2016 p->parent = parent ? parent : &sysctl_table_root.default_set;
2017 p->is_seen = is_seen;
2018}
2019
2020#else
2021struct ctl_table_header *register_sysctl_table(struct ctl_table * table)
2022{
2023 return NULL;
2024}
2025
2026struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
2027 struct ctl_table *table)
2028{
2029 return NULL;
2030}
2031
2032void unregister_sysctl_table(struct ctl_table_header * table)
2033{
2034}
2035
2036void setup_sysctl_set(struct ctl_table_set *p,
2037 struct ctl_table_set *parent,
2038 int (*is_seen)(struct ctl_table_set *))
2039{
2040}
2041
2042void sysctl_head_put(struct ctl_table_header *head)
2043{
2044}
2045
2046#endif
2047
2048
2049
2050
2051
2052#ifdef CONFIG_PROC_SYSCTL
2053
2054static int _proc_do_string(void* data, int maxlen, int write,
2055 void __user *buffer,
2056 size_t *lenp, loff_t *ppos)
2057{
2058 size_t len;
2059 char __user *p;
2060 char c;
2061
2062 if (!data || !maxlen || !*lenp) {
2063 *lenp = 0;
2064 return 0;
2065 }
2066
2067 if (write) {
2068 len = 0;
2069 p = buffer;
2070 while (len < *lenp) {
2071 if (get_user(c, p++))
2072 return -EFAULT;
2073 if (c == 0 || c == '\n')
2074 break;
2075 len++;
2076 }
2077 if (len >= maxlen)
2078 len = maxlen-1;
2079 if(copy_from_user(data, buffer, len))
2080 return -EFAULT;
2081 ((char *) data)[len] = 0;
2082 *ppos += *lenp;
2083 } else {
2084 len = strlen(data);
2085 if (len > maxlen)
2086 len = maxlen;
2087
2088 if (*ppos > len) {
2089 *lenp = 0;
2090 return 0;
2091 }
2092
2093 data += *ppos;
2094 len -= *ppos;
2095
2096 if (len > *lenp)
2097 len = *lenp;
2098 if (len)
2099 if(copy_to_user(buffer, data, len))
2100 return -EFAULT;
2101 if (len < *lenp) {
2102 if(put_user('\n', ((char __user *) buffer) + len))
2103 return -EFAULT;
2104 len++;
2105 }
2106 *lenp = len;
2107 *ppos += len;
2108 }
2109 return 0;
2110}
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129int proc_dostring(struct ctl_table *table, int write,
2130 void __user *buffer, size_t *lenp, loff_t *ppos)
2131{
2132 return _proc_do_string(table->data, table->maxlen, write,
2133 buffer, lenp, ppos);
2134}
2135
2136static size_t proc_skip_spaces(char **buf)
2137{
2138 size_t ret;
2139 char *tmp = skip_spaces(*buf);
2140 ret = tmp - *buf;
2141 *buf = tmp;
2142 return ret;
2143}
2144
2145static void proc_skip_char(char **buf, size_t *size, const char v)
2146{
2147 while (*size) {
2148 if (**buf != v)
2149 break;
2150 (*size)--;
2151 (*buf)++;
2152 }
2153}
2154
2155#define TMPBUFLEN 22
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172static int proc_get_long(char **buf, size_t *size,
2173 unsigned long *val, bool *neg,
2174 const char *perm_tr, unsigned perm_tr_len, char *tr)
2175{
2176 int len;
2177 char *p, tmp[TMPBUFLEN];
2178
2179 if (!*size)
2180 return -EINVAL;
2181
2182 len = *size;
2183 if (len > TMPBUFLEN - 1)
2184 len = TMPBUFLEN - 1;
2185
2186 memcpy(tmp, *buf, len);
2187
2188 tmp[len] = 0;
2189 p = tmp;
2190 if (*p == '-' && *size > 1) {
2191 *neg = true;
2192 p++;
2193 } else
2194 *neg = false;
2195 if (!isdigit(*p))
2196 return -EINVAL;
2197
2198 *val = simple_strtoul(p, &p, 0);
2199
2200 len = p - tmp;
2201
2202
2203
2204
2205 if (len == TMPBUFLEN - 1)
2206 return -EINVAL;
2207
2208 if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len))
2209 return -EINVAL;
2210
2211 if (tr && (len < *size))
2212 *tr = *p;
2213
2214 *buf += len;
2215 *size -= len;
2216
2217 return 0;
2218}
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
2232 bool neg)
2233{
2234 int len;
2235 char tmp[TMPBUFLEN], *p = tmp;
2236
2237 sprintf(p, "%s%lu", neg ? "-" : "", val);
2238 len = strlen(tmp);
2239 if (len > *size)
2240 len = *size;
2241 if (copy_to_user(*buf, tmp, len))
2242 return -EFAULT;
2243 *size -= len;
2244 *buf += len;
2245 return 0;
2246}
2247#undef TMPBUFLEN
2248
2249static int proc_put_char(void __user **buf, size_t *size, char c)
2250{
2251 if (*size) {
2252 char __user **buffer = (char __user **)buf;
2253 if (put_user(c, *buffer))
2254 return -EFAULT;
2255 (*size)--, (*buffer)++;
2256 *buf = *buffer;
2257 }
2258 return 0;
2259}
2260
2261static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
2262 int *valp,
2263 int write, void *data)
2264{
2265 if (write) {
2266 *valp = *negp ? -*lvalp : *lvalp;
2267 } else {
2268 int val = *valp;
2269 if (val < 0) {
2270 *negp = true;
2271 *lvalp = (unsigned long)-val;
2272 } else {
2273 *negp = false;
2274 *lvalp = (unsigned long)val;
2275 }
2276 }
2277 return 0;
2278}
2279
2280static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
2281
2282static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
2283 int write, void __user *buffer,
2284 size_t *lenp, loff_t *ppos,
2285 int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
2286 int write, void *data),
2287 void *data)
2288{
2289 int *i, vleft, first = 1, err = 0;
2290 unsigned long page = 0;
2291 size_t left;
2292 char *kbuf;
2293
2294 if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
2295 *lenp = 0;
2296 return 0;
2297 }
2298
2299 i = (int *) tbl_data;
2300 vleft = table->maxlen / sizeof(*i);
2301 left = *lenp;
2302
2303 if (!conv)
2304 conv = do_proc_dointvec_conv;
2305
2306 if (write) {
2307 if (left > PAGE_SIZE - 1)
2308 left = PAGE_SIZE - 1;
2309 page = __get_free_page(GFP_TEMPORARY);
2310 kbuf = (char *) page;
2311 if (!kbuf)
2312 return -ENOMEM;
2313 if (copy_from_user(kbuf, buffer, left)) {
2314 err = -EFAULT;
2315 goto free;
2316 }
2317 kbuf[left] = 0;
2318 }
2319
2320 for (; left && vleft--; i++, first=0) {
2321 unsigned long lval;
2322 bool neg;
2323
2324 if (write) {
2325 left -= proc_skip_spaces(&kbuf);
2326
2327 if (!left)
2328 break;
2329 err = proc_get_long(&kbuf, &left, &lval, &neg,
2330 proc_wspace_sep,
2331 sizeof(proc_wspace_sep), NULL);
2332 if (err)
2333 break;
2334 if (conv(&neg, &lval, i, 1, data)) {
2335 err = -EINVAL;
2336 break;
2337 }
2338 } else {
2339 if (conv(&neg, &lval, i, 0, data)) {
2340 err = -EINVAL;
2341 break;
2342 }
2343 if (!first)
2344 err = proc_put_char(&buffer, &left, '\t');
2345 if (err)
2346 break;
2347 err = proc_put_long(&buffer, &left, lval, neg);
2348 if (err)
2349 break;
2350 }
2351 }
2352
2353 if (!write && !first && left && !err)
2354 err = proc_put_char(&buffer, &left, '\n');
2355 if (write && !err && left)
2356 left -= proc_skip_spaces(&kbuf);
2357free:
2358 if (write) {
2359 free_page(page);
2360 if (first)
2361 return err ? : -EINVAL;
2362 }
2363 *lenp -= left;
2364 *ppos += *lenp;
2365 return err;
2366}
2367
2368static int do_proc_dointvec(struct ctl_table *table, int write,
2369 void __user *buffer, size_t *lenp, loff_t *ppos,
2370 int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
2371 int write, void *data),
2372 void *data)
2373{
2374 return __do_proc_dointvec(table->data, table, write,
2375 buffer, lenp, ppos, conv, data);
2376}
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391int proc_dointvec(struct ctl_table *table, int write,
2392 void __user *buffer, size_t *lenp, loff_t *ppos)
2393{
2394 return do_proc_dointvec(table,write,buffer,lenp,ppos,
2395 NULL,NULL);
2396}
2397
2398
2399
2400
2401
2402static int proc_taint(struct ctl_table *table, int write,
2403 void __user *buffer, size_t *lenp, loff_t *ppos)
2404{
2405 struct ctl_table t;
2406 unsigned long tmptaint = get_taint();
2407 int err;
2408
2409 if (write && !capable(CAP_SYS_ADMIN))
2410 return -EPERM;
2411
2412 t = *table;
2413 t.data = &tmptaint;
2414 err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
2415 if (err < 0)
2416 return err;
2417
2418 if (write) {
2419
2420
2421
2422
2423 int i;
2424 for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
2425 if ((tmptaint >> i) & 1)
2426 add_taint(i);
2427 }
2428 }
2429
2430 return err;
2431}
2432
2433#ifdef CONFIG_PRINTK
2434static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
2435 void __user *buffer, size_t *lenp, loff_t *ppos)
2436{
2437 if (write && !capable(CAP_SYS_ADMIN))
2438 return -EPERM;
2439
2440 return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
2441}
2442#endif
2443
2444struct do_proc_dointvec_minmax_conv_param {
2445 int *min;
2446 int *max;
2447};
2448
2449static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
2450 int *valp,
2451 int write, void *data)
2452{
2453 struct do_proc_dointvec_minmax_conv_param *param = data;
2454 if (write) {
2455 int val = *negp ? -*lvalp : *lvalp;
2456 if ((param->min && *param->min > val) ||
2457 (param->max && *param->max < val))
2458 return -EINVAL;
2459 *valp = val;
2460 } else {
2461 int val = *valp;
2462 if (val < 0) {
2463 *negp = true;
2464 *lvalp = (unsigned long)-val;
2465 } else {
2466 *negp = false;
2467 *lvalp = (unsigned long)val;
2468 }
2469 }
2470 return 0;
2471}
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489int proc_dointvec_minmax(struct ctl_table *table, int write,
2490 void __user *buffer, size_t *lenp, loff_t *ppos)
2491{
2492 struct do_proc_dointvec_minmax_conv_param param = {
2493 .min = (int *) table->extra1,
2494 .max = (int *) table->extra2,
2495 };
2496 return do_proc_dointvec(table, write, buffer, lenp, ppos,
2497 do_proc_dointvec_minmax_conv, ¶m);
2498}
2499
2500static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
2501 void __user *buffer,
2502 size_t *lenp, loff_t *ppos,
2503 unsigned long convmul,
2504 unsigned long convdiv)
2505{
2506 unsigned long *i, *min, *max;
2507 int vleft, first = 1, err = 0;
2508 unsigned long page = 0;
2509 size_t left;
2510 char *kbuf;
2511
2512 if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
2513 *lenp = 0;
2514 return 0;
2515 }
2516
2517 i = (unsigned long *) data;
2518 min = (unsigned long *) table->extra1;
2519 max = (unsigned long *) table->extra2;
2520 vleft = table->maxlen / sizeof(unsigned long);
2521 left = *lenp;
2522
2523 if (write) {
2524 if (left > PAGE_SIZE - 1)
2525 left = PAGE_SIZE - 1;
2526 page = __get_free_page(GFP_TEMPORARY);
2527 kbuf = (char *) page;
2528 if (!kbuf)
2529 return -ENOMEM;
2530 if (copy_from_user(kbuf, buffer, left)) {
2531 err = -EFAULT;
2532 goto free;
2533 }
2534 kbuf[left] = 0;
2535 }
2536
2537 for (; left && vleft--; i++, first = 0) {
2538 unsigned long val;
2539
2540 if (write) {
2541 bool neg;
2542
2543 left -= proc_skip_spaces(&kbuf);
2544
2545 err = proc_get_long(&kbuf, &left, &val, &neg,
2546 proc_wspace_sep,
2547 sizeof(proc_wspace_sep), NULL);
2548 if (err)
2549 break;
2550 if (neg)
2551 continue;
2552 if ((min && val < *min) || (max && val > *max))
2553 continue;
2554 *i = val;
2555 } else {
2556 val = convdiv * (*i) / convmul;
2557 if (!first)
2558 err = proc_put_char(&buffer, &left, '\t');
2559 err = proc_put_long(&buffer, &left, val, false);
2560 if (err)
2561 break;
2562 }
2563 }
2564
2565 if (!write && !first && left && !err)
2566 err = proc_put_char(&buffer, &left, '\n');
2567 if (write && !err)
2568 left -= proc_skip_spaces(&kbuf);
2569free:
2570 if (write) {
2571 free_page(page);
2572 if (first)
2573 return err ? : -EINVAL;
2574 }
2575 *lenp -= left;
2576 *ppos += *lenp;
2577 return err;
2578}
2579
2580static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
2581 void __user *buffer,
2582 size_t *lenp, loff_t *ppos,
2583 unsigned long convmul,
2584 unsigned long convdiv)
2585{
2586 return __do_proc_doulongvec_minmax(table->data, table, write,
2587 buffer, lenp, ppos, convmul, convdiv);
2588}
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606int proc_doulongvec_minmax(struct ctl_table *table, int write,
2607 void __user *buffer, size_t *lenp, loff_t *ppos)
2608{
2609 return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
2610}
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
2630 void __user *buffer,
2631 size_t *lenp, loff_t *ppos)
2632{
2633 return do_proc_doulongvec_minmax(table, write, buffer,
2634 lenp, ppos, HZ, 1000l);
2635}
2636
2637
2638static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
2639 int *valp,
2640 int write, void *data)
2641{
2642 if (write) {
2643 if (*lvalp > LONG_MAX / HZ)
2644 return 1;
2645 *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
2646 } else {
2647 int val = *valp;
2648 unsigned long lval;
2649 if (val < 0) {
2650 *negp = true;
2651 lval = (unsigned long)-val;
2652 } else {
2653 *negp = false;
2654 lval = (unsigned long)val;
2655 }
2656 *lvalp = lval / HZ;
2657 }
2658 return 0;
2659}
2660
2661static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp,
2662 int *valp,
2663 int write, void *data)
2664{
2665 if (write) {
2666 if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
2667 return 1;
2668 *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
2669 } else {
2670 int val = *valp;
2671 unsigned long lval;
2672 if (val < 0) {
2673 *negp = true;
2674 lval = (unsigned long)-val;
2675 } else {
2676 *negp = false;
2677 lval = (unsigned long)val;
2678 }
2679 *lvalp = jiffies_to_clock_t(lval);
2680 }
2681 return 0;
2682}
2683
2684static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
2685 int *valp,
2686 int write, void *data)
2687{
2688 if (write) {
2689 *valp = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
2690 } else {
2691 int val = *valp;
2692 unsigned long lval;
2693 if (val < 0) {
2694 *negp = true;
2695 lval = (unsigned long)-val;
2696 } else {
2697 *negp = false;
2698 lval = (unsigned long)val;
2699 }
2700 *lvalp = jiffies_to_msecs(lval);
2701 }
2702 return 0;
2703}
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720int proc_dointvec_jiffies(struct ctl_table *table, int write,
2721 void __user *buffer, size_t *lenp, loff_t *ppos)
2722{
2723 return do_proc_dointvec(table,write,buffer,lenp,ppos,
2724 do_proc_dointvec_jiffies_conv,NULL);
2725}
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
2743 void __user *buffer, size_t *lenp, loff_t *ppos)
2744{
2745 return do_proc_dointvec(table,write,buffer,lenp,ppos,
2746 do_proc_dointvec_userhz_jiffies_conv,NULL);
2747}
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
2766 void __user *buffer, size_t *lenp, loff_t *ppos)
2767{
2768 return do_proc_dointvec(table, write, buffer, lenp, ppos,
2769 do_proc_dointvec_ms_jiffies_conv, NULL);
2770}
2771
2772static int proc_do_cad_pid(struct ctl_table *table, int write,
2773 void __user *buffer, size_t *lenp, loff_t *ppos)
2774{
2775 struct pid *new_pid;
2776 pid_t tmp;
2777 int r;
2778
2779 tmp = pid_vnr(cad_pid);
2780
2781 r = __do_proc_dointvec(&tmp, table, write, buffer,
2782 lenp, ppos, NULL, NULL);
2783 if (r || !write)
2784 return r;
2785
2786 new_pid = find_get_pid(tmp);
2787 if (!new_pid)
2788 return -ESRCH;
2789
2790 put_pid(xchg(&cad_pid, new_pid));
2791 return 0;
2792}
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811int proc_do_large_bitmap(struct ctl_table *table, int write,
2812 void __user *buffer, size_t *lenp, loff_t *ppos)
2813{
2814 int err = 0;
2815 bool first = 1;
2816 size_t left = *lenp;
2817 unsigned long bitmap_len = table->maxlen;
2818 unsigned long *bitmap = (unsigned long *) table->data;
2819 unsigned long *tmp_bitmap = NULL;
2820 char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c;
2821
2822 if (!bitmap_len || !left || (*ppos && !write)) {
2823 *lenp = 0;
2824 return 0;
2825 }
2826
2827 if (write) {
2828 unsigned long page = 0;
2829 char *kbuf;
2830
2831 if (left > PAGE_SIZE - 1)
2832 left = PAGE_SIZE - 1;
2833
2834 page = __get_free_page(GFP_TEMPORARY);
2835 kbuf = (char *) page;
2836 if (!kbuf)
2837 return -ENOMEM;
2838 if (copy_from_user(kbuf, buffer, left)) {
2839 free_page(page);
2840 return -EFAULT;
2841 }
2842 kbuf[left] = 0;
2843
2844 tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long),
2845 GFP_KERNEL);
2846 if (!tmp_bitmap) {
2847 free_page(page);
2848 return -ENOMEM;
2849 }
2850 proc_skip_char(&kbuf, &left, '\n');
2851 while (!err && left) {
2852 unsigned long val_a, val_b;
2853 bool neg;
2854
2855 err = proc_get_long(&kbuf, &left, &val_a, &neg, tr_a,
2856 sizeof(tr_a), &c);
2857 if (err)
2858 break;
2859 if (val_a >= bitmap_len || neg) {
2860 err = -EINVAL;
2861 break;
2862 }
2863
2864 val_b = val_a;
2865 if (left) {
2866 kbuf++;
2867 left--;
2868 }
2869
2870 if (c == '-') {
2871 err = proc_get_long(&kbuf, &left, &val_b,
2872 &neg, tr_b, sizeof(tr_b),
2873 &c);
2874 if (err)
2875 break;
2876 if (val_b >= bitmap_len || neg ||
2877 val_a > val_b) {
2878 err = -EINVAL;
2879 break;
2880 }
2881 if (left) {
2882 kbuf++;
2883 left--;
2884 }
2885 }
2886
2887 while (val_a <= val_b)
2888 set_bit(val_a++, tmp_bitmap);
2889
2890 first = 0;
2891 proc_skip_char(&kbuf, &left, '\n');
2892 }
2893 free_page(page);
2894 } else {
2895 unsigned long bit_a, bit_b = 0;
2896
2897 while (left) {
2898 bit_a = find_next_bit(bitmap, bitmap_len, bit_b);
2899 if (bit_a >= bitmap_len)
2900 break;
2901 bit_b = find_next_zero_bit(bitmap, bitmap_len,
2902 bit_a + 1) - 1;
2903
2904 if (!first) {
2905 err = proc_put_char(&buffer, &left, ',');
2906 if (err)
2907 break;
2908 }
2909 err = proc_put_long(&buffer, &left, bit_a, false);
2910 if (err)
2911 break;
2912 if (bit_a != bit_b) {
2913 err = proc_put_char(&buffer, &left, '-');
2914 if (err)
2915 break;
2916 err = proc_put_long(&buffer, &left, bit_b, false);
2917 if (err)
2918 break;
2919 }
2920
2921 first = 0; bit_b++;
2922 }
2923 if (!err)
2924 err = proc_put_char(&buffer, &left, '\n');
2925 }
2926
2927 if (!err) {
2928 if (write) {
2929 if (*ppos)
2930 bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len);
2931 else
2932 memcpy(bitmap, tmp_bitmap,
2933 BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long));
2934 }
2935 kfree(tmp_bitmap);
2936 *lenp -= left;
2937 *ppos += *lenp;
2938 return 0;
2939 } else {
2940 kfree(tmp_bitmap);
2941 return err;
2942 }
2943}
2944
2945#else
2946
2947int proc_dostring(struct ctl_table *table, int write,
2948 void __user *buffer, size_t *lenp, loff_t *ppos)
2949{
2950 return -ENOSYS;
2951}
2952
2953int proc_dointvec(struct ctl_table *table, int write,
2954 void __user *buffer, size_t *lenp, loff_t *ppos)
2955{
2956 return -ENOSYS;
2957}
2958
2959int proc_dointvec_minmax(struct ctl_table *table, int write,
2960 void __user *buffer, size_t *lenp, loff_t *ppos)
2961{
2962 return -ENOSYS;
2963}
2964
2965int proc_dointvec_jiffies(struct ctl_table *table, int write,
2966 void __user *buffer, size_t *lenp, loff_t *ppos)
2967{
2968 return -ENOSYS;
2969}
2970
2971int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
2972 void __user *buffer, size_t *lenp, loff_t *ppos)
2973{
2974 return -ENOSYS;
2975}
2976
2977int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
2978 void __user *buffer, size_t *lenp, loff_t *ppos)
2979{
2980 return -ENOSYS;
2981}
2982
2983int proc_doulongvec_minmax(struct ctl_table *table, int write,
2984 void __user *buffer, size_t *lenp, loff_t *ppos)
2985{
2986 return -ENOSYS;
2987}
2988
2989int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
2990 void __user *buffer,
2991 size_t *lenp, loff_t *ppos)
2992{
2993 return -ENOSYS;
2994}
2995
2996
2997#endif
2998
2999
3000
3001
3002
3003EXPORT_SYMBOL(proc_dointvec);
3004EXPORT_SYMBOL(proc_dointvec_jiffies);
3005EXPORT_SYMBOL(proc_dointvec_minmax);
3006EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
3007EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
3008EXPORT_SYMBOL(proc_dostring);
3009EXPORT_SYMBOL(proc_doulongvec_minmax);
3010EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
3011EXPORT_SYMBOL(register_sysctl_table);
3012EXPORT_SYMBOL(register_sysctl_paths);
3013EXPORT_SYMBOL(unregister_sysctl_table);
3014