linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code
@ 2021-01-04 12:33 John Garry
  2021-01-04 12:33 ` [PATCH 1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param John Garry
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: John Garry @ 2021-01-04 12:33 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linux-scsi, linux-kernel, linuxarm, maz, kashyap.desai, John Garry

Patch "scsi: hisi_sas: Expose HW queues for v2 hw" was not merged for
v5.11, so resending for v5.12.

Unused module param auto_affine_msi_experimental for v3 hw is also
removed in the other patch.

John Garry (2):
  scsi: hisi_sas: Remove auto_affine_msi_experimental module_param
  scsi: hisi_sas: Expose HW queues for v2 hw

 drivers/scsi/hisi_sas/hisi_sas.h       |  4 ++
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 11 +++++
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 66 +++++++++++++++++++++-----
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c |  5 --
 4 files changed, 68 insertions(+), 18 deletions(-)

-- 
2.26.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param
  2021-01-04 12:33 [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code John Garry
@ 2021-01-04 12:33 ` John Garry
  2021-01-04 12:33 ` [PATCH 2/2] scsi: hisi_sas: Expose HW queues for v2 hw John Garry
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: John Garry @ 2021-01-04 12:33 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linux-scsi, linux-kernel, linuxarm, maz, kashyap.desai, John Garry

Now that the driver always uses managed interrupts, delete
auto_affine_msi_experimental module param.

Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 98e9844eba97..fac805ee4719 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -517,11 +517,6 @@ static int prot_mask;
 module_param(prot_mask, int, 0);
 MODULE_PARM_DESC(prot_mask, " host protection capabilities mask, def=0x0 ");
 
-static bool auto_affine_msi_experimental;
-module_param(auto_affine_msi_experimental, bool, 0444);
-MODULE_PARM_DESC(auto_affine_msi_experimental, "Enable auto-affinity of MSI IRQs as experimental:\n"
-		 "default is off");
-
 static void debugfs_work_handler_v3_hw(struct work_struct *work);
 
 static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] scsi: hisi_sas: Expose HW queues for v2 hw
  2021-01-04 12:33 [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code John Garry
  2021-01-04 12:33 ` [PATCH 1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param John Garry
@ 2021-01-04 12:33 ` John Garry
  2021-01-06  4:18 ` [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code Martin K. Petersen
  2021-01-13  5:48 ` Martin K. Petersen
  3 siblings, 0 replies; 6+ messages in thread
From: John Garry @ 2021-01-04 12:33 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linux-scsi, linux-kernel, linuxarm, maz, kashyap.desai, John Garry

As a performance enhancement, make the completion queue interrupts managed.

In addition, in commit bf0beec0607d ("blk-mq: drain I/O when all CPUs in a
hctx are offline"), CPU hotplug for MQ devices using managed interrupts
is made safe. So expose HW queues to blk-mq to take advantage of this.

Flag Scsi_host.host_tagset is also set to ensure that the HBA is not sent
more commands than it can handle. However the driver still does not use
request tag for IPTT as there are many HW bugs means that special rules
apply for IPTT allocation.

Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas.h       |  4 ++
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 11 +++++
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 66 +++++++++++++++++++++-----
 3 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 2b28dd405600..e821dd32dd28 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -14,6 +14,7 @@
 #include <linux/debugfs.h>
 #include <linux/dmapool.h>
 #include <linux/iopoll.h>
+#include <linux/irq.h>
 #include <linux/lcm.h>
 #include <linux/libata.h>
 #include <linux/mfd/syscon.h>
@@ -294,6 +295,7 @@ enum {
 
 struct hisi_sas_hw {
 	int (*hw_init)(struct hisi_hba *hisi_hba);
+	int (*interrupt_preinit)(struct hisi_hba *hisi_hba);
 	void (*setup_itct)(struct hisi_hba *hisi_hba,
 			   struct hisi_sas_device *device);
 	int (*slot_index_alloc)(struct hisi_hba *hisi_hba,
@@ -393,6 +395,8 @@ struct hisi_hba {
 	u32 refclk_frequency_mhz;
 	u8 sas_addr[SAS_ADDR_SIZE];
 
+	int *irq_map; /* v2 hw */
+
 	int n_phy;
 	spinlock_t lock;
 	struct semaphore sem;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index c34f60a600f1..ffb2b32fd35f 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -2628,6 +2628,13 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
 	return NULL;
 }
 
+static int hisi_sas_interrupt_preinit(struct hisi_hba *hisi_hba)
+{
+	if (hisi_hba->hw->interrupt_preinit)
+		return hisi_hba->hw->interrupt_preinit(hisi_hba);
+	return 0;
+}
+
 int hisi_sas_probe(struct platform_device *pdev,
 		   const struct hisi_sas_hw *hw)
 {
@@ -2685,6 +2692,10 @@ int hisi_sas_probe(struct platform_device *pdev,
 		sha->sas_port[i] = &hisi_hba->port[i].sas_port;
 	}
 
+	rc = hisi_sas_interrupt_preinit(hisi_hba);
+	if (rc)
+		goto err_out_ha;
+
 	rc = scsi_add_host(shost, &pdev->dev);
 	if (rc)
 		goto err_out_ha;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index b57177b52fac..9adfdefef9ca 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -3302,6 +3302,28 @@ static irq_handler_t fatal_interrupts[HISI_SAS_FATAL_INT_NR] = {
 	fatal_axi_int_v2_hw
 };
 
+#define CQ0_IRQ_INDEX (96)
+
+static int hisi_sas_v2_interrupt_preinit(struct hisi_hba *hisi_hba)
+{
+	struct platform_device *pdev = hisi_hba->platform_dev;
+	struct Scsi_Host *shost = hisi_hba->shost;
+	struct irq_affinity desc = {
+		.pre_vectors = CQ0_IRQ_INDEX,
+		.post_vectors = 16,
+	};
+	int resv = desc.pre_vectors + desc.post_vectors, minvec = resv + 1, nvec;
+
+	nvec = devm_platform_get_irqs_affinity(pdev, &desc, minvec, 128,
+					       &hisi_hba->irq_map);
+	if (nvec < 0)
+		return nvec;
+
+	shost->nr_hw_queues = hisi_hba->cq_nvecs = nvec - resv;
+
+	return 0;
+}
+
 /*
  * There is a limitation in the hip06 chipset that we need
  * to map in all mbigen interrupts, even if they are not used.
@@ -3310,14 +3332,11 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba)
 {
 	struct platform_device *pdev = hisi_hba->platform_dev;
 	struct device *dev = &pdev->dev;
-	int irq, rc = 0, irq_map[128];
+	int irq, rc = 0;
 	int i, phy_no, fatal_no, queue_no;
 
-	for (i = 0; i < 128; i++)
-		irq_map[i] = platform_get_irq(pdev, i);
-
 	for (i = 0; i < HISI_SAS_PHY_INT_NR; i++) {
-		irq = irq_map[i + 1]; /* Phy up/down is irq1 */
+		irq = hisi_hba->irq_map[i + 1]; /* Phy up/down is irq1 */
 		rc = devm_request_irq(dev, irq, phy_interrupts[i], 0,
 				      DRV_NAME " phy", hisi_hba);
 		if (rc) {
@@ -3331,7 +3350,7 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba)
 	for (phy_no = 0; phy_no < hisi_hba->n_phy; phy_no++) {
 		struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
 
-		irq = irq_map[phy_no + 72];
+		irq = hisi_hba->irq_map[phy_no + 72];
 		rc = devm_request_irq(dev, irq, sata_int_v2_hw, 0,
 				      DRV_NAME " sata", phy);
 		if (rc) {
@@ -3343,7 +3362,7 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba)
 	}
 
 	for (fatal_no = 0; fatal_no < HISI_SAS_FATAL_INT_NR; fatal_no++) {
-		irq = irq_map[fatal_no + 81];
+		irq = hisi_hba->irq_map[fatal_no + 81];
 		rc = devm_request_irq(dev, irq, fatal_interrupts[fatal_no], 0,
 				      DRV_NAME " fatal", hisi_hba);
 		if (rc) {
@@ -3354,24 +3373,22 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba)
 		}
 	}
 
-	for (queue_no = 0; queue_no < hisi_hba->queue_count; queue_no++) {
+	for (queue_no = 0; queue_no < hisi_hba->cq_nvecs; queue_no++) {
 		struct hisi_sas_cq *cq = &hisi_hba->cq[queue_no];
 
-		cq->irq_no = irq_map[queue_no + 96];
+		cq->irq_no = hisi_hba->irq_map[queue_no + 96];
 		rc = devm_request_threaded_irq(dev, cq->irq_no,
 					       cq_interrupt_v2_hw,
 					       cq_thread_v2_hw, IRQF_ONESHOT,
 					       DRV_NAME " cq", cq);
 		if (rc) {
 			dev_err(dev, "irq init: could not request cq interrupt %d, rc=%d\n",
-				irq, rc);
+					cq->irq_no, rc);
 			rc = -ENOENT;
 			goto err_out;
 		}
+		cq->irq_mask = irq_get_affinity_mask(cq->irq_no);
 	}
-
-	hisi_hba->cq_nvecs = hisi_hba->queue_count;
-
 err_out:
 	return rc;
 }
@@ -3529,6 +3546,26 @@ static struct device_attribute *host_attrs_v2_hw[] = {
 	NULL
 };
 
+static int map_queues_v2_hw(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];
+	const struct cpumask *mask;
+	unsigned int queue, cpu;
+
+	for (queue = 0; queue < qmap->nr_queues; queue++) {
+		mask = irq_get_affinity_mask(hisi_hba->irq_map[96 + queue]);
+		if (!mask)
+			continue;
+
+		for_each_cpu(cpu, mask)
+			qmap->mq_map[cpu] = qmap->queue_offset + queue;
+	}
+
+	return 0;
+
+}
+
 static struct scsi_host_template sht_v2_hw = {
 	.name			= DRV_NAME,
 	.proc_name		= DRV_NAME,
@@ -3553,10 +3590,13 @@ static struct scsi_host_template sht_v2_hw = {
 #endif
 	.shost_attrs		= host_attrs_v2_hw,
 	.host_reset		= hisi_sas_host_reset,
+	.map_queues		= map_queues_v2_hw,
+	.host_tagset		= 1,
 };
 
 static const struct hisi_sas_hw hisi_sas_v2_hw = {
 	.hw_init = hisi_sas_v2_init,
+	.interrupt_preinit = hisi_sas_v2_interrupt_preinit,
 	.setup_itct = setup_itct_v2_hw,
 	.slot_index_alloc = slot_index_alloc_quirk_v2_hw,
 	.alloc_dev = alloc_dev_quirk_v2_hw,
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code
  2021-01-04 12:33 [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code John Garry
  2021-01-04 12:33 ` [PATCH 1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param John Garry
  2021-01-04 12:33 ` [PATCH 2/2] scsi: hisi_sas: Expose HW queues for v2 hw John Garry
@ 2021-01-06  4:18 ` Martin K. Petersen
  2021-01-06  9:03   ` John Garry
  2021-01-13  5:48 ` Martin K. Petersen
  3 siblings, 1 reply; 6+ messages in thread
From: Martin K. Petersen @ 2021-01-06  4:18 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linux-scsi, linux-kernel, linuxarm, maz,
	kashyap.desai


John,

> Patch "scsi: hisi_sas: Expose HW queues for v2 hw" was not merged for
> v5.11, so resending for v5.12.

Any changes to it? 5.11/postmerge is sitting in my fixes branch.

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code
  2021-01-06  4:18 ` [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code Martin K. Petersen
@ 2021-01-06  9:03   ` John Garry
  0 siblings, 0 replies; 6+ messages in thread
From: John Garry @ 2021-01-06  9:03 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: jejb, linux-scsi, linux-kernel, linuxarm, maz, kashyap.desai

On 06/01/2021 04:18, Martin K. Petersen wrote:

Hi Martin,

> 
>> Patch "scsi: hisi_sas: Expose HW queues for v2 hw" was not merged for
>> v5.11, so resending for v5.12.
> Any changes to it? 5.11/postmerge is sitting in my fixes branch.

No change. I just did not see that patch in Linus' master branch or your 
git, so assumed that I would just need to resend for 5.12. And now I see 
it in 5.11/postmerge

Thanks,
John


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code
  2021-01-04 12:33 [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code John Garry
                   ` (2 preceding siblings ...)
  2021-01-06  4:18 ` [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code Martin K. Petersen
@ 2021-01-13  5:48 ` Martin K. Petersen
  3 siblings, 0 replies; 6+ messages in thread
From: Martin K. Petersen @ 2021-01-13  5:48 UTC (permalink / raw)
  To: John Garry, jejb
  Cc: Martin K . Petersen, maz, kashyap.desai, linux-scsi, linuxarm,
	linux-kernel

On Mon, 4 Jan 2021 20:33:40 +0800, John Garry wrote:

> Patch "scsi: hisi_sas: Expose HW queues for v2 hw" was not merged for
> v5.11, so resending for v5.12.
> 
> Unused module param auto_affine_msi_experimental for v3 hw is also
> removed in the other patch.
> 
> John Garry (2):
>   scsi: hisi_sas: Remove auto_affine_msi_experimental module_param
>   scsi: hisi_sas: Expose HW queues for v2 hw
> 
> [...]

Applied to 5.12/scsi-queue, thanks!

[1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param
      https://git.kernel.org/mkp/scsi/c/3997e0fdd587

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-13  5:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-04 12:33 [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code John Garry
2021-01-04 12:33 ` [PATCH 1/2] scsi: hisi_sas: Remove auto_affine_msi_experimental module_param John Garry
2021-01-04 12:33 ` [PATCH 2/2] scsi: hisi_sas: Expose HW queues for v2 hw John Garry
2021-01-06  4:18 ` [PATCH 0/2] hisi_sas: Expose hw queues for v2 hw and remove unused code Martin K. Petersen
2021-01-06  9:03   ` John Garry
2021-01-13  5:48 ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).