| From 98e69a96a3074e599a2885fec53d6066c6dcfdfe Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 25 Mar 2021 08:34:18 +0000 |
| Subject: crypto: qat - fix error path in adf_isr_resource_alloc() |
| |
| From: Giovanni Cabiddu <giovanni.cabiddu@intel.com> |
| |
| [ Upstream commit 83dc1173d73f80cbce2fee4d308f51f87b2f26ae ] |
| |
| The function adf_isr_resource_alloc() is not unwinding correctly in case |
| of error. |
| This patch fixes the error paths and propagate the errors to the caller. |
| |
| Fixes: 7afa232e76ce ("crypto: qat - Intel(R) QAT DH895xcc accelerator") |
| Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> |
| Reviewed-by: Marco Chiappero <marco.chiappero@intel.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/crypto/qat/qat_common/adf_isr.c | 29 ++++++++++++++++++------- |
| 1 file changed, 21 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c |
| index c45853463530..e3ad5587be49 100644 |
| --- a/drivers/crypto/qat/qat_common/adf_isr.c |
| +++ b/drivers/crypto/qat/qat_common/adf_isr.c |
| @@ -291,19 +291,32 @@ int adf_isr_resource_alloc(struct adf_accel_dev *accel_dev) |
| |
| ret = adf_isr_alloc_msix_entry_table(accel_dev); |
| if (ret) |
| - return ret; |
| - if (adf_enable_msix(accel_dev)) |
| goto err_out; |
| |
| - if (adf_setup_bh(accel_dev)) |
| - goto err_out; |
| + ret = adf_enable_msix(accel_dev); |
| + if (ret) |
| + goto err_free_msix_table; |
| |
| - if (adf_request_irqs(accel_dev)) |
| - goto err_out; |
| + ret = adf_setup_bh(accel_dev); |
| + if (ret) |
| + goto err_disable_msix; |
| + |
| + ret = adf_request_irqs(accel_dev); |
| + if (ret) |
| + goto err_cleanup_bh; |
| |
| return 0; |
| + |
| +err_cleanup_bh: |
| + adf_cleanup_bh(accel_dev); |
| + |
| +err_disable_msix: |
| + adf_disable_msix(&accel_dev->accel_pci_dev); |
| + |
| +err_free_msix_table: |
| + adf_isr_free_msix_entry_table(accel_dev); |
| + |
| err_out: |
| - adf_isr_resource_free(accel_dev); |
| - return -EFAULT; |
| + return ret; |
| } |
| EXPORT_SYMBOL_GPL(adf_isr_resource_alloc); |
| -- |
| 2.30.2 |
| |