> I would do this: > > +#define NULL_PARAM(_name, _min, _max) \ > +static int null_param_##_name##_set(const char *s, \ > + const struct kernel_param *kp) \ > +{ \ > + return null_param_store_int(s, kp->arg, _min, _max); \ > +} \ > + \ > +static const struct kernel_param_ops null_##_name##_param_ops = { \ > + .set = null_param_##_name##_set, \ > + .get = param_get_int, \ > +} > + > > And then have: > > +NULL_PARAM(submit_queues, 1, INT_MAX); > +NULL_PARAM(poll_queues, 1, num_online_cpus()); > +NULL_PARAM(queue_mode, NULL_Q_BIO, NULL_Q_MQ); > +NULL_PARAM(gb, 1, INT_MAX); > +NULL_PARAM(bs, 512, 4096); > +NULL_PARAM(max_sectors, 1, INT_MAX); > +NULL_PARAM(irqmode, NULL_IRQ_NONE, NULL_IRQ_TIMER); > +NULL_PARAM(hw_qdepth, 1, INT_MAX); > > That can be done in a single patch and is overall a lot less code. > I did the same thing at first, however it doesn't allow us to print the right module parameter specific error message which I to add in this series especially for where this patch limits it nr_online_cpu(). let me send out V2 with right error messages ... -ck