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.easi@xxxxxxxxxx> > Cc: Omar Sandoval <osandov@xxxxxx>, > Cc: "Martin K. Petersen" <martin.petersen@xxxxxxxxxx>, > Cc: James Bottomley <james.bottomley@xxxxxxxxxxxxxxxxxxxxx>, > Cc: Christoph Hellwig <hch@xxxxxx>, > Cc: Don Brace <don.brace@xxxxxxxxxxxxx> > Cc: Kashyap Desai <kashyap.desai@xxxxxxxxxxxx> > Cc: Peter Rivera <peter.rivera@xxxxxxxxxxxx> > Cc: Mike Snitzer <snitzer@xxxxxxxxxx> > Reviewed-by: Hannes Reinecke <hare@xxxxxxx> > Tested-by: Laurence Oberman <loberman@xxxxxxxxxx> > Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> > --- > 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;