Thread (48 messages) 48 messages, 9 authors, 2019-08-13

Re: [PATCH 7/9] scsi: hisi_sas_v3: convert private reply queue to blk-mq hw queue

From: Ming Lei <hidden>
Date: 2019-06-04 13:37:45

On Mon, Jun 03, 2019 at 02:00:19PM +0100, John Garry wrote:
On 03/06/2019 12:00, Ming Lei wrote:
quoted
On Fri, May 31, 2019 at 12:38:10PM +0100, John Garry wrote:
quoted
quoted
quoted
quoted
-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,
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help