|
Torsten Duwe |
63e787 |
From 70fead3adb4eea70cf6f9dba681394653b1387e3 Mon Sep 17 00:00:00 2001
|
|
Torsten Duwe |
63e787 |
From: Wojciech Ziemba <wojciech.ziemba@intel.com>
|
|
Torsten Duwe |
63e787 |
Date: Wed, 1 Sep 2021 18:36:08 +0100
|
|
Torsten Duwe |
63e787 |
Subject: [PATCH] crypto: qat - free irq in case of failure
|
|
Torsten Duwe |
63e787 |
Git-commit: 70fead3adb4eea70cf6f9dba681394653b1387e3
|
|
Torsten Duwe |
63e787 |
Patch-mainline: v5.16-rc1
|
|
Torsten Duwe |
63e787 |
References: jsc#PED-1073
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
If devm_request_irq() fails inside adf_request_irqs(), unwind properly by
|
|
Torsten Duwe |
63e787 |
freeing the allocated irqs.
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
|
|
Torsten Duwe |
63e787 |
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
63e787 |
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
63e787 |
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Torsten Duwe |
63e787 |
Signed-off-by: Torsten Duwe <duwe@suse.de>
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
---
|
|
Torsten Duwe |
63e787 |
drivers/crypto/qat/qat_common/adf_isr.c | 63 +++++++++++++------------
|
|
Torsten Duwe |
63e787 |
1 file changed, 34 insertions(+), 29 deletions(-)
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
|
|
Torsten Duwe |
63e787 |
index 861a9368b9db0..c55a9f14b0d23 100644
|
|
Torsten Duwe |
63e787 |
--- a/drivers/crypto/qat/qat_common/adf_isr.c
|
|
Torsten Duwe |
63e787 |
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
|
|
Torsten Duwe |
63e787 |
@@ -126,6 +126,31 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
|
|
Torsten Duwe |
63e787 |
return IRQ_NONE;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
+static void adf_free_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
+{
|
|
Torsten Duwe |
63e787 |
+ struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
63e787 |
+ struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
63e787 |
+ struct adf_irq *irqs = pci_dev_info->msix_entries.irqs;
|
|
Torsten Duwe |
63e787 |
+ struct adf_etr_data *etr_data = accel_dev->transport;
|
|
Torsten Duwe |
63e787 |
+ int clust_irq = hw_data->num_banks;
|
|
Torsten Duwe |
63e787 |
+ int irq, i = 0;
|
|
Torsten Duwe |
63e787 |
+
|
|
Torsten Duwe |
63e787 |
+ if (pci_dev_info->msix_entries.num_entries > 1) {
|
|
Torsten Duwe |
63e787 |
+ for (i = 0; i < hw_data->num_banks; i++) {
|
|
Torsten Duwe |
63e787 |
+ if (irqs[i].enabled) {
|
|
Torsten Duwe |
63e787 |
+ irq = pci_irq_vector(pci_dev_info->pci_dev, i);
|
|
Torsten Duwe |
63e787 |
+ irq_set_affinity_hint(irq, NULL);
|
|
Torsten Duwe |
63e787 |
+ free_irq(irq, &etr_data->banks[i]);
|
|
Torsten Duwe |
63e787 |
+ }
|
|
Torsten Duwe |
63e787 |
+ }
|
|
Torsten Duwe |
63e787 |
+ }
|
|
Torsten Duwe |
63e787 |
+
|
|
Torsten Duwe |
63e787 |
+ if (irqs[i].enabled) {
|
|
Torsten Duwe |
63e787 |
+ irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq);
|
|
Torsten Duwe |
63e787 |
+ free_irq(irq, accel_dev);
|
|
Torsten Duwe |
63e787 |
+ }
|
|
Torsten Duwe |
63e787 |
+}
|
|
Torsten Duwe |
63e787 |
+
|
|
Torsten Duwe |
63e787 |
static int adf_request_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
{
|
|
Torsten Duwe |
63e787 |
struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
63e787 |
@@ -150,7 +175,8 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
63e787 |
"Failed to get IRQ number of device vector %d - %s\n",
|
|
Torsten Duwe |
63e787 |
i, name);
|
|
Torsten Duwe |
63e787 |
- return irq;
|
|
Torsten Duwe |
63e787 |
+ ret = irq;
|
|
Torsten Duwe |
63e787 |
+ goto err;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
ret = request_irq(irq, adf_msix_isr_bundle, 0,
|
|
Torsten Duwe |
63e787 |
&name[0], bank);
|
|
Torsten Duwe |
63e787 |
@@ -158,7 +184,7 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
63e787 |
"Failed to allocate IRQ %d for %s\n",
|
|
Torsten Duwe |
63e787 |
irq, name);
|
|
Torsten Duwe |
63e787 |
- return ret;
|
|
Torsten Duwe |
63e787 |
+ goto err;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
cpu = ((accel_dev->accel_id * hw_data->num_banks) +
|
|
Torsten Duwe |
63e787 |
@@ -177,41 +203,20 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
63e787 |
"Failed to get IRQ number of device vector %d - %s\n",
|
|
Torsten Duwe |
63e787 |
i, name);
|
|
Torsten Duwe |
63e787 |
- return irq;
|
|
Torsten Duwe |
63e787 |
+ ret = irq;
|
|
Torsten Duwe |
63e787 |
+ goto err;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
ret = request_irq(irq, adf_msix_isr_ae, 0, &name[0], accel_dev);
|
|
Torsten Duwe |
63e787 |
if (ret) {
|
|
Torsten Duwe |
63e787 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
63e787 |
"Failed to allocate IRQ %d for %s\n", irq, name);
|
|
Torsten Duwe |
63e787 |
- return ret;
|
|
Torsten Duwe |
63e787 |
+ goto err;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
irqs[i].enabled = true;
|
|
Torsten Duwe |
63e787 |
return ret;
|
|
Torsten Duwe |
63e787 |
-}
|
|
Torsten Duwe |
63e787 |
-
|
|
Torsten Duwe |
63e787 |
-static void adf_free_irqs(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
-{
|
|
Torsten Duwe |
63e787 |
- struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
63e787 |
- struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
63e787 |
- struct adf_irq *irqs = pci_dev_info->msix_entries.irqs;
|
|
Torsten Duwe |
63e787 |
- struct adf_etr_data *etr_data = accel_dev->transport;
|
|
Torsten Duwe |
63e787 |
- int clust_irq = hw_data->num_banks;
|
|
Torsten Duwe |
63e787 |
- int irq, i = 0;
|
|
Torsten Duwe |
63e787 |
-
|
|
Torsten Duwe |
63e787 |
- if (pci_dev_info->msix_entries.num_entries > 1) {
|
|
Torsten Duwe |
63e787 |
- for (i = 0; i < hw_data->num_banks; i++) {
|
|
Torsten Duwe |
63e787 |
- if (irqs[i].enabled) {
|
|
Torsten Duwe |
63e787 |
- irq = pci_irq_vector(pci_dev_info->pci_dev, i);
|
|
Torsten Duwe |
63e787 |
- irq_set_affinity_hint(irq, NULL);
|
|
Torsten Duwe |
63e787 |
- free_irq(irq, &etr_data->banks[i]);
|
|
Torsten Duwe |
63e787 |
- }
|
|
Torsten Duwe |
63e787 |
- }
|
|
Torsten Duwe |
63e787 |
- }
|
|
Torsten Duwe |
63e787 |
-
|
|
Torsten Duwe |
63e787 |
- if (irqs[i].enabled) {
|
|
Torsten Duwe |
63e787 |
- irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq);
|
|
Torsten Duwe |
63e787 |
- free_irq(irq, accel_dev);
|
|
Torsten Duwe |
63e787 |
- }
|
|
Torsten Duwe |
63e787 |
+err:
|
|
Torsten Duwe |
63e787 |
+ adf_free_irqs(accel_dev);
|
|
Torsten Duwe |
63e787 |
+ return ret;
|
|
Torsten Duwe |
63e787 |
}
|
|
Torsten Duwe |
63e787 |
|
|
Torsten Duwe |
63e787 |
static int adf_isr_alloc_msix_vectors_data(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
63e787 |
--
|
|
Torsten Duwe |
63e787 |
2.35.3
|
|
Torsten Duwe |
63e787 |
|