diff mbox series

mpt3sas: Block PCI cfg access from userspace during reset

Message ID 20210330105137.20728-1-sreekanth.reddy@broadcom.com (mailing list archive)
State Accepted
Headers show
Series mpt3sas: Block PCI cfg access from userspace during reset | expand

Commit Message

Sreekanth Reddy March 30, 2021, 10:51 a.m. UTC
While diag reset is in progress, there is short duration where all
access to controller's PCI config space from the host needs to be
blocked. This is due to a hardware limitation of IOC controllers.

With this patch, driver will block all access to controller's
config space from userland applications by calling
pci_cfg_access_lock() while diag reset is in progress and
unlocking after controller comes back to ready state.

Cc: stable@vger.kernel.org #v5.4.108+
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Martin K. Petersen April 13, 2021, 5:48 a.m. UTC | #1
On Tue, 30 Mar 2021 16:21:37 +0530, Sreekanth Reddy wrote:

> While diag reset is in progress, there is short duration where all
> access to controller's PCI config space from the host needs to be
> blocked. This is due to a hardware limitation of IOC controllers.
> 
> With this patch, driver will block all access to controller's
> config space from userland applications by calling
> pci_cfg_access_lock() while diag reset is in progress and
> unlocking after controller comes back to ready state.

Applied to 5.13/scsi-queue, thanks!

[1/1] mpt3sas: Block PCI cfg access from userspace during reset
      https://git.kernel.org/mkp/scsi/c/3c8604691d2a
diff mbox series

Patch

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index ac0eef975f17..b6beacfd0f62 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -7252,6 +7252,8 @@  _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
 
 	ioc_info(ioc, "sending diag reset !!\n");
 
+	pci_cfg_access_lock(ioc->pdev);
+
 	drsprintk(ioc, ioc_info(ioc, "clear interrupts\n"));
 
 	count = 0;
@@ -7342,10 +7344,12 @@  _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
 		goto out;
 	}
 
+	pci_cfg_access_unlock(ioc->pdev);
 	ioc_info(ioc, "diag reset: SUCCESS\n");
 	return 0;
 
  out:
+	pci_cfg_access_unlock(ioc->pdev);
 	ioc_err(ioc, "diag reset: FAILED\n");
 	return -EFAULT;
 }