diff mbox

[v4,3/6] qla2xxx: Utilize pci_alloc_irq_vectors/pci_free_irq_vectors calls.

Message ID 1481051266-32362-4-git-send-email-himanshu.madhani@cavium.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Madhani, Himanshu Dec. 6, 2016, 7:07 p.m. UTC
From: Michael Hernandez <michael.hernandez@cavium.com>

Replaces the old pci_enable_msi[x]* and pci_disable_msi[x] calls.

Signed-off-by: Michael Hernandez <michael.hernandez@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
---
 drivers/scsi/qla2xxx/qla_def.h |  2 +-
 drivers/scsi/qla2xxx/qla_isr.c | 89 ++++++++++++++++--------------------------
 drivers/scsi/qla2xxx/qla_mid.c |  2 +-
 3 files changed, 36 insertions(+), 57 deletions(-)

Comments

Christoph Hellwig Dec. 7, 2016, 7:03 p.m. UTC | #1
>  static int
>  qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
>  {
>  #define MIN_MSIX_COUNT	2
>  #define ATIO_VECTOR	2
>  	int i, ret;
>  	struct qla_msix_entry *qentry;
>  	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
>  
> +	ret = pci_alloc_irq_vectors(ha->pdev,
> +	    MIN_MSIX_COUNT, ha->msix_count, PCI_IRQ_MSIX|PCI_IRQ_AFFINITY);

Given that as-is the code only uses two vectors, and they are not
for per-cpu queues using PCI_IRQ_AFFINITY is actually wrong, and
you're better off without it.  Also please fix the spacing:
tabs for aligning continued arguments, and spaces around operators
(although the revised version won't have an operator - so this is
just for future reference:

	ret = pci_alloc_irq_vectors(ha->pdev, MIN_MSIX_COUNT,
			ha->msix_count, PCI_IRQ_MSIX);

> +	struct rsp_que *rsp = (struct rsp_que *)e->handle;

No need for the cast here.

> +	struct rsp_que *rsp = (struct rsp_que *)e->handle;

Same here.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hannes Reinecke Dec. 8, 2016, 2:24 p.m. UTC | #2
On 12/06/2016 08:07 PM, Himanshu Madhani wrote:
> From: Michael Hernandez <michael.hernandez@cavium.com>
>
> Replaces the old pci_enable_msi[x]* and pci_disable_msi[x] calls.
>
> Signed-off-by: Michael Hernandez <michael.hernandez@cavium.com>
> Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
> ---
>  drivers/scsi/qla2xxx/qla_def.h |  2 +-
>  drivers/scsi/qla2xxx/qla_isr.c | 89 ++++++++++++++++--------------------------
>  drivers/scsi/qla2xxx/qla_mid.c |  2 +-
>  3 files changed, 36 insertions(+), 57 deletions(-)
>
Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
Madhani, Himanshu Dec. 8, 2016, 7:02 p.m. UTC | #3
SGkgQ2hyaXN0b3BoLCANCg0KDQoNCk9uIDEyLzcvMTYsIDExOjAzIEFNLCAiQ2hyaXN0b3BoIEhl
bGx3aWciIDxoY2hAaW5mcmFkZWFkLm9yZz4gd3JvdGU6DQoNCj4+ICBzdGF0aWMgaW50DQo+PiAg
cWxhMjR4eF9lbmFibGVfbXNpeChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcnNwX3F1
ZSAqcnNwKQ0KPj4gIHsNCj4+ICAjZGVmaW5lIE1JTl9NU0lYX0NPVU5UCTINCj4+ICAjZGVmaW5l
IEFUSU9fVkVDVE9SCTINCj4+ICAJaW50IGksIHJldDsNCj4+ICAJc3RydWN0IHFsYV9tc2l4X2Vu
dHJ5ICpxZW50cnk7DQo+PiAgCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRh
KGhhLT5wZGV2KTsNCj4+ICANCj4+ICsJcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKGhhLT5w
ZGV2LA0KPj4gKwkgICAgTUlOX01TSVhfQ09VTlQsIGhhLT5tc2l4X2NvdW50LCBQQ0lfSVJRX01T
SVh8UENJX0lSUV9BRkZJTklUWSk7DQo+DQo+R2l2ZW4gdGhhdCBhcy1pcyB0aGUgY29kZSBvbmx5
IHVzZXMgdHdvIHZlY3RvcnMsIGFuZCB0aGV5IGFyZSBub3QNCj5mb3IgcGVyLWNwdSBxdWV1ZXMg
dXNpbmcgUENJX0lSUV9BRkZJTklUWSBpcyBhY3R1YWxseSB3cm9uZywgYW5kDQo+eW91J3JlIGJl
dHRlciBvZmYgd2l0aG91dCBpdC4gIEFsc28gcGxlYXNlIGZpeCB0aGUgc3BhY2luZzoNCj50YWJz
IGZvciBhbGlnbmluZyBjb250aW51ZWQgYXJndW1lbnRzLCBhbmQgc3BhY2VzIGFyb3VuZCBvcGVy
YXRvcnMNCj4oYWx0aG91Z2ggdGhlIHJldmlzZWQgdmVyc2lvbiB3b24ndCBoYXZlIGFuIG9wZXJh
dG9yIC0gc28gdGhpcyBpcw0KPmp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2U6DQo+DQoNCkFjay4g
QWdyZWUgaGVyZSB0aGlzIGNoYW5nZSBzaG91bGQgbm90IGJlIHBhcnQgb2YgdGhpcyBwYXRjaC4N
Cg0KPglyZXQgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMoaGEtPnBkZXYsIE1JTl9NU0lYX0NPVU5U
LA0KPgkJCWhhLT5tc2l4X2NvdW50LCBQQ0lfSVJRX01TSVgpOw0KPg0KPj4gKwlzdHJ1Y3QgcnNw
X3F1ZSAqcnNwID0gKHN0cnVjdCByc3BfcXVlICopZS0+aGFuZGxlOw0KPg0KPk5vIG5lZWQgZm9y
IHRoZSBjYXN0IGhlcmUuDQoNCkFjay4gV2lsbCBwb3N0IHVwZGF0ZSBpbiBuZXcgc2VyaWVzLiAN
Cg0KPg0KPj4gKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gKHN0cnVjdCByc3BfcXVlICopZS0+aGFu
ZGxlOw0KPg0KPlNhbWUgaGVyZS4NCg0KV2lsbCBzZW5kIG5ldyBzZXJpZXMgc29vbi4NCg0KPg0K
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 9a6ddcb..8a6780c 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2747,7 +2747,7 @@  struct qla_msix_entry {
 	int have_irq;
 	uint32_t vector;
 	uint16_t entry;
-	struct rsp_que *rsp;
+	void *handle;
 	struct irq_affinity_notify irq_notify;
 	int cpuid;
 };
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 19f1848..0601ba2 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -3025,52 +3025,17 @@  struct qla_init_msix_entry {
 	{ "qla2xxx (atio_q)", qla83xx_msix_atio_q },
 };
 
-static void
-qla24xx_disable_msix(struct qla_hw_data *ha)
-{
-	int i;
-	struct qla_msix_entry *qentry;
-	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
-
-	for (i = 0; i < ha->msix_count; i++) {
-		qentry = &ha->msix_entries[i];
-		if (qentry->have_irq) {
-			/* un-register irq cpu affinity notification */
-			irq_set_affinity_notifier(qentry->vector, NULL);
-			free_irq(qentry->vector, qentry->rsp);
-		}
-	}
-	pci_disable_msix(ha->pdev);
-	kfree(ha->msix_entries);
-	ha->msix_entries = NULL;
-	ha->flags.msix_enabled = 0;
-	ql_dbg(ql_dbg_init, vha, 0x0042,
-	    "Disabled the MSI.\n");
-}
-
 static int
 qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
 {
 #define MIN_MSIX_COUNT	2
 #define ATIO_VECTOR	2
 	int i, ret;
-	struct msix_entry *entries;
 	struct qla_msix_entry *qentry;
 	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
 
-	entries = kzalloc(sizeof(struct msix_entry) * ha->msix_count,
-			GFP_KERNEL);
-	if (!entries) {
-		ql_log(ql_log_warn, vha, 0x00bc,
-		    "Failed to allocate memory for msix_entry.\n");
-		return -ENOMEM;
-	}
-
-	for (i = 0; i < ha->msix_count; i++)
-		entries[i].entry = i;
-
-	ret = pci_enable_msix_range(ha->pdev,
-				    entries, MIN_MSIX_COUNT, ha->msix_count);
+	ret = pci_alloc_irq_vectors(ha->pdev,
+	    MIN_MSIX_COUNT, ha->msix_count, PCI_IRQ_MSIX|PCI_IRQ_AFFINITY);
 	if (ret < 0) {
 		ql_log(ql_log_fatal, vha, 0x00c7,
 		    "MSI-X: Failed to enable support, "
@@ -3097,10 +3062,10 @@  struct qla_init_msix_entry {
 
 	for (i = 0; i < ha->msix_count; i++) {
 		qentry = &ha->msix_entries[i];
-		qentry->vector = entries[i].vector;
-		qentry->entry = entries[i].entry;
+		qentry->vector = pci_irq_vector(ha->pdev, i);
+		qentry->entry = i;
 		qentry->have_irq = 0;
-		qentry->rsp = NULL;
+		qentry->handle = NULL;
 		qentry->irq_notify.notify  = qla_irq_affinity_notify;
 		qentry->irq_notify.release = qla_irq_affinity_release;
 		qentry->cpuid = -1;
@@ -3109,7 +3074,7 @@  struct qla_init_msix_entry {
 	/* Enable MSI-X vectors for the base queue */
 	for (i = 0; i < 2; i++) {
 		qentry = &ha->msix_entries[i];
-		qentry->rsp = rsp;
+		qentry->handle = rsp;
 		rsp->msix = qentry;
 		if (IS_P3P_TYPE(ha))
 			ret = request_irq(qentry->vector,
@@ -3142,7 +3107,7 @@  struct qla_init_msix_entry {
 	 */
 	if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) {
 		qentry = &ha->msix_entries[ATIO_VECTOR];
-		qentry->rsp = rsp;
+		qentry->handle = rsp;
 		rsp->msix = qentry;
 		ret = request_irq(qentry->vector,
 			qla83xx_msix_entries[ATIO_VECTOR].handler,
@@ -3155,7 +3120,7 @@  struct qla_init_msix_entry {
 		ql_log(ql_log_fatal, vha, 0x00cb,
 		    "MSI-X: unable to register handler -- %x/%d.\n",
 		    qentry->vector, ret);
-		qla24xx_disable_msix(ha);
+		qla2x00_free_irqs(vha);
 		ha->mqenable = 0;
 		goto msix_out;
 	}
@@ -3177,7 +3142,6 @@  struct qla_init_msix_entry {
 	    ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
 
 msix_out:
-	kfree(entries);
 	return ret;
 }
 
@@ -3230,7 +3194,7 @@  struct qla_init_msix_entry {
 	    !IS_QLA27XX(ha))
 		goto skip_msi;
 
-	ret = pci_enable_msi(ha->pdev);
+	ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
 	if (!ret) {
 		ql_dbg(ql_dbg_init, vha, 0x0038,
 		    "MSI: Enabled.\n");
@@ -3275,6 +3239,8 @@  struct qla_init_msix_entry {
 {
 	struct qla_hw_data *ha = vha->hw;
 	struct rsp_que *rsp;
+	struct qla_msix_entry *qentry;
+	int i;
 
 	/*
 	 * We need to check that ha->rsp_q_map is valid in case we are called
@@ -3284,13 +3250,24 @@  struct qla_init_msix_entry {
 		return;
 	rsp = ha->rsp_q_map[0];
 
-	if (ha->flags.msix_enabled)
-		qla24xx_disable_msix(ha);
-	else if (ha->flags.msi_enabled) {
-		free_irq(ha->pdev->irq, rsp);
-		pci_disable_msi(ha->pdev);
-	} else
-		free_irq(ha->pdev->irq, rsp);
+	if (ha->flags.msix_enabled) {
+		for (i = 0; i < ha->msix_count; i++) {
+			qentry = &ha->msix_entries[i];
+			if (qentry->have_irq) {
+				irq_set_affinity_notifier(qentry->vector, NULL);
+				free_irq(pci_irq_vector(ha->pdev, i), qentry->handle);
+			}
+		}
+		kfree(ha->msix_entries);
+		ha->msix_entries = NULL;
+		ha->flags.msix_enabled = 0;
+		ql_dbg(ql_dbg_init, vha, 0x0042,
+			"Disabled MSI-X.\n");
+	} else {
+		free_irq(pci_irq_vector(ha->pdev, 0), rsp);
+	}
+
+	pci_free_irq_vectors(ha->pdev);
 }
 
 
@@ -3310,7 +3287,7 @@  int qla25xx_request_irq(struct rsp_que *rsp)
 		return ret;
 	}
 	msix->have_irq = 1;
-	msix->rsp = rsp;
+	msix->handle = rsp;
 	return ret;
 }
 
@@ -3323,11 +3300,12 @@  static void qla_irq_affinity_notify(struct irq_affinity_notify *notify,
 		container_of(notify, struct qla_msix_entry, irq_notify);
 	struct qla_hw_data *ha;
 	struct scsi_qla_host *base_vha;
+	struct rsp_que *rsp = (struct rsp_que *)e->handle;
 
 	/* user is recommended to set mask to just 1 cpu */
 	e->cpuid = cpumask_first(mask);
 
-	ha = e->rsp->hw;
+	ha = rsp->hw;
 	base_vha = pci_get_drvdata(ha->pdev);
 
 	ql_dbg(ql_dbg_init, base_vha, 0xffff,
@@ -3351,7 +3329,8 @@  static void qla_irq_affinity_release(struct kref *ref)
 		container_of(ref, struct irq_affinity_notify, kref);
 	struct qla_msix_entry *e =
 		container_of(notify, struct qla_msix_entry, irq_notify);
-	struct scsi_qla_host *base_vha = pci_get_drvdata(e->rsp->hw->pdev);
+	struct rsp_que *rsp = (struct rsp_que *)e->handle;
+	struct scsi_qla_host *base_vha = pci_get_drvdata(rsp->hw->pdev);
 
 	ql_dbg(ql_dbg_init, base_vha, 0xffff,
 	    "%s: host%ld: vector %d cpu %d \n", __func__,
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c
index cf7ba52..8e406fc 100644
--- a/drivers/scsi/qla2xxx/qla_mid.c
+++ b/drivers/scsi/qla2xxx/qla_mid.c
@@ -542,7 +542,7 @@ 
 	if (rsp->msix && rsp->msix->have_irq) {
 		free_irq(rsp->msix->vector, rsp);
 		rsp->msix->have_irq = 0;
-		rsp->msix->rsp = NULL;
+		rsp->msix->handle = NULL;
 	}
 	dma_free_coherent(&ha->pdev->dev, (rsp->length + 1) *
 		sizeof(response_t), rsp->ring, rsp->dma);