Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

sysctl: Create integer converters with one macro

New SYSCTL_INT_CONV_CUSTOM macro creates "bi-directional" converters
from a user-to-kernel and a kernel-to-user functions. Replace integer
versions of do_proc_*_conv functions with the ones from the new macro.
Rename "_dointvec_" to just "_int_" as these converters are not applied
to vectors and the "do" is already in the name.

Move the USER_HZ validation directly into proc_dointvec_userhz_jiffies()

Signed-off-by: Joel Granados <joel.granados@kernel.org>

+25 -47
+25 -47
kernel/sysctl.c
··· 418 418 static SYSCTL_USER_TO_KERN_INT_CONV(_ms, msecs_to_jiffies) 419 419 static SYSCTL_KERN_TO_USER_INT_CONV(_ms, jiffies_to_msecs) 420 420 421 - static int do_proc_dointvec_conv(bool *negp, unsigned long *u_ptr, 422 - int *k_ptr, int dir, 423 - const struct ctl_table *table) 424 - { 425 - if (SYSCTL_USER_TO_KERN(dir)) { 426 - return sysctl_user_to_kern_int_conv(negp, u_ptr, k_ptr); 427 - } 428 - 429 - return sysctl_kern_to_user_int_conv(negp, u_ptr, k_ptr); 421 + #define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user) \ 422 + int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ 423 + int dir, const struct ctl_table *table) \ 424 + { \ 425 + if (SYSCTL_USER_TO_KERN(dir)) \ 426 + return user_to_kern(negp, u_ptr, k_ptr); \ 427 + return kern_to_user(negp, u_ptr, k_ptr); \ 430 428 } 429 + 430 + static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_int_conv, 431 + sysctl_kern_to_user_int_conv) 432 + static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_user_to_kern_int_conv_hz, 433 + sysctl_kern_to_user_int_conv_hz) 434 + static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies, 435 + sysctl_user_to_kern_int_conv_userhz, 436 + sysctl_kern_to_user_int_conv_userhz) 437 + static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_user_to_kern_int_conv_ms, 438 + sysctl_kern_to_user_int_conv_ms) 431 439 432 440 static int do_proc_douintvec_conv(unsigned long *u_ptr, 433 441 unsigned int *k_ptr, int dir, ··· 475 467 left = *lenp; 476 468 477 469 if (!conv) 478 - conv = do_proc_dointvec_conv; 470 + conv = do_proc_int_conv; 479 471 480 472 if (SYSCTL_USER_TO_KERN(dir)) { 481 473 if (proc_first_pos_non_zero_ignore(ppos, table)) ··· 732 724 */ 733 725 int *ip = SYSCTL_USER_TO_KERN(dir) ? &tmp : k_ptr; 734 726 735 - ret = do_proc_dointvec_conv(negp, u_ptr, ip, dir, table); 727 + ret = do_proc_int_conv(negp, u_ptr, ip, dir, table); 736 728 if (ret) 737 729 return ret; 738 730 ··· 994 986 lenp, ppos, HZ, 1000l); 995 987 } 996 988 997 - static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *u_ptr, 998 - int *k_ptr, int dir, 999 - const struct ctl_table *table) 1000 - { 1001 - if (SYSCTL_USER_TO_KERN(dir)) { 1002 - return sysctl_user_to_kern_int_conv_hz(negp, u_ptr, k_ptr); 1003 - } 1004 - return sysctl_kern_to_user_int_conv_hz(negp, u_ptr, k_ptr); 1005 - } 1006 - 1007 - static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *u_ptr, 1008 - int *k_ptr, int dir, 1009 - const struct ctl_table *table) 1010 - { 1011 - if (SYSCTL_USER_TO_KERN(dir)) { 1012 - if (USER_HZ < HZ) 1013 - return -EINVAL; 1014 - return sysctl_user_to_kern_int_conv_userhz(negp, u_ptr, k_ptr); 1015 - } 1016 - return sysctl_kern_to_user_int_conv_userhz(negp, u_ptr, k_ptr); 1017 - } 1018 - 1019 - static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *u_ptr, 1020 - int *k_ptr, int dir, 1021 - const struct ctl_table *table) 1022 - { 1023 - if (SYSCTL_USER_TO_KERN(dir)) { 1024 - return sysctl_user_to_kern_int_conv_ms(negp, u_ptr, k_ptr); 1025 - } 1026 - return sysctl_kern_to_user_int_conv_ms(negp, u_ptr, k_ptr); 1027 - } 1028 - 1029 989 static int do_proc_dointvec_ms_jiffies_minmax_conv(bool *negp, unsigned long *u_ptr, 1030 990 int *k_ptr, int dir, 1031 991 const struct ctl_table *table) ··· 1005 1029 */ 1006 1030 int *ip = SYSCTL_USER_TO_KERN(dir) ? &tmp : k_ptr; 1007 1031 1008 - ret = do_proc_dointvec_ms_jiffies_conv(negp, u_ptr, ip, dir, table); 1032 + ret = do_proc_int_conv_ms_jiffies(negp, u_ptr, ip, dir, table); 1009 1033 if (ret) 1010 1034 return ret; 1011 1035 ··· 1038 1062 void *buffer, size_t *lenp, loff_t *ppos) 1039 1063 { 1040 1064 return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1041 - do_proc_dointvec_jiffies_conv); 1065 + do_proc_int_conv_jiffies); 1042 1066 } 1043 1067 1044 1068 int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, ··· 1066 1090 int proc_dointvec_userhz_jiffies(const struct ctl_table *table, int dir, 1067 1091 void *buffer, size_t *lenp, loff_t *ppos) 1068 1092 { 1093 + if (SYSCTL_USER_TO_KERN(dir) && USER_HZ < HZ) 1094 + return -EINVAL; 1069 1095 return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1070 - do_proc_dointvec_userhz_jiffies_conv); 1096 + do_proc_int_conv_userhz_jiffies); 1071 1097 } 1072 1098 1073 1099 /** ··· 1091 1113 size_t *lenp, loff_t *ppos) 1092 1114 { 1093 1115 return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1094 - do_proc_dointvec_ms_jiffies_conv); 1116 + do_proc_int_conv_ms_jiffies); 1095 1117 } 1096 1118 1097 1119 /**