]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sysctl: Move UINT converter macros to sysctl header
authorJoel Granados <joel.granados@kernel.org>
Thu, 16 Oct 2025 08:38:45 +0000 (10:38 +0200)
committerJoel Granados <joel.granados@kernel.org>
Thu, 27 Nov 2025 14:45:37 +0000 (15:45 +0100)
Move SYSCTL_USER_TO_KERN_UINT_CONV and SYSCTL_UINT_CONV_CUSTOM macros to
include/linux/sysctl.h. No need to embed sysctl_kern_to_user_uint_conv
in a macro as it will not need a custom kernel pointer operation. This
is a preparation commit to enable jiffies converter creation outside
kernel/sysctl.c.

Signed-off-by: Joel Granados <joel.granados@kernel.org>
include/linux/sysctl.h
kernel/sysctl.c

index a0ca9496119ae3d473327a0ae343aa8d3a4ced36..fa78136617ad5155b27288925cc0ab3b717d4fa5 100644 (file)
@@ -134,6 +134,45 @@ int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\
        return 0;                                                       \
 }
 
+#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op)          \
+int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\
+                                       unsigned int *k_ptr)    \
+{                                                              \
+       unsigned long u = u_ptr_op(*u_ptr);                     \
+       if (u > UINT_MAX)                                       \
+               return -EINVAL;                                 \
+       WRITE_ONCE(*k_ptr, u);                                  \
+       return 0;                                               \
+}
+
+#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user,      \
+                               k_ptr_range_check)                      \
+int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \
+                          int dir, const struct ctl_table *tbl)        \
+{                                                                      \
+       if (SYSCTL_KERN_TO_USER(dir))                                   \
+               return kern_to_user(u_ptr, k_ptr);                      \
+                                                                       \
+       if (k_ptr_range_check) {                                        \
+               unsigned int tmp_k;                                     \
+               int ret;                                                \
+               if (!tbl)                                               \
+                       return -EINVAL;                                 \
+               ret = user_to_kern(u_ptr, &tmp_k);                      \
+               if (ret)                                                \
+                       return ret;                                     \
+               if ((tbl->extra1 &&                                     \
+                    *(unsigned int *)tbl->extra1 > tmp_k) ||           \
+                   (tbl->extra2 &&                                     \
+                    *(unsigned int *)tbl->extra2 < tmp_k))             \
+                       return -ERANGE;                                 \
+               WRITE_ONCE(*k_ptr, tmp_k);                              \
+       } else                                                          \
+               return user_to_kern(u_ptr, k_ptr);                      \
+       return 0;                                                       \
+}
+
+
 extern const unsigned long sysctl_long_vals[];
 
 typedef int proc_handler(const struct ctl_table *ctl, int write, void *buffer,
@@ -166,6 +205,7 @@ int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int, void *
 int proc_do_large_bitmap(const struct ctl_table *, int, void *, size_t *, loff_t *);
 int proc_do_static_key(const struct ctl_table *table, int write, void *buffer,
                size_t *lenp, loff_t *ppos);
+int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, const unsigned int *k_ptr);
 
 /*
  * Register a set of sysctl names by calling register_sysctl
index 0a33d92904dee72cace5b4e484f593950100d2f7..5a79622ad1cd42522878d04a66282cb4b4e7ed33 100644 (file)
@@ -387,54 +387,17 @@ static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax,
                              sysctl_user_to_kern_int_conv_ms,
                              sysctl_kern_to_user_int_conv_ms, true)
 
-#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op)          \
-int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\
-                                       unsigned int *k_ptr)    \
-{                                                              \
-       unsigned long u = u_ptr_op(*u_ptr);                     \
-       if (u > UINT_MAX)                                       \
-               return -EINVAL;                                 \
-       WRITE_ONCE(*k_ptr, u);                                  \
-       return 0;                                               \
-}
 
 static SYSCTL_USER_TO_KERN_UINT_CONV(, SYSCTL_CONV_IDENTITY)
 
-static int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr,
-                                        const unsigned int *k_ptr)
+int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr,
+                                 const unsigned int *k_ptr)
 {
        unsigned int val = READ_ONCE(*k_ptr);
        *u_ptr = (unsigned long)val;
        return 0;
 }
 
-#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user,      \
-                               k_ptr_range_check)                      \
-int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \
-                          int dir, const struct ctl_table *tbl)        \
-{                                                                      \
-       if (SYSCTL_KERN_TO_USER(dir))                                   \
-               return kern_to_user(u_ptr, k_ptr);                      \
-                                                                       \
-       if (k_ptr_range_check) {                                        \
-               unsigned int tmp_k;                                     \
-               int ret;                                                \
-               if (!tbl)                                               \
-                       return -EINVAL;                                 \
-               ret = user_to_kern(u_ptr, &tmp_k);                      \
-               if (ret)                                                \
-                       return ret;                                     \
-               if ((tbl->extra1 &&                                     \
-                    *(unsigned int *)tbl->extra1 > tmp_k) ||           \
-                   (tbl->extra2 &&                                     \
-                    *(unsigned int *)tbl->extra2 < tmp_k))             \
-                       return -ERANGE;                                 \
-               WRITE_ONCE(*k_ptr, tmp_k);                              \
-       } else                                                          \
-               return user_to_kern(u_ptr, k_ptr);                      \
-       return 0;                                                       \
-}
-
 static SYSCTL_UINT_CONV_CUSTOM(, sysctl_user_to_kern_uint_conv,
                               sysctl_kern_to_user_uint_conv, false)
 static SYSCTL_UINT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_uint_conv,