]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
blk-mq: Allow PCI vector offset for mapping queues
authorKeith Busch <keith.busch@intel.com>
Tue, 27 Mar 2018 15:39:06 +0000 (09:39 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Mar 2018 03:25:36 +0000 (21:25 -0600)
The PCI interrupt vectors intended to be associated with a queue may
not start at 0; a driver may allocate pre_vectors for special use. This
patch adds an offset parameter so blk-mq may find the intended affinity
mask and updates all drivers using this API accordingly.

Cc: Don Brace <don.brace@microsemi.com>
Cc: <qla2xxx-upstream@qlogic.com>
Cc: <linux-scsi@vger.kernel.org>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-pci.c
drivers/nvme/host/pci.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/smartpqi/smartpqi_init.c
include/linux/blk-mq-pci.h

index 76944e3271bf34a730e62fa0b27266abce86942e..e233996bb76f2f94d1cef4249132144e379e90cd 100644 (file)
@@ -21,6 +21,7 @@
  * blk_mq_pci_map_queues - provide a default queue mapping for PCI device
  * @set:       tagset to provide the mapping for
  * @pdev:      PCI device associated with @set.
+ * @offset:    Offset to use for the pci irq vector
  *
  * This function assumes the PCI device @pdev has at least as many available
  * interrupt vectors as @set has queues.  It will then query the vector
  * that maps a queue to the CPUs that have irq affinity for the corresponding
  * vector.
  */
-int blk_mq_pci_map_queues(struct blk_mq_tag_set *set, struct pci_dev *pdev)
+int blk_mq_pci_map_queues(struct blk_mq_tag_set *set, struct pci_dev *pdev,
+                           int offset)
 {
        const struct cpumask *mask;
        unsigned int queue, cpu;
 
        for (queue = 0; queue < set->nr_hw_queues; queue++) {
-               mask = pci_irq_get_affinity(pdev, queue);
+               mask = pci_irq_get_affinity(pdev, queue + offset);
                if (!mask)
                        goto fallback;
 
index cef5ce851a9220a137c2b23b7ee4b0c977005331..e3b9efca0571db4d3d962a9deb1e6b8196207c8c 100644 (file)
@@ -414,7 +414,7 @@ static int nvme_pci_map_queues(struct blk_mq_tag_set *set)
 {
        struct nvme_dev *dev = set->driver_data;
 
-       return blk_mq_pci_map_queues(set, to_pci_dev(dev->dev));
+       return blk_mq_pci_map_queues(set, to_pci_dev(dev->dev), 0);
 }
 
 /**
index 12ee6e02d146d169940ead69af93d42d79d6508b..2c705f3dd26502a8476ef50d5108e7bf4d49bc6f 100644 (file)
@@ -6805,7 +6805,7 @@ static int qla2xxx_map_queues(struct Scsi_Host *shost)
        if (USER_CTRL_IRQ(vha->hw))
                rc = blk_mq_map_queues(&shost->tag_set);
        else
-               rc = blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev);
+               rc = blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev, 0);
        return rc;
 }
 
index b2880c7709e6c097633116dfa2ec38b4f22c241b..10c94011c8a83e051d30d37d2e6c7514d64128cf 100644 (file)
@@ -5348,7 +5348,7 @@ static int pqi_map_queues(struct Scsi_Host *shost)
 {
        struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
 
-       return blk_mq_pci_map_queues(&shost->tag_set, ctrl_info->pci_dev);
+       return blk_mq_pci_map_queues(&shost->tag_set, ctrl_info->pci_dev, 0);
 }
 
 static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info,
index 6338551e0fb9308fc43994353f96d6b6df235c3d..9f4c17f0d2d8f9bb08552e8c0d2b1cf49d7d8750 100644 (file)
@@ -5,6 +5,7 @@
 struct blk_mq_tag_set;
 struct pci_dev;
 
-int blk_mq_pci_map_queues(struct blk_mq_tag_set *set, struct pci_dev *pdev);
+int blk_mq_pci_map_queues(struct blk_mq_tag_set *set, struct pci_dev *pdev,
+                         int offset);
 
 #endif /* _LINUX_BLK_MQ_PCI_H */