9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 1) /*
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 2) * proc sysctl test driver
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 3) *
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 4) * Copyright (C) 2017 Luis R. Rodriguez <mcgrof@kernel.org>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 5) *
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 6) * This program is free software; you can redistribute it and/or modify it
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 7) * under the terms of the GNU General Public License as published by the Free
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 8) * Software Foundation; either version 2 of the License, or at your option any
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 9) * later version; or, when distributed separately from the Linux kernel or
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 10) * when incorporated into other software packages, subject to the following
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 11) * license:
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 12) *
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 13) * This program is free software; you can redistribute it and/or modify it
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 14) * under the terms of copyleft-next (version 0.3.1 or later) as published
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 15) * at http://copyleft-next.org/.
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 16) */
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 17)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 18) /*
2d0469814ade6 (Randy Dunlap 2020-10-15 20:11:10 -0700 19) * This module provides an interface to the proc sysctl interfaces. This
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 20) * driver requires CONFIG_PROC_SYSCTL. It will not normally be loaded by the
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 21) * system unless explicitly requested by name. You can also build this driver
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 22) * into your kernel.
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 23) */
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 24)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 25) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 26)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 27) #include <linux/init.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 28) #include <linux/list.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 29) #include <linux/module.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 30) #include <linux/printk.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 31) #include <linux/fs.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 32) #include <linux/miscdevice.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 33) #include <linux/slab.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 34) #include <linux/uaccess.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 35) #include <linux/async.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 36) #include <linux/delay.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 37) #include <linux/vmalloc.h>
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 38)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 39) static int i_zero;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 40) static int i_one_hundred = 100;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 41)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 42) struct test_sysctl_data {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 43) int int_0001;
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 44) int int_0002;
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 45) int int_0003[4];
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 46)
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 47) int boot_int;
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 48)
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 49) unsigned int uint_0001;
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 50)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 51) char string_0001[65];
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 52)
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 53) #define SYSCTL_TEST_BITMAP_SIZE 65536
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 54) unsigned long *bitmap_0001;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 55) };
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 56)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 57) static struct test_sysctl_data test_data = {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 58) .int_0001 = 60,
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 59) .int_0002 = 1,
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 60)
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 61) .int_0003[0] = 0,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 62) .int_0003[1] = 1,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 63) .int_0003[2] = 2,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 64) .int_0003[3] = 3,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 65)
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 66) .boot_int = 0,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 67)
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 68) .uint_0001 = 314,
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 69)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 70) .string_0001 = "(none)",
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 71) };
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 72)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 73) /* These are all under /proc/sys/debug/test_sysctl/ */
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 74) static struct ctl_table test_table[] = {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 75) {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 76) .procname = "int_0001",
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 77) .data = &test_data.int_0001,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 78) .maxlen = sizeof(int),
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 79) .mode = 0644,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 80) .proc_handler = proc_dointvec_minmax,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 81) .extra1 = &i_zero,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 82) .extra2 = &i_one_hundred,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 83) },
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 84) {
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 85) .procname = "int_0002",
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 86) .data = &test_data.int_0002,
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 87) .maxlen = sizeof(int),
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 88) .mode = 0644,
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 89) .proc_handler = proc_dointvec,
eb965eda1cabf (Luis R. Rodriguez 2017-07-12 14:33:52 -0700 90) },
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 91) {
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 92) .procname = "int_0003",
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 93) .data = &test_data.int_0003,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 94) .maxlen = sizeof(test_data.int_0003),
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 95) .mode = 0644,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 96) .proc_handler = proc_dointvec,
7c43a657a4bea (Luis R. Rodriguez 2017-07-12 14:33:58 -0700 97) },
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 98) {
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 99) .procname = "boot_int",
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 100) .data = &test_data.boot_int,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 101) .maxlen = sizeof(test_data.boot_int),
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 102) .mode = 0644,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 103) .proc_handler = proc_dointvec,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 104) .extra1 = SYSCTL_ZERO,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 105) .extra2 = SYSCTL_ONE,
4f2f682d89d83 (Vlastimil Babka 2020-06-07 21:40:38 -0700 106) },
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 107) {
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 108) .procname = "uint_0001",
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 109) .data = &test_data.uint_0001,
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 110) .maxlen = sizeof(unsigned int),
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 111) .mode = 0644,
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 112) .proc_handler = proc_douintvec,
2920fad3a5d39 (Luis R. Rodriguez 2017-07-12 14:33:55 -0700 113) },
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 114) {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 115) .procname = "string_0001",
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 116) .data = &test_data.string_0001,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 117) .maxlen = sizeof(test_data.string_0001),
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 118) .mode = 0644,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 119) .proc_handler = proc_dostring,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 120) },
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 121) {
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 122) .procname = "bitmap_0001",
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 123) .data = &test_data.bitmap_0001,
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 124) .maxlen = SYSCTL_TEST_BITMAP_SIZE,
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 125) .mode = 0644,
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 126) .proc_handler = proc_do_large_bitmap,
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 127) },
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 128) { }
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 129) };
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 130)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 131) static struct ctl_table test_sysctl_table[] = {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 132) {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 133) .procname = "test_sysctl",
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 134) .maxlen = 0,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 135) .mode = 0555,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 136) .child = test_table,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 137) },
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 138) { }
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 139) };
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 140)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 141) static struct ctl_table test_sysctl_root_table[] = {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 142) {
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 143) .procname = "debug",
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 144) .maxlen = 0,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 145) .mode = 0555,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 146) .child = test_sysctl_table,
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 147) },
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 148) { }
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 149) };
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 150)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 151) static struct ctl_table_header *test_sysctl_header;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 152)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 153) static int __init test_sysctl_init(void)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 154) {
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 155) test_data.bitmap_0001 = kzalloc(SYSCTL_TEST_BITMAP_SIZE/8, GFP_KERNEL);
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 156) if (!test_data.bitmap_0001)
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 157) return -ENOMEM;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 158) test_sysctl_header = register_sysctl_table(test_sysctl_root_table);
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 159) if (!test_sysctl_header) {
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 160) kfree(test_data.bitmap_0001);
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 161) return -ENOMEM;
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 162) }
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 163) return 0;
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 164) }
2f56f84511367 (Masami Hiramatsu 2020-05-28 23:52:16 +0900 165) module_init(test_sysctl_init);
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 166)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 167) static void __exit test_sysctl_exit(void)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 168) {
2ea622b887e74 (Eric Sandeen 2019-05-14 15:45:10 -0700 169) kfree(test_data.bitmap_0001);
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 170) if (test_sysctl_header)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 171) unregister_sysctl_table(test_sysctl_header);
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 172) }
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 173)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 174) module_exit(test_sysctl_exit);
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 175)
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 176) MODULE_AUTHOR("Luis R. Rodriguez <mcgrof@kernel.org>");
9308f2f9e7f05 (Luis R. Rodriguez 2017-07-12 14:33:43 -0700 177) MODULE_LICENSE("GPL");