]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - kernel/sysctl.c
mm: add extra free kbytes tunable
[karo-tx-linux.git] / kernel / sysctl.c
1 /*
2  * sysctl.c: General linux system control interface
3  *
4  * Begun 24 March 1995, Stephen Tweedie
5  * Added /proc support, Dec 1995
6  * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas.
7  * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver.
8  * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver.
9  * Dynamic registration fixes, Stephen Tweedie.
10  * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn.
11  * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris
12  *  Horn.
13  * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer.
14  * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
15  * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
16  *  Wendling.
17  * The list_for_each() macro wasn't appropriate for the sysctl loop.
18  *  Removed it and replaced it with older style, 03/23/00, Bill Wendling
19  */
20
21 #include <linux/module.h>
22 #include <linux/mm.h>
23 #include <linux/swap.h>
24 #include <linux/slab.h>
25 #include <linux/sysctl.h>
26 #include <linux/bitmap.h>
27 #include <linux/signal.h>
28 #include <linux/printk.h>
29 #include <linux/proc_fs.h>
30 #include <linux/security.h>
31 #include <linux/ctype.h>
32 #include <linux/kmemcheck.h>
33 #include <linux/fs.h>
34 #include <linux/init.h>
35 #include <linux/kernel.h>
36 #include <linux/kobject.h>
37 #include <linux/net.h>
38 #include <linux/sysrq.h>
39 #include <linux/highuid.h>
40 #include <linux/writeback.h>
41 #include <linux/ratelimit.h>
42 #include <linux/compaction.h>
43 #include <linux/hugetlb.h>
44 #include <linux/initrd.h>
45 #include <linux/key.h>
46 #include <linux/times.h>
47 #include <linux/limits.h>
48 #include <linux/dcache.h>
49 #include <linux/dnotify.h>
50 #include <linux/syscalls.h>
51 #include <linux/vmstat.h>
52 #include <linux/nfs_fs.h>
53 #include <linux/acpi.h>
54 #include <linux/reboot.h>
55 #include <linux/ftrace.h>
56 #include <linux/perf_event.h>
57 #include <linux/kprobes.h>
58 #include <linux/pipe_fs_i.h>
59 #include <linux/oom.h>
60 #include <linux/kmod.h>
61 #include <linux/capability.h>
62 #include <linux/binfmts.h>
63
64 #include <asm/uaccess.h>
65 #include <asm/processor.h>
66
67 #ifdef CONFIG_X86
68 #include <asm/nmi.h>
69 #include <asm/stacktrace.h>
70 #include <asm/io.h>
71 #endif
72 #ifdef CONFIG_SPARC
73 #include <asm/setup.h>
74 #endif
75 #ifdef CONFIG_BSD_PROCESS_ACCT
76 #include <linux/acct.h>
77 #endif
78 #ifdef CONFIG_RT_MUTEXES
79 #include <linux/rtmutex.h>
80 #endif
81 #if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT)
82 #include <linux/lockdep.h>
83 #endif
84 #ifdef CONFIG_CHR_DEV_SG
85 #include <scsi/sg.h>
86 #endif
87
88 #ifdef CONFIG_LOCKUP_DETECTOR
89 #include <linux/nmi.h>
90 #endif
91
92
93 #if defined(CONFIG_SYSCTL)
94
95 /* External variables not in a header file. */
96 extern int sysctl_overcommit_memory;
97 extern int sysctl_overcommit_ratio;
98 extern int max_threads;
99 extern int core_uses_pid;
100 extern int suid_dumpable;
101 extern char core_pattern[];
102 extern unsigned int core_pipe_limit;
103 extern int pid_max;
104 extern int min_free_kbytes;
105 extern int extra_free_kbytes;
106 extern int pid_max_min, pid_max_max;
107 extern int sysctl_drop_caches;
108 extern int percpu_pagelist_fraction;
109 extern int compat_log;
110 extern int latencytop_enabled;
111 extern int sysctl_nr_open_min, sysctl_nr_open_max;
112 #ifndef CONFIG_MMU
113 extern int sysctl_nr_trim_pages;
114 #endif
115 #ifdef CONFIG_BLOCK
116 extern int blk_iopoll_enabled;
117 #endif
118
119 /* Constants used for minimum and  maximum */
120 #ifdef CONFIG_LOCKUP_DETECTOR
121 static int sixty = 60;
122 static int neg_one = -1;
123 #endif
124
125 static int zero;
126 static int __maybe_unused one = 1;
127 static int __maybe_unused two = 2;
128 static int __maybe_unused three = 3;
129 static unsigned long one_ul = 1;
130 static int one_hundred = 100;
131 #ifdef CONFIG_PRINTK
132 static int ten_thousand = 10000;
133 #endif
134
135 /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
136 static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
137
138 /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
139 static int maxolduid = 65535;
140 static int minolduid;
141 static int min_percpu_pagelist_fract = 8;
142
143 static int ngroups_max = NGROUPS_MAX;
144 static const int cap_last_cap = CAP_LAST_CAP;
145
146 #ifdef CONFIG_INOTIFY_USER
147 #include <linux/inotify.h>
148 #endif
149 #ifdef CONFIG_SPARC
150 #endif
151
152 #ifdef CONFIG_SPARC64
153 extern int sysctl_tsb_ratio;
154 #endif
155
156 #ifdef __hppa__
157 extern int pwrsw_enabled;
158 extern int unaligned_enabled;
159 #endif
160
161 #ifdef CONFIG_IA64
162 extern int no_unaligned_warning;
163 extern int unaligned_dump_stack;
164 #endif
165
166 #ifdef CONFIG_PROC_SYSCTL
167 static int proc_do_cad_pid(struct ctl_table *table, int write,
168                   void __user *buffer, size_t *lenp, loff_t *ppos);
169 static int proc_taint(struct ctl_table *table, int write,
170                                void __user *buffer, size_t *lenp, loff_t *ppos);
171 #endif
172
173 #ifdef CONFIG_PRINTK
174 static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
175                                 void __user *buffer, size_t *lenp, loff_t *ppos);
176 #endif
177
178 #ifdef CONFIG_MAGIC_SYSRQ
179 /* Note: sysrq code uses it's own private copy */
180 static int __sysrq_enabled = SYSRQ_DEFAULT_ENABLE;
181
182 static int sysrq_sysctl_handler(ctl_table *table, int write,
183                                 void __user *buffer, size_t *lenp,
184                                 loff_t *ppos)
185 {
186         int error;
187
188         error = proc_dointvec(table, write, buffer, lenp, ppos);
189         if (error)
190                 return error;
191
192         if (write)
193                 sysrq_toggle_support(__sysrq_enabled);
194
195         return 0;
196 }
197
198 #endif
199
200 static struct ctl_table kern_table[];
201 static struct ctl_table vm_table[];
202 static struct ctl_table fs_table[];
203 static struct ctl_table debug_table[];
204 static struct ctl_table dev_table[];
205 extern struct ctl_table random_table[];
206 #ifdef CONFIG_EPOLL
207 extern struct ctl_table epoll_table[];
208 #endif
209
210 #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
211 int sysctl_legacy_va_layout;
212 #endif
213
214 /* The default sysctl tables: */
215
216 static struct ctl_table sysctl_base_table[] = {
217         {
218                 .procname       = "kernel",
219                 .mode           = 0555,
220                 .child          = kern_table,
221         },
222         {
223                 .procname       = "vm",
224                 .mode           = 0555,
225                 .child          = vm_table,
226         },
227         {
228                 .procname       = "fs",
229                 .mode           = 0555,
230                 .child          = fs_table,
231         },
232         {
233                 .procname       = "debug",
234                 .mode           = 0555,
235                 .child          = debug_table,
236         },
237         {
238                 .procname       = "dev",
239                 .mode           = 0555,
240                 .child          = dev_table,
241         },
242         { }
243 };
244
245 #ifdef CONFIG_SCHED_DEBUG
246 static int min_sched_granularity_ns = 100000;           /* 100 usecs */
247 static int max_sched_granularity_ns = NSEC_PER_SEC;     /* 1 second */
248 static int min_wakeup_granularity_ns;                   /* 0 usecs */
249 static int max_wakeup_granularity_ns = NSEC_PER_SEC;    /* 1 second */
250 static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE;
251 static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1;
252 #endif
253
254 #ifdef CONFIG_COMPACTION
255 static int min_extfrag_threshold;
256 static int max_extfrag_threshold = 1000;
257 #endif
258
259 static struct ctl_table kern_table[] = {
260         {
261                 .procname       = "sched_child_runs_first",
262                 .data           = &sysctl_sched_child_runs_first,
263                 .maxlen         = sizeof(unsigned int),
264                 .mode           = 0644,
265                 .proc_handler   = proc_dointvec,
266         },
267 #ifdef CONFIG_SCHED_DEBUG
268         {
269                 .procname       = "sched_min_granularity_ns",
270                 .data           = &sysctl_sched_min_granularity,
271                 .maxlen         = sizeof(unsigned int),
272                 .mode           = 0644,
273                 .proc_handler   = sched_proc_update_handler,
274                 .extra1         = &min_sched_granularity_ns,
275                 .extra2         = &max_sched_granularity_ns,
276         },
277         {
278                 .procname       = "sched_latency_ns",
279                 .data           = &sysctl_sched_latency,
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_wakeup_granularity_ns",
288                 .data           = &sysctl_sched_wakeup_granularity,
289                 .maxlen         = sizeof(unsigned int),
290                 .mode           = 0644,
291                 .proc_handler   = sched_proc_update_handler,
292                 .extra1         = &min_wakeup_granularity_ns,
293                 .extra2         = &max_wakeup_granularity_ns,
294         },
295         {
296                 .procname       = "sched_tunable_scaling",
297                 .data           = &sysctl_sched_tunable_scaling,
298                 .maxlen         = sizeof(enum sched_tunable_scaling),
299                 .mode           = 0644,
300                 .proc_handler   = sched_proc_update_handler,
301                 .extra1         = &min_sched_tunable_scaling,
302                 .extra2         = &max_sched_tunable_scaling,
303         },
304         {
305                 .procname       = "sched_migration_cost",
306                 .data           = &sysctl_sched_migration_cost,
307                 .maxlen         = sizeof(unsigned int),
308                 .mode           = 0644,
309                 .proc_handler   = proc_dointvec,
310         },
311         {
312                 .procname       = "sched_nr_migrate",
313                 .data           = &sysctl_sched_nr_migrate,
314                 .maxlen         = sizeof(unsigned int),
315                 .mode           = 0644,
316                 .proc_handler   = proc_dointvec,
317         },
318         {
319                 .procname       = "sched_time_avg",
320                 .data           = &sysctl_sched_time_avg,
321                 .maxlen         = sizeof(unsigned int),
322                 .mode           = 0644,
323                 .proc_handler   = proc_dointvec,
324         },
325         {
326                 .procname       = "sched_shares_window",
327                 .data           = &sysctl_sched_shares_window,
328                 .maxlen         = sizeof(unsigned int),
329                 .mode           = 0644,
330                 .proc_handler   = proc_dointvec,
331         },
332         {
333                 .procname       = "timer_migration",
334                 .data           = &sysctl_timer_migration,
335                 .maxlen         = sizeof(unsigned int),
336                 .mode           = 0644,
337                 .proc_handler   = proc_dointvec_minmax,
338                 .extra1         = &zero,
339                 .extra2         = &one,
340         },
341 #endif
342         {
343                 .procname       = "sched_rt_period_us",
344                 .data           = &sysctl_sched_rt_period,
345                 .maxlen         = sizeof(unsigned int),
346                 .mode           = 0644,
347                 .proc_handler   = sched_rt_handler,
348         },
349         {
350                 .procname       = "sched_rt_runtime_us",
351                 .data           = &sysctl_sched_rt_runtime,
352                 .maxlen         = sizeof(int),
353                 .mode           = 0644,
354                 .proc_handler   = sched_rt_handler,
355         },
356 #ifdef CONFIG_SCHED_AUTOGROUP
357         {
358                 .procname       = "sched_autogroup_enabled",
359                 .data           = &sysctl_sched_autogroup_enabled,
360                 .maxlen         = sizeof(unsigned int),
361                 .mode           = 0644,
362                 .proc_handler   = proc_dointvec_minmax,
363                 .extra1         = &zero,
364                 .extra2         = &one,
365         },
366 #endif
367 #ifdef CONFIG_CFS_BANDWIDTH
368         {
369                 .procname       = "sched_cfs_bandwidth_slice_us",
370                 .data           = &sysctl_sched_cfs_bandwidth_slice,
371                 .maxlen         = sizeof(unsigned int),
372                 .mode           = 0644,
373                 .proc_handler   = proc_dointvec_minmax,
374                 .extra1         = &one,
375         },
376 #endif
377 #ifdef CONFIG_PROVE_LOCKING
378         {
379                 .procname       = "prove_locking",
380                 .data           = &prove_locking,
381                 .maxlen         = sizeof(int),
382                 .mode           = 0644,
383                 .proc_handler   = proc_dointvec,
384         },
385 #endif
386 #ifdef CONFIG_LOCK_STAT
387         {
388                 .procname       = "lock_stat",
389                 .data           = &lock_stat,
390                 .maxlen         = sizeof(int),
391                 .mode           = 0644,
392                 .proc_handler   = proc_dointvec,
393         },
394 #endif
395         {
396                 .procname       = "panic",
397                 .data           = &panic_timeout,
398                 .maxlen         = sizeof(int),
399                 .mode           = 0644,
400                 .proc_handler   = proc_dointvec,
401         },
402         {
403                 .procname       = "core_uses_pid",
404                 .data           = &core_uses_pid,
405                 .maxlen         = sizeof(int),
406                 .mode           = 0644,
407                 .proc_handler   = proc_dointvec,
408         },
409         {
410                 .procname       = "core_pattern",
411                 .data           = core_pattern,
412                 .maxlen         = CORENAME_MAX_SIZE,
413                 .mode           = 0644,
414                 .proc_handler   = proc_dostring,
415         },
416         {
417                 .procname       = "core_pipe_limit",
418                 .data           = &core_pipe_limit,
419                 .maxlen         = sizeof(unsigned int),
420                 .mode           = 0644,
421                 .proc_handler   = proc_dointvec,
422         },
423 #ifdef CONFIG_PROC_SYSCTL
424         {
425                 .procname       = "tainted",
426                 .maxlen         = sizeof(long),
427                 .mode           = 0644,
428                 .proc_handler   = proc_taint,
429         },
430 #endif
431 #ifdef CONFIG_LATENCYTOP
432         {
433                 .procname       = "latencytop",
434                 .data           = &latencytop_enabled,
435                 .maxlen         = sizeof(int),
436                 .mode           = 0644,
437                 .proc_handler   = proc_dointvec,
438         },
439 #endif
440 #ifdef CONFIG_BLK_DEV_INITRD
441         {
442                 .procname       = "real-root-dev",
443                 .data           = &real_root_dev,
444                 .maxlen         = sizeof(int),
445                 .mode           = 0644,
446                 .proc_handler   = proc_dointvec,
447         },
448 #endif
449         {
450                 .procname       = "print-fatal-signals",
451                 .data           = &print_fatal_signals,
452                 .maxlen         = sizeof(int),
453                 .mode           = 0644,
454                 .proc_handler   = proc_dointvec,
455         },
456 #ifdef CONFIG_SPARC
457         {
458                 .procname       = "reboot-cmd",
459                 .data           = reboot_command,
460                 .maxlen         = 256,
461                 .mode           = 0644,
462                 .proc_handler   = proc_dostring,
463         },
464         {
465                 .procname       = "stop-a",
466                 .data           = &stop_a_enabled,
467                 .maxlen         = sizeof (int),
468                 .mode           = 0644,
469                 .proc_handler   = proc_dointvec,
470         },
471         {
472                 .procname       = "scons-poweroff",
473                 .data           = &scons_pwroff,
474                 .maxlen         = sizeof (int),
475                 .mode           = 0644,
476                 .proc_handler   = proc_dointvec,
477         },
478 #endif
479 #ifdef CONFIG_SPARC64
480         {
481                 .procname       = "tsb-ratio",
482                 .data           = &sysctl_tsb_ratio,
483                 .maxlen         = sizeof (int),
484                 .mode           = 0644,
485                 .proc_handler   = proc_dointvec,
486         },
487 #endif
488 #ifdef __hppa__
489         {
490                 .procname       = "soft-power",
491                 .data           = &pwrsw_enabled,
492                 .maxlen         = sizeof (int),
493                 .mode           = 0644,
494                 .proc_handler   = proc_dointvec,
495         },
496         {
497                 .procname       = "unaligned-trap",
498                 .data           = &unaligned_enabled,
499                 .maxlen         = sizeof (int),
500                 .mode           = 0644,
501                 .proc_handler   = proc_dointvec,
502         },
503 #endif
504         {
505                 .procname       = "ctrl-alt-del",
506                 .data           = &C_A_D,
507                 .maxlen         = sizeof(int),
508                 .mode           = 0644,
509                 .proc_handler   = proc_dointvec,
510         },
511 #ifdef CONFIG_FUNCTION_TRACER
512         {
513                 .procname       = "ftrace_enabled",
514                 .data           = &ftrace_enabled,
515                 .maxlen         = sizeof(int),
516                 .mode           = 0644,
517                 .proc_handler   = ftrace_enable_sysctl,
518         },
519 #endif
520 #ifdef CONFIG_STACK_TRACER
521         {
522                 .procname       = "stack_tracer_enabled",
523                 .data           = &stack_tracer_enabled,
524                 .maxlen         = sizeof(int),
525                 .mode           = 0644,
526                 .proc_handler   = stack_trace_sysctl,
527         },
528 #endif
529 #ifdef CONFIG_TRACING
530         {
531                 .procname       = "ftrace_dump_on_oops",
532                 .data           = &ftrace_dump_on_oops,
533                 .maxlen         = sizeof(int),
534                 .mode           = 0644,
535                 .proc_handler   = proc_dointvec,
536         },
537 #endif
538 #ifdef CONFIG_MODULES
539         {
540                 .procname       = "modprobe",
541                 .data           = &modprobe_path,
542                 .maxlen         = KMOD_PATH_LEN,
543                 .mode           = 0644,
544                 .proc_handler   = proc_dostring,
545         },
546         {
547                 .procname       = "modules_disabled",
548                 .data           = &modules_disabled,
549                 .maxlen         = sizeof(int),
550                 .mode           = 0644,
551                 /* only handle a transition from default "0" to "1" */
552                 .proc_handler   = proc_dointvec_minmax,
553                 .extra1         = &one,
554                 .extra2         = &one,
555         },
556 #endif
557 #ifdef CONFIG_HOTPLUG
558         {
559                 .procname       = "hotplug",
560                 .data           = &uevent_helper,
561                 .maxlen         = UEVENT_HELPER_PATH_LEN,
562                 .mode           = 0644,
563                 .proc_handler   = proc_dostring,
564         },
565 #endif
566 #ifdef CONFIG_CHR_DEV_SG
567         {
568                 .procname       = "sg-big-buff",
569                 .data           = &sg_big_buff,
570                 .maxlen         = sizeof (int),
571                 .mode           = 0444,
572                 .proc_handler   = proc_dointvec,
573         },
574 #endif
575 #ifdef CONFIG_BSD_PROCESS_ACCT
576         {
577                 .procname       = "acct",
578                 .data           = &acct_parm,
579                 .maxlen         = 3*sizeof(int),
580                 .mode           = 0644,
581                 .proc_handler   = proc_dointvec,
582         },
583 #endif
584 #ifdef CONFIG_MAGIC_SYSRQ
585         {
586                 .procname       = "sysrq",
587                 .data           = &__sysrq_enabled,
588                 .maxlen         = sizeof (int),
589                 .mode           = 0644,
590                 .proc_handler   = sysrq_sysctl_handler,
591         },
592 #endif
593 #ifdef CONFIG_PROC_SYSCTL
594         {
595                 .procname       = "cad_pid",
596                 .data           = NULL,
597                 .maxlen         = sizeof (int),
598                 .mode           = 0600,
599                 .proc_handler   = proc_do_cad_pid,
600         },
601 #endif
602         {
603                 .procname       = "threads-max",
604                 .data           = &max_threads,
605                 .maxlen         = sizeof(int),
606                 .mode           = 0644,
607                 .proc_handler   = proc_dointvec,
608         },
609         {
610                 .procname       = "random",
611                 .mode           = 0555,
612                 .child          = random_table,
613         },
614         {
615                 .procname       = "usermodehelper",
616                 .mode           = 0555,
617                 .child          = usermodehelper_table,
618         },
619         {
620                 .procname       = "overflowuid",
621                 .data           = &overflowuid,
622                 .maxlen         = sizeof(int),
623                 .mode           = 0644,
624                 .proc_handler   = proc_dointvec_minmax,
625                 .extra1         = &minolduid,
626                 .extra2         = &maxolduid,
627         },
628         {
629                 .procname       = "overflowgid",
630                 .data           = &overflowgid,
631                 .maxlen         = sizeof(int),
632                 .mode           = 0644,
633                 .proc_handler   = proc_dointvec_minmax,
634                 .extra1         = &minolduid,
635                 .extra2         = &maxolduid,
636         },
637 #ifdef CONFIG_S390
638 #ifdef CONFIG_MATHEMU
639         {
640                 .procname       = "ieee_emulation_warnings",
641                 .data           = &sysctl_ieee_emulation_warnings,
642                 .maxlen         = sizeof(int),
643                 .mode           = 0644,
644                 .proc_handler   = proc_dointvec,
645         },
646 #endif
647         {
648                 .procname       = "userprocess_debug",
649                 .data           = &show_unhandled_signals,
650                 .maxlen         = sizeof(int),
651                 .mode           = 0644,
652                 .proc_handler   = proc_dointvec,
653         },
654 #endif
655         {
656                 .procname       = "pid_max",
657                 .data           = &pid_max,
658                 .maxlen         = sizeof (int),
659                 .mode           = 0644,
660                 .proc_handler   = proc_dointvec_minmax,
661                 .extra1         = &pid_max_min,
662                 .extra2         = &pid_max_max,
663         },
664         {
665                 .procname       = "panic_on_oops",
666                 .data           = &panic_on_oops,
667                 .maxlen         = sizeof(int),
668                 .mode           = 0644,
669                 .proc_handler   = proc_dointvec,
670         },
671 #if defined CONFIG_PRINTK
672         {
673                 .procname       = "printk",
674                 .data           = &console_loglevel,
675                 .maxlen         = 4*sizeof(int),
676                 .mode           = 0644,
677                 .proc_handler   = proc_dointvec,
678         },
679         {
680                 .procname       = "printk_ratelimit",
681                 .data           = &printk_ratelimit_state.interval,
682                 .maxlen         = sizeof(int),
683                 .mode           = 0644,
684                 .proc_handler   = proc_dointvec_jiffies,
685         },
686         {
687                 .procname       = "printk_ratelimit_burst",
688                 .data           = &printk_ratelimit_state.burst,
689                 .maxlen         = sizeof(int),
690                 .mode           = 0644,
691                 .proc_handler   = proc_dointvec,
692         },
693         {
694                 .procname       = "printk_delay",
695                 .data           = &printk_delay_msec,
696                 .maxlen         = sizeof(int),
697                 .mode           = 0644,
698                 .proc_handler   = proc_dointvec_minmax,
699                 .extra1         = &zero,
700                 .extra2         = &ten_thousand,
701         },
702         {
703                 .procname       = "dmesg_restrict",
704                 .data           = &dmesg_restrict,
705                 .maxlen         = sizeof(int),
706                 .mode           = 0644,
707                 .proc_handler   = proc_dointvec_minmax_sysadmin,
708                 .extra1         = &zero,
709                 .extra2         = &one,
710         },
711         {
712                 .procname       = "kptr_restrict",
713                 .data           = &kptr_restrict,
714                 .maxlen         = sizeof(int),
715                 .mode           = 0644,
716                 .proc_handler   = proc_dointvec_minmax_sysadmin,
717                 .extra1         = &zero,
718                 .extra2         = &two,
719         },
720 #endif
721         {
722                 .procname       = "ngroups_max",
723                 .data           = &ngroups_max,
724                 .maxlen         = sizeof (int),
725                 .mode           = 0444,
726                 .proc_handler   = proc_dointvec,
727         },
728         {
729                 .procname       = "cap_last_cap",
730                 .data           = (void *)&cap_last_cap,
731                 .maxlen         = sizeof(int),
732                 .mode           = 0444,
733                 .proc_handler   = proc_dointvec,
734         },
735 #if defined(CONFIG_LOCKUP_DETECTOR)
736         {
737                 .procname       = "watchdog",
738                 .data           = &watchdog_enabled,
739                 .maxlen         = sizeof (int),
740                 .mode           = 0644,
741                 .proc_handler   = proc_dowatchdog,
742                 .extra1         = &zero,
743                 .extra2         = &one,
744         },
745         {
746                 .procname       = "watchdog_thresh",
747                 .data           = &watchdog_thresh,
748                 .maxlen         = sizeof(int),
749                 .mode           = 0644,
750                 .proc_handler   = proc_dowatchdog,
751                 .extra1         = &neg_one,
752                 .extra2         = &sixty,
753         },
754         {
755                 .procname       = "softlockup_panic",
756                 .data           = &softlockup_panic,
757                 .maxlen         = sizeof(int),
758                 .mode           = 0644,
759                 .proc_handler   = proc_dointvec_minmax,
760                 .extra1         = &zero,
761                 .extra2         = &one,
762         },
763         {
764                 .procname       = "nmi_watchdog",
765                 .data           = &watchdog_enabled,
766                 .maxlen         = sizeof (int),
767                 .mode           = 0644,
768                 .proc_handler   = proc_dowatchdog,
769                 .extra1         = &zero,
770                 .extra2         = &one,
771         },
772 #endif
773 #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
774         {
775                 .procname       = "unknown_nmi_panic",
776                 .data           = &unknown_nmi_panic,
777                 .maxlen         = sizeof (int),
778                 .mode           = 0644,
779                 .proc_handler   = proc_dointvec,
780         },
781 #endif
782 #if defined(CONFIG_X86)
783         {
784                 .procname       = "panic_on_unrecovered_nmi",
785                 .data           = &panic_on_unrecovered_nmi,
786                 .maxlen         = sizeof(int),
787                 .mode           = 0644,
788                 .proc_handler   = proc_dointvec,
789         },
790         {
791                 .procname       = "panic_on_io_nmi",
792                 .data           = &panic_on_io_nmi,
793                 .maxlen         = sizeof(int),
794                 .mode           = 0644,
795                 .proc_handler   = proc_dointvec,
796         },
797 #ifdef CONFIG_DEBUG_STACKOVERFLOW
798         {
799                 .procname       = "panic_on_stackoverflow",
800                 .data           = &sysctl_panic_on_stackoverflow,
801                 .maxlen         = sizeof(int),
802                 .mode           = 0644,
803                 .proc_handler   = proc_dointvec,
804         },
805 #endif
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          * User-space scripts rely on the existence of this file
954          * as a feature check for perf_events being enabled.
955          *
956          * So it's an ABI, do not remove!
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
1001 static 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 /* read-only*/,
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 /* CONFIG_COMPACTION */
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       = "extra_free_kbytes",
1204                 .data           = &extra_free_kbytes,
1205                 .maxlen         = sizeof(extra_free_kbytes),
1206                 .mode           = 0644,
1207                 .proc_handler   = min_free_kbytes_sysctl_handler,
1208                 .extra1         = &zero,
1209         },
1210         {
1211                 .procname       = "percpu_pagelist_fraction",
1212                 .data           = &percpu_pagelist_fraction,
1213                 .maxlen         = sizeof(percpu_pagelist_fraction),
1214                 .mode           = 0644,
1215                 .proc_handler   = percpu_pagelist_fraction_sysctl_handler,
1216                 .extra1         = &min_percpu_pagelist_fract,
1217         },
1218 #ifdef CONFIG_MMU
1219         {
1220                 .procname       = "max_map_count",
1221                 .data           = &sysctl_max_map_count,
1222                 .maxlen         = sizeof(sysctl_max_map_count),
1223                 .mode           = 0644,
1224                 .proc_handler   = proc_dointvec_minmax,
1225                 .extra1         = &zero,
1226         },
1227 #else
1228         {
1229                 .procname       = "nr_trim_pages",
1230                 .data           = &sysctl_nr_trim_pages,
1231                 .maxlen         = sizeof(sysctl_nr_trim_pages),
1232                 .mode           = 0644,
1233                 .proc_handler   = proc_dointvec_minmax,
1234                 .extra1         = &zero,
1235         },
1236 #endif
1237         {
1238                 .procname       = "laptop_mode",
1239                 .data           = &laptop_mode,
1240                 .maxlen         = sizeof(laptop_mode),
1241                 .mode           = 0644,
1242                 .proc_handler   = proc_dointvec_jiffies,
1243         },
1244         {
1245                 .procname       = "block_dump",
1246                 .data           = &block_dump,
1247                 .maxlen         = sizeof(block_dump),
1248                 .mode           = 0644,
1249                 .proc_handler   = proc_dointvec,
1250                 .extra1         = &zero,
1251         },
1252         {
1253                 .procname       = "vfs_cache_pressure",
1254                 .data           = &sysctl_vfs_cache_pressure,
1255                 .maxlen         = sizeof(sysctl_vfs_cache_pressure),
1256                 .mode           = 0644,
1257                 .proc_handler   = proc_dointvec,
1258                 .extra1         = &zero,
1259         },
1260 #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
1261         {
1262                 .procname       = "legacy_va_layout",
1263                 .data           = &sysctl_legacy_va_layout,
1264                 .maxlen         = sizeof(sysctl_legacy_va_layout),
1265                 .mode           = 0644,
1266                 .proc_handler   = proc_dointvec,
1267                 .extra1         = &zero,
1268         },
1269 #endif
1270 #ifdef CONFIG_NUMA
1271         {
1272                 .procname       = "zone_reclaim_mode",
1273                 .data           = &zone_reclaim_mode,
1274                 .maxlen         = sizeof(zone_reclaim_mode),
1275                 .mode           = 0644,
1276                 .proc_handler   = proc_dointvec,
1277                 .extra1         = &zero,
1278         },
1279         {
1280                 .procname       = "min_unmapped_ratio",
1281                 .data           = &sysctl_min_unmapped_ratio,
1282                 .maxlen         = sizeof(sysctl_min_unmapped_ratio),
1283                 .mode           = 0644,
1284                 .proc_handler   = sysctl_min_unmapped_ratio_sysctl_handler,
1285                 .extra1         = &zero,
1286                 .extra2         = &one_hundred,
1287         },
1288         {
1289                 .procname       = "min_slab_ratio",
1290                 .data           = &sysctl_min_slab_ratio,
1291                 .maxlen         = sizeof(sysctl_min_slab_ratio),
1292                 .mode           = 0644,
1293                 .proc_handler   = sysctl_min_slab_ratio_sysctl_handler,
1294                 .extra1         = &zero,
1295                 .extra2         = &one_hundred,
1296         },
1297 #endif
1298 #ifdef CONFIG_SMP
1299         {
1300                 .procname       = "stat_interval",
1301                 .data           = &sysctl_stat_interval,
1302                 .maxlen         = sizeof(sysctl_stat_interval),
1303                 .mode           = 0644,
1304                 .proc_handler   = proc_dointvec_jiffies,
1305         },
1306 #endif
1307 #ifdef CONFIG_MMU
1308         {
1309                 .procname       = "mmap_min_addr",
1310                 .data           = &dac_mmap_min_addr,
1311                 .maxlen         = sizeof(unsigned long),
1312                 .mode           = 0644,
1313                 .proc_handler   = mmap_min_addr_handler,
1314         },
1315 #endif
1316 #ifdef CONFIG_NUMA
1317         {
1318                 .procname       = "numa_zonelist_order",
1319                 .data           = &numa_zonelist_order,
1320                 .maxlen         = NUMA_ZONELIST_ORDER_LEN,
1321                 .mode           = 0644,
1322                 .proc_handler   = numa_zonelist_order_handler,
1323         },
1324 #endif
1325 #if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
1326    (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
1327         {
1328                 .procname       = "vdso_enabled",
1329                 .data           = &vdso_enabled,
1330                 .maxlen         = sizeof(vdso_enabled),
1331                 .mode           = 0644,
1332                 .proc_handler   = proc_dointvec,
1333                 .extra1         = &zero,
1334         },
1335 #endif
1336 #ifdef CONFIG_HIGHMEM
1337         {
1338                 .procname       = "highmem_is_dirtyable",
1339                 .data           = &vm_highmem_is_dirtyable,
1340                 .maxlen         = sizeof(vm_highmem_is_dirtyable),
1341                 .mode           = 0644,
1342                 .proc_handler   = proc_dointvec_minmax,
1343                 .extra1         = &zero,
1344                 .extra2         = &one,
1345         },
1346 #endif
1347         {
1348                 .procname       = "scan_unevictable_pages",
1349                 .data           = &scan_unevictable_pages,
1350                 .maxlen         = sizeof(scan_unevictable_pages),
1351                 .mode           = 0644,
1352                 .proc_handler   = scan_unevictable_handler,
1353         },
1354 #ifdef CONFIG_MEMORY_FAILURE
1355         {
1356                 .procname       = "memory_failure_early_kill",
1357                 .data           = &sysctl_memory_failure_early_kill,
1358                 .maxlen         = sizeof(sysctl_memory_failure_early_kill),
1359                 .mode           = 0644,
1360                 .proc_handler   = proc_dointvec_minmax,
1361                 .extra1         = &zero,
1362                 .extra2         = &one,
1363         },
1364         {
1365                 .procname       = "memory_failure_recovery",
1366                 .data           = &sysctl_memory_failure_recovery,
1367                 .maxlen         = sizeof(sysctl_memory_failure_recovery),
1368                 .mode           = 0644,
1369                 .proc_handler   = proc_dointvec_minmax,
1370                 .extra1         = &zero,
1371                 .extra2         = &one,
1372         },
1373 #endif
1374         { }
1375 };
1376
1377 #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
1378 static struct ctl_table binfmt_misc_table[] = {
1379         { }
1380 };
1381 #endif
1382
1383 static struct ctl_table fs_table[] = {
1384         {
1385                 .procname       = "inode-nr",
1386                 .data           = &inodes_stat,
1387                 .maxlen         = 2*sizeof(int),
1388                 .mode           = 0444,
1389                 .proc_handler   = proc_nr_inodes,
1390         },
1391         {
1392                 .procname       = "inode-state",
1393                 .data           = &inodes_stat,
1394                 .maxlen         = 7*sizeof(int),
1395                 .mode           = 0444,
1396                 .proc_handler   = proc_nr_inodes,
1397         },
1398         {
1399                 .procname       = "file-nr",
1400                 .data           = &files_stat,
1401                 .maxlen         = sizeof(files_stat),
1402                 .mode           = 0444,
1403                 .proc_handler   = proc_nr_files,
1404         },
1405         {
1406                 .procname       = "file-max",
1407                 .data           = &files_stat.max_files,
1408                 .maxlen         = sizeof(files_stat.max_files),
1409                 .mode           = 0644,
1410                 .proc_handler   = proc_doulongvec_minmax,
1411         },
1412         {
1413                 .procname       = "nr_open",
1414                 .data           = &sysctl_nr_open,
1415                 .maxlen         = sizeof(int),
1416                 .mode           = 0644,
1417                 .proc_handler   = proc_dointvec_minmax,
1418                 .extra1         = &sysctl_nr_open_min,
1419                 .extra2         = &sysctl_nr_open_max,
1420         },
1421         {
1422                 .procname       = "dentry-state",
1423                 .data           = &dentry_stat,
1424                 .maxlen         = 6*sizeof(int),
1425                 .mode           = 0444,
1426                 .proc_handler   = proc_nr_dentry,
1427         },
1428         {
1429                 .procname       = "overflowuid",
1430                 .data           = &fs_overflowuid,
1431                 .maxlen         = sizeof(int),
1432                 .mode           = 0644,
1433                 .proc_handler   = proc_dointvec_minmax,
1434                 .extra1         = &minolduid,
1435                 .extra2         = &maxolduid,
1436         },
1437         {
1438                 .procname       = "overflowgid",
1439                 .data           = &fs_overflowgid,
1440                 .maxlen         = sizeof(int),
1441                 .mode           = 0644,
1442                 .proc_handler   = proc_dointvec_minmax,
1443                 .extra1         = &minolduid,
1444                 .extra2         = &maxolduid,
1445         },
1446 #ifdef CONFIG_FILE_LOCKING
1447         {
1448                 .procname       = "leases-enable",
1449                 .data           = &leases_enable,
1450                 .maxlen         = sizeof(int),
1451                 .mode           = 0644,
1452                 .proc_handler   = proc_dointvec,
1453         },
1454 #endif
1455 #ifdef CONFIG_DNOTIFY
1456         {
1457                 .procname       = "dir-notify-enable",
1458                 .data           = &dir_notify_enable,
1459                 .maxlen         = sizeof(int),
1460                 .mode           = 0644,
1461                 .proc_handler   = proc_dointvec,
1462         },
1463 #endif
1464 #ifdef CONFIG_MMU
1465 #ifdef CONFIG_FILE_LOCKING
1466         {
1467                 .procname       = "lease-break-time",
1468                 .data           = &lease_break_time,
1469                 .maxlen         = sizeof(int),
1470                 .mode           = 0644,
1471                 .proc_handler   = proc_dointvec,
1472         },
1473 #endif
1474 #ifdef CONFIG_AIO
1475         {
1476                 .procname       = "aio-nr",
1477                 .data           = &aio_nr,
1478                 .maxlen         = sizeof(aio_nr),
1479                 .mode           = 0444,
1480                 .proc_handler   = proc_doulongvec_minmax,
1481         },
1482         {
1483                 .procname       = "aio-max-nr",
1484                 .data           = &aio_max_nr,
1485                 .maxlen         = sizeof(aio_max_nr),
1486                 .mode           = 0644,
1487                 .proc_handler   = proc_doulongvec_minmax,
1488         },
1489 #endif /* CONFIG_AIO */
1490 #ifdef CONFIG_INOTIFY_USER
1491         {
1492                 .procname       = "inotify",
1493                 .mode           = 0555,
1494                 .child          = inotify_table,
1495         },
1496 #endif  
1497 #ifdef CONFIG_EPOLL
1498         {
1499                 .procname       = "epoll",
1500                 .mode           = 0555,
1501                 .child          = epoll_table,
1502         },
1503 #endif
1504 #endif
1505 #ifdef CONFIG_PROTECTED_LINKS
1506         {
1507                 .procname       = "protected_symlinks",
1508                 .data           = &sysctl_protected_symlinks,
1509                 .maxlen         = sizeof(int),
1510                 .mode           = 0600,
1511                 .proc_handler   = proc_dointvec_minmax,
1512                 .extra1         = &zero,
1513                 .extra2         = &one,
1514         },
1515         {
1516                 .procname       = "protected_hardlinks",
1517                 .data           = &sysctl_protected_hardlinks,
1518                 .maxlen         = sizeof(int),
1519                 .mode           = 0600,
1520                 .proc_handler   = proc_dointvec_minmax,
1521                 .extra1         = &zero,
1522                 .extra2         = &one,
1523         },
1524 #endif
1525         {
1526                 .procname       = "suid_dumpable",
1527                 .data           = &suid_dumpable,
1528                 .maxlen         = sizeof(int),
1529                 .mode           = 0644,
1530                 .proc_handler   = proc_dointvec_minmax,
1531                 .extra1         = &zero,
1532                 .extra2         = &two,
1533         },
1534 #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
1535         {
1536                 .procname       = "binfmt_misc",
1537                 .mode           = 0555,
1538                 .child          = binfmt_misc_table,
1539         },
1540 #endif
1541         {
1542                 .procname       = "pipe-max-size",
1543                 .data           = &pipe_max_size,
1544                 .maxlen         = sizeof(int),
1545                 .mode           = 0644,
1546                 .proc_handler   = &pipe_proc_fn,
1547                 .extra1         = &pipe_min_size,
1548         },
1549         { }
1550 };
1551
1552 static struct ctl_table debug_table[] = {
1553 #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) || \
1554     defined(CONFIG_S390) || defined(CONFIG_TILE)
1555         {
1556                 .procname       = "exception-trace",
1557                 .data           = &show_unhandled_signals,
1558                 .maxlen         = sizeof(int),
1559                 .mode           = 0644,
1560                 .proc_handler   = proc_dointvec
1561         },
1562 #endif
1563 #if defined(CONFIG_OPTPROBES)
1564         {
1565                 .procname       = "kprobes-optimization",
1566                 .data           = &sysctl_kprobes_optimization,
1567                 .maxlen         = sizeof(int),
1568                 .mode           = 0644,
1569                 .proc_handler   = proc_kprobes_optimization_handler,
1570                 .extra1         = &zero,
1571                 .extra2         = &one,
1572         },
1573 #endif
1574         { }
1575 };
1576
1577 static struct ctl_table dev_table[] = {
1578         { }
1579 };
1580
1581 int __init sysctl_init(void)
1582 {
1583         register_sysctl_table(sysctl_base_table);
1584         return 0;
1585 }
1586
1587 #endif /* CONFIG_SYSCTL */
1588
1589 /*
1590  * /proc/sys support
1591  */
1592
1593 #ifdef CONFIG_PROC_SYSCTL
1594
1595 static int _proc_do_string(void* data, int maxlen, int write,
1596                            void __user *buffer,
1597                            size_t *lenp, loff_t *ppos)
1598 {
1599         size_t len;
1600         char __user *p;
1601         char c;
1602
1603         if (!data || !maxlen || !*lenp) {
1604                 *lenp = 0;
1605                 return 0;
1606         }
1607
1608         if (write) {
1609                 len = 0;
1610                 p = buffer;
1611                 while (len < *lenp) {
1612                         if (get_user(c, p++))
1613                                 return -EFAULT;
1614                         if (c == 0 || c == '\n')
1615                                 break;
1616                         len++;
1617                 }
1618                 if (len >= maxlen)
1619                         len = maxlen-1;
1620                 if(copy_from_user(data, buffer, len))
1621                         return -EFAULT;
1622                 ((char *) data)[len] = 0;
1623                 *ppos += *lenp;
1624         } else {
1625                 len = strlen(data);
1626                 if (len > maxlen)
1627                         len = maxlen;
1628
1629                 if (*ppos > len) {
1630                         *lenp = 0;
1631                         return 0;
1632                 }
1633
1634                 data += *ppos;
1635                 len  -= *ppos;
1636
1637                 if (len > *lenp)
1638                         len = *lenp;
1639                 if (len)
1640                         if(copy_to_user(buffer, data, len))
1641                                 return -EFAULT;
1642                 if (len < *lenp) {
1643                         if(put_user('\n', ((char __user *) buffer) + len))
1644                                 return -EFAULT;
1645                         len++;
1646                 }
1647                 *lenp = len;
1648                 *ppos += len;
1649         }
1650         return 0;
1651 }
1652
1653 /**
1654  * proc_dostring - read a string sysctl
1655  * @table: the sysctl table
1656  * @write: %TRUE if this is a write to the sysctl file
1657  * @buffer: the user buffer
1658  * @lenp: the size of the user buffer
1659  * @ppos: file position
1660  *
1661  * Reads/writes a string from/to the user buffer. If the kernel
1662  * buffer provided is not large enough to hold the string, the
1663  * string is truncated. The copied string is %NULL-terminated.
1664  * If the string is being read by the user process, it is copied
1665  * and a newline '\n' is added. It is truncated if the buffer is
1666  * not large enough.
1667  *
1668  * Returns 0 on success.
1669  */
1670 int proc_dostring(struct ctl_table *table, int write,
1671                   void __user *buffer, size_t *lenp, loff_t *ppos)
1672 {
1673         return _proc_do_string(table->data, table->maxlen, write,
1674                                buffer, lenp, ppos);
1675 }
1676
1677 static size_t proc_skip_spaces(char **buf)
1678 {
1679         size_t ret;
1680         char *tmp = skip_spaces(*buf);
1681         ret = tmp - *buf;
1682         *buf = tmp;
1683         return ret;
1684 }
1685
1686 static void proc_skip_char(char **buf, size_t *size, const char v)
1687 {
1688         while (*size) {
1689                 if (**buf != v)
1690                         break;
1691                 (*size)--;
1692                 (*buf)++;
1693         }
1694 }
1695
1696 #define TMPBUFLEN 22
1697 /**
1698  * proc_get_long - reads an ASCII formatted integer from a user buffer
1699  *
1700  * @buf: a kernel buffer
1701  * @size: size of the kernel buffer
1702  * @val: this is where the number will be stored
1703  * @neg: set to %TRUE if number is negative
1704  * @perm_tr: a vector which contains the allowed trailers
1705  * @perm_tr_len: size of the perm_tr vector
1706  * @tr: pointer to store the trailer character
1707  *
1708  * In case of success %0 is returned and @buf and @size are updated with
1709  * the amount of bytes read. If @tr is non-NULL and a trailing
1710  * character exists (size is non-zero after returning from this
1711  * function), @tr is updated with the trailing character.
1712  */
1713 static int proc_get_long(char **buf, size_t *size,
1714                           unsigned long *val, bool *neg,
1715                           const char *perm_tr, unsigned perm_tr_len, char *tr)
1716 {
1717         int len;
1718         char *p, tmp[TMPBUFLEN];
1719
1720         if (!*size)
1721                 return -EINVAL;
1722
1723         len = *size;
1724         if (len > TMPBUFLEN - 1)
1725                 len = TMPBUFLEN - 1;
1726
1727         memcpy(tmp, *buf, len);
1728
1729         tmp[len] = 0;
1730         p = tmp;
1731         if (*p == '-' && *size > 1) {
1732                 *neg = true;
1733                 p++;
1734         } else
1735                 *neg = false;
1736         if (!isdigit(*p))
1737                 return -EINVAL;
1738
1739         *val = simple_strtoul(p, &p, 0);
1740
1741         len = p - tmp;
1742
1743         /* We don't know if the next char is whitespace thus we may accept
1744          * invalid integers (e.g. 1234...a) or two integers instead of one
1745          * (e.g. 123...1). So lets not allow such large numbers. */
1746         if (len == TMPBUFLEN - 1)
1747                 return -EINVAL;
1748
1749         if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len))
1750                 return -EINVAL;
1751
1752         if (tr && (len < *size))
1753                 *tr = *p;
1754
1755         *buf += len;
1756         *size -= len;
1757
1758         return 0;
1759 }
1760
1761 /**
1762  * proc_put_long - converts an integer to a decimal ASCII formatted string
1763  *
1764  * @buf: the user buffer
1765  * @size: the size of the user buffer
1766  * @val: the integer to be converted
1767  * @neg: sign of the number, %TRUE for negative
1768  *
1769  * In case of success %0 is returned and @buf and @size are updated with
1770  * the amount of bytes written.
1771  */
1772 static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
1773                           bool neg)
1774 {
1775         int len;
1776         char tmp[TMPBUFLEN], *p = tmp;
1777
1778         sprintf(p, "%s%lu", neg ? "-" : "", val);
1779         len = strlen(tmp);
1780         if (len > *size)
1781                 len = *size;
1782         if (copy_to_user(*buf, tmp, len))
1783                 return -EFAULT;
1784         *size -= len;
1785         *buf += len;
1786         return 0;
1787 }
1788 #undef TMPBUFLEN
1789
1790 static int proc_put_char(void __user **buf, size_t *size, char c)
1791 {
1792         if (*size) {
1793                 char __user **buffer = (char __user **)buf;
1794                 if (put_user(c, *buffer))
1795                         return -EFAULT;
1796                 (*size)--, (*buffer)++;
1797                 *buf = *buffer;
1798         }
1799         return 0;
1800 }
1801
1802 static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
1803                                  int *valp,
1804                                  int write, void *data)
1805 {
1806         if (write) {
1807                 *valp = *negp ? -*lvalp : *lvalp;
1808         } else {
1809                 int val = *valp;
1810                 if (val < 0) {
1811                         *negp = true;
1812                         *lvalp = (unsigned long)-val;
1813                 } else {
1814                         *negp = false;
1815                         *lvalp = (unsigned long)val;
1816                 }
1817         }
1818         return 0;
1819 }
1820
1821 static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
1822
1823 static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
1824                   int write, void __user *buffer,
1825                   size_t *lenp, loff_t *ppos,
1826                   int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
1827                               int write, void *data),
1828                   void *data)
1829 {
1830         int *i, vleft, first = 1, err = 0;
1831         unsigned long page = 0;
1832         size_t left;
1833         char *kbuf;
1834         
1835         if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
1836                 *lenp = 0;
1837                 return 0;
1838         }
1839         
1840         i = (int *) tbl_data;
1841         vleft = table->maxlen / sizeof(*i);
1842         left = *lenp;
1843
1844         if (!conv)
1845                 conv = do_proc_dointvec_conv;
1846
1847         if (write) {
1848                 if (left > PAGE_SIZE - 1)
1849                         left = PAGE_SIZE - 1;
1850                 page = __get_free_page(GFP_TEMPORARY);
1851                 kbuf = (char *) page;
1852                 if (!kbuf)
1853                         return -ENOMEM;
1854                 if (copy_from_user(kbuf, buffer, left)) {
1855                         err = -EFAULT;
1856                         goto free;
1857                 }
1858                 kbuf[left] = 0;
1859         }
1860
1861         for (; left && vleft--; i++, first=0) {
1862                 unsigned long lval;
1863                 bool neg;
1864
1865                 if (write) {
1866                         left -= proc_skip_spaces(&kbuf);
1867
1868                         if (!left)
1869                                 break;
1870                         err = proc_get_long(&kbuf, &left, &lval, &neg,
1871                                              proc_wspace_sep,
1872                                              sizeof(proc_wspace_sep), NULL);
1873                         if (err)
1874                                 break;
1875                         if (conv(&neg, &lval, i, 1, data)) {
1876                                 err = -EINVAL;
1877                                 break;
1878                         }
1879                 } else {
1880                         if (conv(&neg, &lval, i, 0, data)) {
1881                                 err = -EINVAL;
1882                                 break;
1883                         }
1884                         if (!first)
1885                                 err = proc_put_char(&buffer, &left, '\t');
1886                         if (err)
1887                                 break;
1888                         err = proc_put_long(&buffer, &left, lval, neg);
1889                         if (err)
1890                                 break;
1891                 }
1892         }
1893
1894         if (!write && !first && left && !err)
1895                 err = proc_put_char(&buffer, &left, '\n');
1896         if (write && !err && left)
1897                 left -= proc_skip_spaces(&kbuf);
1898 free:
1899         if (write) {
1900                 free_page(page);
1901                 if (first)
1902                         return err ? : -EINVAL;
1903         }
1904         *lenp -= left;
1905         *ppos += *lenp;
1906         return err;
1907 }
1908
1909 static int do_proc_dointvec(struct ctl_table *table, int write,
1910                   void __user *buffer, size_t *lenp, loff_t *ppos,
1911                   int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
1912                               int write, void *data),
1913                   void *data)
1914 {
1915         return __do_proc_dointvec(table->data, table, write,
1916                         buffer, lenp, ppos, conv, data);
1917 }
1918
1919 /**
1920  * proc_dointvec - read a vector of integers
1921  * @table: the sysctl table
1922  * @write: %TRUE if this is a write to the sysctl file
1923  * @buffer: the user buffer
1924  * @lenp: the size of the user buffer
1925  * @ppos: file position
1926  *
1927  * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
1928  * values from/to the user buffer, treated as an ASCII string. 
1929  *
1930  * Returns 0 on success.
1931  */
1932 int proc_dointvec(struct ctl_table *table, int write,
1933                      void __user *buffer, size_t *lenp, loff_t *ppos)
1934 {
1935     return do_proc_dointvec(table,write,buffer,lenp,ppos,
1936                             NULL,NULL);
1937 }
1938
1939 /*
1940  * Taint values can only be increased
1941  * This means we can safely use a temporary.
1942  */
1943 static int proc_taint(struct ctl_table *table, int write,
1944                                void __user *buffer, size_t *lenp, loff_t *ppos)
1945 {
1946         struct ctl_table t;
1947         unsigned long tmptaint = get_taint();
1948         int err;
1949
1950         if (write && !capable(CAP_SYS_ADMIN))
1951                 return -EPERM;
1952
1953         t = *table;
1954         t.data = &tmptaint;
1955         err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
1956         if (err < 0)
1957                 return err;
1958
1959         if (write) {
1960                 /*
1961                  * Poor man's atomic or. Not worth adding a primitive
1962                  * to everyone's atomic.h for this
1963                  */
1964                 int i;
1965                 for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
1966                         if ((tmptaint >> i) & 1)
1967                                 add_taint(i);
1968                 }
1969         }
1970
1971         return err;
1972 }
1973
1974 #ifdef CONFIG_PRINTK
1975 static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
1976                                 void __user *buffer, size_t *lenp, loff_t *ppos)
1977 {
1978         if (write && !capable(CAP_SYS_ADMIN))
1979                 return -EPERM;
1980
1981         return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
1982 }
1983 #endif
1984
1985 struct do_proc_dointvec_minmax_conv_param {
1986         int *min;
1987         int *max;
1988 };
1989
1990 static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
1991                                         int *valp,
1992                                         int write, void *data)
1993 {
1994         struct do_proc_dointvec_minmax_conv_param *param = data;
1995         if (write) {
1996                 int val = *negp ? -*lvalp : *lvalp;
1997                 if ((param->min && *param->min > val) ||
1998                     (param->max && *param->max < val))
1999                         return -EINVAL;
2000                 *valp = val;
2001         } else {
2002                 int val = *valp;
2003                 if (val < 0) {
2004                         *negp = true;
2005                         *lvalp = (unsigned long)-val;
2006                 } else {
2007                         *negp = false;
2008                         *lvalp = (unsigned long)val;
2009                 }
2010         }
2011         return 0;
2012 }
2013
2014 /**
2015  * proc_dointvec_minmax - read a vector of integers with min/max values
2016  * @table: the sysctl table
2017  * @write: %TRUE if this is a write to the sysctl file
2018  * @buffer: the user buffer
2019  * @lenp: the size of the user buffer
2020  * @ppos: file position
2021  *
2022  * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2023  * values from/to the user buffer, treated as an ASCII string.
2024  *
2025  * This routine will ensure the values are within the range specified by
2026  * table->extra1 (min) and table->extra2 (max).
2027  *
2028  * Returns 0 on success.
2029  */
2030 int proc_dointvec_minmax(struct ctl_table *table, int write,
2031                   void __user *buffer, size_t *lenp, loff_t *ppos)
2032 {
2033         struct do_proc_dointvec_minmax_conv_param param = {
2034                 .min = (int *) table->extra1,
2035                 .max = (int *) table->extra2,
2036         };
2037         return do_proc_dointvec(table, write, buffer, lenp, ppos,
2038                                 do_proc_dointvec_minmax_conv, &param);
2039 }
2040
2041 static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
2042                                      void __user *buffer,
2043                                      size_t *lenp, loff_t *ppos,
2044                                      unsigned long convmul,
2045                                      unsigned long convdiv)
2046 {
2047         unsigned long *i, *min, *max;
2048         int vleft, first = 1, err = 0;
2049         unsigned long page = 0;
2050         size_t left;
2051         char *kbuf;
2052
2053         if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
2054                 *lenp = 0;
2055                 return 0;
2056         }
2057
2058         i = (unsigned long *) data;
2059         min = (unsigned long *) table->extra1;
2060         max = (unsigned long *) table->extra2;
2061         vleft = table->maxlen / sizeof(unsigned long);
2062         left = *lenp;
2063
2064         if (write) {
2065                 if (left > PAGE_SIZE - 1)
2066                         left = PAGE_SIZE - 1;
2067                 page = __get_free_page(GFP_TEMPORARY);
2068                 kbuf = (char *) page;
2069                 if (!kbuf)
2070                         return -ENOMEM;
2071                 if (copy_from_user(kbuf, buffer, left)) {
2072                         err = -EFAULT;
2073                         goto free;
2074                 }
2075                 kbuf[left] = 0;
2076         }
2077
2078         for (; left && vleft--; i++, first = 0) {
2079                 unsigned long val;
2080
2081                 if (write) {
2082                         bool neg;
2083
2084                         left -= proc_skip_spaces(&kbuf);
2085
2086                         err = proc_get_long(&kbuf, &left, &val, &neg,
2087                                              proc_wspace_sep,
2088                                              sizeof(proc_wspace_sep), NULL);
2089                         if (err)
2090                                 break;
2091                         if (neg)
2092                                 continue;
2093                         if ((min && val < *min) || (max && val > *max))
2094                                 continue;
2095                         *i = val;
2096                 } else {
2097                         val = convdiv * (*i) / convmul;
2098                         if (!first)
2099                                 err = proc_put_char(&buffer, &left, '\t');
2100                         err = proc_put_long(&buffer, &left, val, false);
2101                         if (err)
2102                                 break;
2103                 }
2104         }
2105
2106         if (!write && !first && left && !err)
2107                 err = proc_put_char(&buffer, &left, '\n');
2108         if (write && !err)
2109                 left -= proc_skip_spaces(&kbuf);
2110 free:
2111         if (write) {
2112                 free_page(page);
2113                 if (first)
2114                         return err ? : -EINVAL;
2115         }
2116         *lenp -= left;
2117         *ppos += *lenp;
2118         return err;
2119 }
2120
2121 static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
2122                                      void __user *buffer,
2123                                      size_t *lenp, loff_t *ppos,
2124                                      unsigned long convmul,
2125                                      unsigned long convdiv)
2126 {
2127         return __do_proc_doulongvec_minmax(table->data, table, write,
2128                         buffer, lenp, ppos, convmul, convdiv);
2129 }
2130
2131 /**
2132  * proc_doulongvec_minmax - read a vector of long integers with min/max values
2133  * @table: the sysctl table
2134  * @write: %TRUE if this is a write to the sysctl file
2135  * @buffer: the user buffer
2136  * @lenp: the size of the user buffer
2137  * @ppos: file position
2138  *
2139  * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
2140  * values from/to the user buffer, treated as an ASCII string.
2141  *
2142  * This routine will ensure the values are within the range specified by
2143  * table->extra1 (min) and table->extra2 (max).
2144  *
2145  * Returns 0 on success.
2146  */
2147 int proc_doulongvec_minmax(struct ctl_table *table, int write,
2148                            void __user *buffer, size_t *lenp, loff_t *ppos)
2149 {
2150     return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
2151 }
2152
2153 /**
2154  * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values
2155  * @table: the sysctl table
2156  * @write: %TRUE if this is a write to the sysctl file
2157  * @buffer: the user buffer
2158  * @lenp: the size of the user buffer
2159  * @ppos: file position
2160  *
2161  * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
2162  * values from/to the user buffer, treated as an ASCII string. The values
2163  * are treated as milliseconds, and converted to jiffies when they are stored.
2164  *
2165  * This routine will ensure the values are within the range specified by
2166  * table->extra1 (min) and table->extra2 (max).
2167  *
2168  * Returns 0 on success.
2169  */
2170 int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
2171                                       void __user *buffer,
2172                                       size_t *lenp, loff_t *ppos)
2173 {
2174     return do_proc_doulongvec_minmax(table, write, buffer,
2175                                      lenp, ppos, HZ, 1000l);
2176 }
2177
2178
2179 static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
2180                                          int *valp,
2181                                          int write, void *data)
2182 {
2183         if (write) {
2184                 if (*lvalp > LONG_MAX / HZ)
2185                         return 1;
2186                 *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
2187         } else {
2188                 int val = *valp;
2189                 unsigned long lval;
2190                 if (val < 0) {
2191                         *negp = true;
2192                         lval = (unsigned long)-val;
2193                 } else {
2194                         *negp = false;
2195                         lval = (unsigned long)val;
2196                 }
2197                 *lvalp = lval / HZ;
2198         }
2199         return 0;
2200 }
2201
2202 static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp,
2203                                                 int *valp,
2204                                                 int write, void *data)
2205 {
2206         if (write) {
2207                 if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
2208                         return 1;
2209                 *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
2210         } else {
2211                 int val = *valp;
2212                 unsigned long lval;
2213                 if (val < 0) {
2214                         *negp = true;
2215                         lval = (unsigned long)-val;
2216                 } else {
2217                         *negp = false;
2218                         lval = (unsigned long)val;
2219                 }
2220                 *lvalp = jiffies_to_clock_t(lval);
2221         }
2222         return 0;
2223 }
2224
2225 static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
2226                                             int *valp,
2227                                             int write, void *data)
2228 {
2229         if (write) {
2230                 *valp = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
2231         } else {
2232                 int val = *valp;
2233                 unsigned long lval;
2234                 if (val < 0) {
2235                         *negp = true;
2236                         lval = (unsigned long)-val;
2237                 } else {
2238                         *negp = false;
2239                         lval = (unsigned long)val;
2240                 }
2241                 *lvalp = jiffies_to_msecs(lval);
2242         }
2243         return 0;
2244 }
2245
2246 /**
2247  * proc_dointvec_jiffies - read a vector of integers as seconds
2248  * @table: the sysctl table
2249  * @write: %TRUE if this is a write to the sysctl file
2250  * @buffer: the user buffer
2251  * @lenp: the size of the user buffer
2252  * @ppos: file position
2253  *
2254  * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2255  * values from/to the user buffer, treated as an ASCII string. 
2256  * The values read are assumed to be in seconds, and are converted into
2257  * jiffies.
2258  *
2259  * Returns 0 on success.
2260  */
2261 int proc_dointvec_jiffies(struct ctl_table *table, int write,
2262                           void __user *buffer, size_t *lenp, loff_t *ppos)
2263 {
2264     return do_proc_dointvec(table,write,buffer,lenp,ppos,
2265                             do_proc_dointvec_jiffies_conv,NULL);
2266 }
2267
2268 /**
2269  * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds
2270  * @table: the sysctl table
2271  * @write: %TRUE if this is a write to the sysctl file
2272  * @buffer: the user buffer
2273  * @lenp: the size of the user buffer
2274  * @ppos: pointer to the file position
2275  *
2276  * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2277  * values from/to the user buffer, treated as an ASCII string. 
2278  * The values read are assumed to be in 1/USER_HZ seconds, and 
2279  * are converted into jiffies.
2280  *
2281  * Returns 0 on success.
2282  */
2283 int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
2284                                  void __user *buffer, size_t *lenp, loff_t *ppos)
2285 {
2286     return do_proc_dointvec(table,write,buffer,lenp,ppos,
2287                             do_proc_dointvec_userhz_jiffies_conv,NULL);
2288 }
2289
2290 /**
2291  * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
2292  * @table: the sysctl table
2293  * @write: %TRUE if this is a write to the sysctl file
2294  * @buffer: the user buffer
2295  * @lenp: the size of the user buffer
2296  * @ppos: file position
2297  * @ppos: the current position in the file
2298  *
2299  * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2300  * values from/to the user buffer, treated as an ASCII string. 
2301  * The values read are assumed to be in 1/1000 seconds, and 
2302  * are converted into jiffies.
2303  *
2304  * Returns 0 on success.
2305  */
2306 int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
2307                              void __user *buffer, size_t *lenp, loff_t *ppos)
2308 {
2309         return do_proc_dointvec(table, write, buffer, lenp, ppos,
2310                                 do_proc_dointvec_ms_jiffies_conv, NULL);
2311 }
2312
2313 static int proc_do_cad_pid(struct ctl_table *table, int write,
2314                            void __user *buffer, size_t *lenp, loff_t *ppos)
2315 {
2316         struct pid *new_pid;
2317         pid_t tmp;
2318         int r;
2319
2320         tmp = pid_vnr(cad_pid);
2321
2322         r = __do_proc_dointvec(&tmp, table, write, buffer,
2323                                lenp, ppos, NULL, NULL);
2324         if (r || !write)
2325                 return r;
2326
2327         new_pid = find_get_pid(tmp);
2328         if (!new_pid)
2329                 return -ESRCH;
2330
2331         put_pid(xchg(&cad_pid, new_pid));
2332         return 0;
2333 }
2334
2335 /**
2336  * proc_do_large_bitmap - read/write from/to a large bitmap
2337  * @table: the sysctl table
2338  * @write: %TRUE if this is a write to the sysctl file
2339  * @buffer: the user buffer
2340  * @lenp: the size of the user buffer
2341  * @ppos: file position
2342  *
2343  * The bitmap is stored at table->data and the bitmap length (in bits)
2344  * in table->maxlen.
2345  *
2346  * We use a range comma separated format (e.g. 1,3-4,10-10) so that
2347  * large bitmaps may be represented in a compact manner. Writing into
2348  * the file will clear the bitmap then update it with the given input.
2349  *
2350  * Returns 0 on success.
2351  */
2352 int proc_do_large_bitmap(struct ctl_table *table, int write,
2353                          void __user *buffer, size_t *lenp, loff_t *ppos)
2354 {
2355         int err = 0;
2356         bool first = 1;
2357         size_t left = *lenp;
2358         unsigned long bitmap_len = table->maxlen;
2359         unsigned long *bitmap = (unsigned long *) table->data;
2360         unsigned long *tmp_bitmap = NULL;
2361         char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c;
2362
2363         if (!bitmap_len || !left || (*ppos && !write)) {
2364                 *lenp = 0;
2365                 return 0;
2366         }
2367
2368         if (write) {
2369                 unsigned long page = 0;
2370                 char *kbuf;
2371
2372                 if (left > PAGE_SIZE - 1)
2373                         left = PAGE_SIZE - 1;
2374
2375                 page = __get_free_page(GFP_TEMPORARY);
2376                 kbuf = (char *) page;
2377                 if (!kbuf)
2378                         return -ENOMEM;
2379                 if (copy_from_user(kbuf, buffer, left)) {
2380                         free_page(page);
2381                         return -EFAULT;
2382                 }
2383                 kbuf[left] = 0;
2384
2385                 tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long),
2386                                      GFP_KERNEL);
2387                 if (!tmp_bitmap) {
2388                         free_page(page);
2389                         return -ENOMEM;
2390                 }
2391                 proc_skip_char(&kbuf, &left, '\n');
2392                 while (!err && left) {
2393                         unsigned long val_a, val_b;
2394                         bool neg;
2395
2396                         err = proc_get_long(&kbuf, &left, &val_a, &neg, tr_a,
2397                                              sizeof(tr_a), &c);
2398                         if (err)
2399                                 break;
2400                         if (val_a >= bitmap_len || neg) {
2401                                 err = -EINVAL;
2402                                 break;
2403                         }
2404
2405                         val_b = val_a;
2406                         if (left) {
2407                                 kbuf++;
2408                                 left--;
2409                         }
2410
2411                         if (c == '-') {
2412                                 err = proc_get_long(&kbuf, &left, &val_b,
2413                                                      &neg, tr_b, sizeof(tr_b),
2414                                                      &c);
2415                                 if (err)
2416                                         break;
2417                                 if (val_b >= bitmap_len || neg ||
2418                                     val_a > val_b) {
2419                                         err = -EINVAL;
2420                                         break;
2421                                 }
2422                                 if (left) {
2423                                         kbuf++;
2424                                         left--;
2425                                 }
2426                         }
2427
2428                         bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1);
2429                         first = 0;
2430                         proc_skip_char(&kbuf, &left, '\n');
2431                 }
2432                 free_page(page);
2433         } else {
2434                 unsigned long bit_a, bit_b = 0;
2435
2436                 while (left) {
2437                         bit_a = find_next_bit(bitmap, bitmap_len, bit_b);
2438                         if (bit_a >= bitmap_len)
2439                                 break;
2440                         bit_b = find_next_zero_bit(bitmap, bitmap_len,
2441                                                    bit_a + 1) - 1;
2442
2443                         if (!first) {
2444                                 err = proc_put_char(&buffer, &left, ',');
2445                                 if (err)
2446                                         break;
2447                         }
2448                         err = proc_put_long(&buffer, &left, bit_a, false);
2449                         if (err)
2450                                 break;
2451                         if (bit_a != bit_b) {
2452                                 err = proc_put_char(&buffer, &left, '-');
2453                                 if (err)
2454                                         break;
2455                                 err = proc_put_long(&buffer, &left, bit_b, false);
2456                                 if (err)
2457                                         break;
2458                         }
2459
2460                         first = 0; bit_b++;
2461                 }
2462                 if (!err)
2463                         err = proc_put_char(&buffer, &left, '\n');
2464         }
2465
2466         if (!err) {
2467                 if (write) {
2468                         if (*ppos)
2469                                 bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len);
2470                         else
2471                                 bitmap_copy(bitmap, tmp_bitmap, bitmap_len);
2472                 }
2473                 kfree(tmp_bitmap);
2474                 *lenp -= left;
2475                 *ppos += *lenp;
2476                 return 0;
2477         } else {
2478                 kfree(tmp_bitmap);
2479                 return err;
2480         }
2481 }
2482
2483 #else /* CONFIG_PROC_SYSCTL */
2484
2485 int proc_dostring(struct ctl_table *table, int write,
2486                   void __user *buffer, size_t *lenp, loff_t *ppos)
2487 {
2488         return -ENOSYS;
2489 }
2490
2491 int proc_dointvec(struct ctl_table *table, int write,
2492                   void __user *buffer, size_t *lenp, loff_t *ppos)
2493 {
2494         return -ENOSYS;
2495 }
2496
2497 int proc_dointvec_minmax(struct ctl_table *table, int write,
2498                     void __user *buffer, size_t *lenp, loff_t *ppos)
2499 {
2500         return -ENOSYS;
2501 }
2502
2503 int proc_dointvec_jiffies(struct ctl_table *table, int write,
2504                     void __user *buffer, size_t *lenp, loff_t *ppos)
2505 {
2506         return -ENOSYS;
2507 }
2508
2509 int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
2510                     void __user *buffer, size_t *lenp, loff_t *ppos)
2511 {
2512         return -ENOSYS;
2513 }
2514
2515 int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
2516                              void __user *buffer, size_t *lenp, loff_t *ppos)
2517 {
2518         return -ENOSYS;
2519 }
2520
2521 int proc_doulongvec_minmax(struct ctl_table *table, int write,
2522                     void __user *buffer, size_t *lenp, loff_t *ppos)
2523 {
2524         return -ENOSYS;
2525 }
2526
2527 int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
2528                                       void __user *buffer,
2529                                       size_t *lenp, loff_t *ppos)
2530 {
2531     return -ENOSYS;
2532 }
2533
2534
2535 #endif /* CONFIG_PROC_SYSCTL */
2536
2537 /*
2538  * No sense putting this after each symbol definition, twice,
2539  * exception granted :-)
2540  */
2541 EXPORT_SYMBOL(proc_dointvec);
2542 EXPORT_SYMBOL(proc_dointvec_jiffies);
2543 EXPORT_SYMBOL(proc_dointvec_minmax);
2544 EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
2545 EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
2546 EXPORT_SYMBOL(proc_dostring);
2547 EXPORT_SYMBOL(proc_doulongvec_minmax);
2548 EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);