scsi: mpt3sas: Block PCI config access from userspace during reset
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Tue, 30 Mar 2021 10:51:37 +0000 (16:21 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 6 Apr 2021 03:32:43 +0000 (23:32 -0400)
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 the IOC controllers.

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
it again after the controller comes back to ready state.

Link: https://lore.kernel.org/r/20210330105137.20728-1-sreekanth.reddy@broadcom.com
Cc: stable@vger.kernel.org #v5.4.108+
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.c

index 016b01bcc1a33dc3ca3cf5c2898ba2aee1dab5af..84c507587166592ceb56cdf51641d3f1b11b43ca 100644 (file)
@@ -7405,6 +7405,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;
@@ -7495,10 +7497,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;
 }