summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorJoel Granados <joel.granados@kernel.org>2025-12-04 13:11:58 +0100
committerJoel Granados <joel.granados@kernel.org>2026-01-06 11:27:10 +0100
commitd174174c6776a340f5c25aab1ac47a2dd950f380 (patch)
tree82c1f5408a85b885cf6874149d87e2acfef1e7b4 /kernel
parentef153851af5b05c23b3484e7eebaadd18f2da6a9 (diff)
downloadlwn-d174174c6776a340f5c25aab1ac47a2dd950f380.tar.gz
lwn-d174174c6776a340f5c25aab1ac47a2dd950f380.zip
sysctl: replace SYSCTL_INT_CONV_CUSTOM macro with functions
Remove SYSCTL_INT_CONV_CUSTOM and replace it with proc_int_conv. This converter function expects a negp argument as it can take on negative values. Update all jiffies converters to use explicit function calls. Remove SYSCTL_CONV_IDENTITY as it is no longer used. Signed-off-by: Joel Granados <joel.granados@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sysctl.c47
-rw-r--r--kernel/time/jiffies.c39
2 files changed, 72 insertions, 14 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 42975aa84ee3..9d3a666ffde1 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -515,6 +515,33 @@ int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_ptr, const bool *negp,
return 0;
}
+int proc_int_conv(bool *negp, ulong *u_ptr, int *k_ptr, int dir,
+ const struct ctl_table *tbl, bool k_ptr_range_check,
+ int (*user_to_kern)(const bool *negp, const ulong *u_ptr, int *k_ptr),
+ int (*kern_to_user)(bool *negp, ulong *u_ptr, const int *k_ptr))
+{
+ if (SYSCTL_KERN_TO_USER(dir))
+ return kern_to_user(negp, u_ptr, k_ptr);
+
+ if (k_ptr_range_check) {
+ int tmp_k, ret;
+
+ if (!tbl)
+ return -EINVAL;
+ ret = user_to_kern(negp, u_ptr, &tmp_k);
+ if (ret)
+ return ret;
+ if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) ||
+ (tbl->extra2 && *(int *)tbl->extra2 < tmp_k))
+ return -EINVAL;
+ WRITE_ONCE(*k_ptr, tmp_k);
+ } else
+ return user_to_kern(negp, u_ptr, k_ptr);
+ return 0;
+}
+
+
+
static int sysctl_user_to_kern_int_conv(const bool *negp, const ulong *u_ptr,
int *k_ptr)
{
@@ -526,10 +553,22 @@ static int sysctl_kern_to_user_int_conv(bool *negp, ulong *u_ptr, const int *k_p
return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, NULL);
}
-static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_int_conv,
- sysctl_kern_to_user_int_conv, false)
-static SYSCTL_INT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_int_conv,
- sysctl_kern_to_user_int_conv, true)
+static int do_proc_int_conv(bool *negp, unsigned long *u_ptr, int *k_ptr,
+ int dir, const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false,
+ sysctl_user_to_kern_int_conv,
+ sysctl_kern_to_user_int_conv);
+
+}
+
+static int do_proc_int_conv_minmax(bool *negp, unsigned long *u_ptr, int *k_ptr,
+ int dir, const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, true,
+ sysctl_user_to_kern_int_conv,
+ sysctl_kern_to_user_int_conv);
+}
static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index 825e4c9fd26a..a5c7d15fce72 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -156,17 +156,36 @@ static int sysctl_k2u_int_conv_ms(bool *negp, ulong *u_ptr, const int *k_ptr)
return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, sysctl_jiffies_to_msecs);
}
+static int do_proc_int_conv_jiffies(bool *negp, ulong *u_ptr, int *k_ptr,
+ int dir, const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false,
+ sysctl_u2k_int_conv_hz, sysctl_k2u_int_conv_hz);
+}
+
+static int do_proc_int_conv_userhz_jiffies(bool *negp, ulong *u_ptr,
+ int *k_ptr, int dir,
+ const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false,
+ sysctl_u2k_int_conv_userhz,
+ sysctl_k2u_int_conv_userhz);
+}
-static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_u2k_int_conv_hz,
- sysctl_k2u_int_conv_hz, false)
-static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies,
- sysctl_u2k_int_conv_userhz,
- sysctl_k2u_int_conv_userhz, false)
-static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_u2k_int_conv_ms,
- sysctl_k2u_int_conv_ms, false)
-static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax,
- sysctl_u2k_int_conv_ms,
- sysctl_k2u_int_conv_ms, true)
+static int do_proc_int_conv_ms_jiffies(bool *negp, ulong *u_ptr, int *k_ptr,
+ int dir, const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false,
+ sysctl_u2k_int_conv_ms, sysctl_k2u_int_conv_ms);
+}
+
+static int do_proc_int_conv_ms_jiffies_minmax(bool *negp, ulong *u_ptr,
+ int *k_ptr, int dir,
+ const struct ctl_table *tbl)
+{
+ return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false,
+ sysctl_u2k_int_conv_ms, sysctl_k2u_int_conv_ms);
+}
#else // CONFIG_PROC_SYSCTL
static int do_proc_int_conv_jiffies(bool *negp, ulong *u_ptr, int *k_ptr,