On 10/3/23 10:47 AM, Ming Lei wrote: > On Sun, Oct 01, 2023 at 01:54:48PM -0500, Mike Christie wrote: >> We are converting tcmu applications to ublk, but have systems with up >> to 1k devices. This patch allows us to configure the ublks_max from >> userspace with the ublks_max modparam. >> >> Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> >> --- >> drivers/block/ublk_drv.c | 31 ++++++++++++++++++++++++++++++- >> 1 file changed, 30 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c >> index 18e352f8cd6d..2833a81e05c0 100644 >> --- a/drivers/block/ublk_drv.c >> +++ b/drivers/block/ublk_drv.c >> @@ -2940,7 +2940,36 @@ static void __exit ublk_exit(void) >> module_init(ublk_init); >> module_exit(ublk_exit); >> >> -module_param(ublks_max, int, 0444); >> +static int ublk_set_max_ublks(const char *buf, const struct kernel_param *kp) >> +{ >> + unsigned int max; >> + int ret; >> + >> + ret = kstrtouint(buf, 10, &max); >> + if (ret) >> + return ret; >> + >> + if (max > UBLK_MAX_UBLKS) { >> + pr_warn("Invalid ublks_max. Max supported is %d\n", >> + UBLK_MAX_UBLKS); >> + return -EINVAL; >> + } >> + >> + ublks_max = max; >> + return ret; > > It might be nice to reuse builtin helper: > > return param_set_uint_minmax(buf, kp, 0, UBLK_MAX_UBLKS); > Was looking for something like that but missed it. Will use. >> +} >> + >> +static int ublk_get_max_ublks(char *buf, const struct kernel_param *kp) >> +{ >> + return sysfs_emit(buf, "%d\n", ublks_max); >> +} >> + >> +static const struct kernel_param_ops ublk_max_ublks_ops = { >> + .set = ublk_set_max_ublks, >> + .get = ublk_get_max_ublks, > > Same with above, '.get = param_get_int,' could be better. > Will do.