mbox series

[RFC,00/21] block: add and use init tagset helper

Message ID 20221005032257.80681-1-kch@nvidia.com
Headers show
Series block: add and use init tagset helper | expand

Message

Chaitanya Kulkarni Oct. 5, 2022, 3:22 a.m. UTC
Hi,

Add and use the helper to initialize the common fields of the tag_set
such as blk_mq_ops, number of h/w queues, queue depth, command size,
numa_node, timeout, BLK_MQ_F_XXX flags, driver data. This initialization
is spread all over the block drivers. This avoids repetation of
inialization code of the tag set in current block drivers and any future
ones.

P.S. I'm aware of the EXPORT_SYMBOL_GPL() checkpatch warn just to make
get some feedback to so I can remove the RFC tag.

-ck

Chaitanya Kulkarni (21):
  block: add and use init tagset helper
  loop: use lib tagset init helper
  nbd: use lib tagset init helper
  rnbd: use lib tagset init helper
  bsg-lib: use lib tagset init helper
  rnbd-clt: use lib tagset init helper
  virtio-blk: use lib tagset init helper
  scsi: use lib tagset init helper
  block: use lib tagset init helper
  amiflop: use lib tagset init helper
  floppy: use lib tagset init helper
  mtip32xx: use lib tagset init helper
  z3ram: use lib tagset init helper
  scm_blk: use lib tagset init helper
  ubi: use lib tagset init helper
  mmc: core: use lib tagset init helper
  dasd: use lib tagset init helper
  nvme-core: use lib tagset init helper for I/O q
  nvme-core: use lib tagset init helper for adminq
  nvme-apple: use lib tagset init helper
  nvme-pci: use lib tagset init helper

 block/blk-mq.c                    | 27 ++++++++++++++++++++++-----
 block/bsg-lib.c                   |  9 +++------
 drivers/block/amiflop.c           |  8 +++-----
 drivers/block/floppy.c            |  7 ++-----
 drivers/block/loop.c              | 12 ++++--------
 drivers/block/mtip32xx/mtip32xx.c | 13 ++++---------
 drivers/block/nbd.c               | 11 +++--------
 drivers/block/null_blk/main.c     | 10 +++-------
 drivers/block/rbd.c               | 11 +++++------
 drivers/block/rnbd/rnbd-clt.c     | 25 +++++++++++--------------
 drivers/block/virtio_blk.c        | 14 +++++---------
 drivers/block/z2ram.c             |  7 ++-----
 drivers/mmc/core/queue.c          |  9 +++------
 drivers/mtd/ubi/block.c           | 11 +++--------
 drivers/nvme/host/apple.c         | 25 ++++++++-----------------
 drivers/nvme/host/core.c          | 21 +++++----------------
 drivers/nvme/host/pci.c           | 25 +++++++------------------
 drivers/s390/block/dasd_genhd.c   |  9 +++------
 drivers/s390/block/scm_blk.c      | 10 +++-------
 drivers/scsi/scsi_lib.c           | 13 +++++--------
 include/linux/blk-mq.h            |  5 +++++
 21 files changed, 109 insertions(+), 173 deletions(-)

Comments

Ulf Hansson Oct. 5, 2022, 9:47 a.m. UTC | #1
On Wed, 5 Oct 2022 at 07:11, Damien Le Moal
<damien.lemoal@opensource.wdc.com> wrote:
>
> On 10/5/22 12:22, Chaitanya Kulkarni wrote:
> > Add and use the helper to initialize the common fields of the tag_set
> > such as blk_mq_ops, number of h/w queues, queue depth, command size,
> > numa_node, timeout, BLK_MQ_F_XXX flags, driver data. This initialization
> > is spread all over the block drivers. This avoids the code repetation of
> > the inialization code of the tag set in current block drivers and any
>
> s/inialization/initialization
> s/repetation/repetition
>
> > future ones.
> >
> > Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com>
> > ---
> >  block/blk-mq.c                | 20 ++++++++++++++++++++
> >  drivers/block/null_blk/main.c | 10 +++-------
> >  include/linux/blk-mq.h        |  5 +++++
> >  3 files changed, 28 insertions(+), 7 deletions(-)
> >
> > diff --git a/block/blk-mq.c b/block/blk-mq.c
> > index 8070b6c10e8d..e3a8dd81bbe2 100644
> > --- a/block/blk-mq.c
> > +++ b/block/blk-mq.c
> > @@ -4341,6 +4341,26 @@ static int blk_mq_alloc_tag_set_tags(struct blk_mq_tag_set *set,
> >       return blk_mq_realloc_tag_set_tags(set, 0, new_nr_hw_queues);
> >  }
> >
> > +void blk_mq_init_tag_set(struct blk_mq_tag_set *set,
> > +             const struct blk_mq_ops *ops, unsigned int nr_hw_queues,
> > +             unsigned int queue_depth, unsigned int cmd_size, int numa_node,
> > +             unsigned int timeout, unsigned int flags, void *driver_data)
>
> That is an awful lot of arguments... I would be tempted to say pack all
> these into a struct but then that would kind of negate this patchset goal.
> Using a function with that many arguments will be error prone, and hard to
> review... Not a fan.

I completely agree.

But there is also another problem going down this route. If/when we
realize that there is another parameter needed in the blk_mq_tag_set.
Today that's quite easy to add (assuming the parameter can be
optional), without changing the blk_mq_init_tag_set() interface.

>
> > +{
> > +     if (!set)
> > +             return;
> > +
> > +     set->ops = ops;
> > +     set->nr_hw_queues = nr_hw_queues;
> > +     set->queue_depth = queue_depth;
> > +     set->cmd_size = cmd_size;
> > +     set->numa_node = numa_node;
> > +     set->timeout = timeout;
> > +     set->flags = flags;
> > +     set->driver_data = driver_data;
> > +}
> > +
>

[...]

Kind regards
Uffe
Bart Van Assche Oct. 5, 2022, 4:54 p.m. UTC | #2
On 10/5/22 02:47, Ulf Hansson wrote:
> On Wed, 5 Oct 2022 at 07:11, Damien Le Moal <damien.lemoal@opensource.wdc.com> wrote:
>> On 10/5/22 12:22, Chaitanya Kulkarni wrote:
>>> +void blk_mq_init_tag_set(struct blk_mq_tag_set *set,
>>> +             const struct blk_mq_ops *ops, unsigned int nr_hw_queues,
>>> +             unsigned int queue_depth, unsigned int cmd_size, int numa_node,
>>> +             unsigned int timeout, unsigned int flags, void *driver_data)
>>
>> That is an awful lot of arguments... I would be tempted to say pack all
>> these into a struct but then that would kind of negate this patchset goal.
>> Using a function with that many arguments will be error prone, and hard to
>> review... Not a fan.
> 
> I completely agree.
> 
> But there is also another problem going down this route. If/when we
> realize that there is another parameter needed in the blk_mq_tag_set.
> Today that's quite easy to add (assuming the parameter can be
> optional), without changing the blk_mq_init_tag_set() interface.

Hi Chaitanya,

Please consider to drop the entire patch series. In addition to the 
disadvantages mentioned above I'd like to mention the following 
disadvantages:
* Replacing named member assignments with positional arguments in a
   function call makes code harder to read and harder to verify.
* This patch series makes tree-wide changes without improving the code
   in a substantial way.

Thanks,

Bart.
Luis Chamberlain Oct. 7, 2022, 6:26 p.m. UTC | #3
On Tue, Oct 04, 2022 at 08:22:36PM -0700, Chaitanya Kulkarni wrote:
> Hi,
> 
> Add and use the helper to initialize the common fields of the tag_set
> such as blk_mq_ops, number of h/w queues, queue depth, command size,
> numa_node, timeout, BLK_MQ_F_XXX flags, driver data. This initialization
> is spread all over the block drivers. This avoids repetation of
> inialization code of the tag set in current block drivers and any future
> ones.
> 
> P.S. I'm aware of the EXPORT_SYMBOL_GPL() checkpatch warn just to make
> get some feedback to so I can remove the RFC tag.
> 

*If* there were commonalities at init and these could be broken up into
common groups, each having their own set of calls, then we simplify and
can abstract these. I say this without doing a complete review of the
removals, but if there really isn't much of commonalities I tend to
agree with Bart that open coding this is better.

  Luis
Christoph Hellwig Oct. 10, 2022, 7:55 a.m. UTC | #4
On Fri, Oct 07, 2022 at 11:26:13AM -0700, Luis Chamberlain wrote:
> *If* there were commonalities at init and these could be broken up into
> common groups, each having their own set of calls, then we simplify and
> can abstract these. I say this without doing a complete review of the
> removals, but if there really isn't much of commonalities I tend to
> agree with Bart that open coding this is better.

The commonality is that there are various required or optional
fields to fill out.  I actually have a WIP series to make the tag_set
dynamically allocated and refcounted to fix some long standing life time
issues.  That creates a new alloc helper that will take a few mandatory
arguments and would heavily clash with this series.