>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: Hannes Reinecke <hare@xxxxxxx> 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: Laurence Oberman <loberman@xxxxxxxxxx> Cc: Mike Snitzer <snitzer@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; + shost->use_blk_mq = scsi_use_blk_mq || !!shost->hostt->force_blk_mq; device_initialize(&shost->shost_gendev); dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index a8b7bf879ced..4118760e5c32 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -452,6 +452,9 @@ struct scsi_host_template { /* True if the controller does not support WRITE SAME */ unsigned no_write_same:1; + /* tell scsi core we support blk-mq only */ + unsigned force_blk_mq:1; + /* * Countdown for host blocking with no commands outstanding. */ -- 2.9.5