Message ID | 20231001185448.48893-3-michael.christie@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ublk: Allow more than 64 ublk devices | expand |
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@oracle.com> > --- > 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); > +} > + > +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. Otherwise, this patch looks fine. Thanks, Ming
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@oracle.com> >> --- >> 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.
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; +} + +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, +}; + +module_param_cb(ublks_max, &ublk_max_ublks_ops, NULL, 0644); MODULE_PARM_DESC(ublks_max, "max number of ublk devices allowed to add(default: 64)"); MODULE_AUTHOR("Ming Lei <ming.lei@redhat.com>");
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@oracle.com> --- drivers/block/ublk_drv.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)