On Mon, Feb 05, 2018 at 11:20:32PM +0800, Ming Lei wrote: > From scsi driver view, it is a bit troublesome to support both blk-mq > and non-blk-mq at the same time, especially when drivers need to support > multi hw-queue. > > This patch introduces 'force_blk_mq' to scsi_host_template so that drivers > can provide blk-mq only support, so driver code can avoid the trouble > for supporting both. > > This patch may clean up driver a lot by providing blk-mq only support, > espeically > it is easier to convert multiple reply queues into blk_mq's MQ for the > following > purposes: > > 1) use blk_mq multiple hw queue to deal with allocated irq vectors of all > offline > CPU affinity[1]: > > [1] https://marc.info/?l=linux-kernel&m=151748144730409&w=2 > > Now 84676c1f21e8ff5(genirq/affinity: assign vectors to all possible CPUs) > has been merged to V4.16-rc, and it is easy to allocate all offline CPUs > for some irq vectors, this can't be avoided even though the allocation > is improved. > > So all these drivers have to avoid to ask HBA to complete request in > reply queue which hasn't online CPUs assigned. > > This issue can be solved generically and easily via blk_mq(scsi_mq) multiple > hw queue by mapping each reply queue into hctx. > > 2) some drivers[1] require to complete request in the submission CPU for > avoiding hard/soft lockup, which is easily done with blk_mq, so not necessary > to reinvent wheels for solving the problem. > > [2] https://marc.info/?t=151601851400001&r=1&w=2 > > Sovling the above issues for non-MQ path may not be easy, or introduce > unnecessary work, especially we plan to enable SCSI_MQ soon as discussed > recently[3]: > > [3] https://marc.info/?l=linux-scsi&m=151727684915589&w=2 > > Cc: Arun Easi <arun.e...@cavium.com> > Cc: Omar Sandoval <osan...@fb.com>, > Cc: "Martin K. Petersen" <martin.peter...@oracle.com>, > Cc: James Bottomley <james.bottom...@hansenpartnership.com>, > Cc: Christoph Hellwig <h...@lst.de>, > Cc: Don Brace <don.br...@microsemi.com> > Cc: Kashyap Desai <kashyap.de...@broadcom.com> > Cc: Peter Rivera <peter.riv...@broadcom.com> > Cc: Mike Snitzer <snit...@redhat.com> > Reviewed-by: Hannes Reinecke <h...@suse.de> > Tested-by: Laurence Oberman <lober...@redhat.com> > Signed-off-by: Ming Lei <ming....@redhat.com> > --- > drivers/scsi/hosts.c | 1 + > include/scsi/scsi_host.h | 3 +++ > 2 files changed, 4 insertions(+) > > diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c > index fe3a0da3ec97..c75cebd7911d 100644 > --- a/drivers/scsi/hosts.c > +++ b/drivers/scsi/hosts.c > @@ -471,6 +471,7 @@ struct Scsi_Host *scsi_host_alloc(struct > scsi_host_template *sht, int privsize) > shost->dma_boundary = 0xffffffff; > > shost->use_blk_mq = scsi_use_blk_mq;
Not sure if this is a patch formatting issue, but this old line wasn't deleted. > + shost->use_blk_mq = scsi_use_blk_mq || !!shost->hostt->force_blk_mq;