On Mon, Jun 03, 2019 at 02:00:19PM +0100, John Garry wrote: > On 03/06/2019 12:00, Ming Lei wrote: > > On Fri, May 31, 2019 at 12:38:10PM +0100, John Garry wrote: > > > > > > > > > -fallback: > > > > > > - for_each_possible_cpu(cpu) > > > > > > - hisi_hba->reply_map[cpu] = cpu % hisi_hba->queue_count; > > > > > > - /* Don't clean all CQ masks */ > > > > > > -} > > > > > > - > > > > > > static int interrupt_init_v3_hw(struct hisi_hba *hisi_hba) > > > > > > { > > > > > > struct device *dev = hisi_hba->dev; > > > > > > @@ -2383,11 +2359,6 @@ static int interrupt_init_v3_hw(struct hisi_hba *hisi_hba) > > > > > > > > > > > > min_msi = MIN_AFFINE_VECTORS_V3_HW; > > > > > > > > > > > > - hisi_hba->reply_map = devm_kcalloc(dev, nr_cpu_ids, > > > > > > - sizeof(unsigned int), > > > > > > - GFP_KERNEL); > > > > > > - if (!hisi_hba->reply_map) > > > > > > - return -ENOMEM; > > > > > > vectors = pci_alloc_irq_vectors_affinity(hisi_hba->pci_dev, > > > > > > min_msi, max_msi, > > > > > > PCI_IRQ_MSI | > > > > > > @@ -2395,7 +2366,6 @@ static int interrupt_init_v3_hw(struct hisi_hba *hisi_hba) > > > > > > &desc); > > > > > > if (vectors < 0) > > > > > > return -ENOENT; > > > > > > - setup_reply_map_v3_hw(hisi_hba, vectors - BASE_VECTORS_V3_HW); > > > > > > } else { > > > > > > min_msi = max_msi; > > > > > > vectors = pci_alloc_irq_vectors(hisi_hba->pci_dev, min_msi, > > > > > > @@ -2896,6 +2866,18 @@ static void debugfs_snapshot_restore_v3_hw(struct hisi_hba *hisi_hba) > > > > > > clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); > > > > > > } > > > > > > > > > > > > +static int hisi_sas_map_queues(struct Scsi_Host *shost) > > > > > > +{ > > > > > > + struct hisi_hba *hisi_hba = shost_priv(shost); > > > > > > + struct blk_mq_queue_map *qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT]; > > > > > > + > > > > > > + if (auto_affine_msi_experimental) > > > > > > + return blk_mq_pci_map_queues(qmap, hisi_hba->pci_dev, > > > > > > + BASE_VECTORS_V3_HW); > > > > > > + else > > > > > > + return blk_mq_map_queues(qmap); > > > > > > I don't think that the mapping which blk_mq_map_queues() creates are not > > > want we want. I'm guessing that we still would like a mapping similar to > > > what blk_mq_pci_map_queues() produces, which is an even spread, putting > > > adjacent CPUs on the same queue. > > > > > > For my system with 96 cpus and 16 queues, blk_mq_map_queues() would map > > > queue 0 to cpu 0, 16, 32, 48 ..., queue 1 to cpu 1, 17, 33 and so on. > > > > Hi Ming, > > > blk_mq_map_queues() is the default or fallback mapping in case that managed > > irq isn't used. If the mapping isn't good enough, we still can improve it > > in future, then any driver applying it can got improved. > > > > That's the right attitude. However, as I see, we can only know the mapping > when we know the interrupt affinity or some other mapping restriction or > rule etc, which we don't know in this case. > > For now, personally I would rather if we only expose multiple queues for > when auto_affine_msi_experimental is set. I fear that we may make a > performance regression for !auto_affine_msi_experimental with this patch. We > would need to test. I suggest to use the blk-mq generic helper. The default queue mapping of blk_mq_map_queues() has been used for a while, so far so good, such as, very similar way is applied on megaraid_sas and mpt3sas, see _base_assign_reply_queues() and megasas_setup_reply_map(). If performance drop is caused, just report it out, we could fix it. Or even you can write a new .map_queues method just for hisi_sas v3. Thanks, Ming