LCOV - code coverage report
Current view: top level - kernel - sysctl.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 6 438 1.4 %
Date: 2022-12-09 01:23:36 Functions: 1 38 2.6 %

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

Generated by: LCOV version 1.14