aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/cxl/pci.c
diff options
context:
space:
mode:
authorAndrew Donnellan <andrew.donnellan@au1.ibm.com>2016-12-09 01:18:50 -0500
committerMichael Ellerman <mpe@ellerman.id.au>2017-01-24 21:34:24 -0500
commit14a3ae34bfd0bcb1cc12d55b06a8584c11fac6fc (patch)
tree398be4ce65d15bb67d66e5ef12a58e42a3668537 /drivers/misc/cxl/pci.c
parentd7b1946c7925a270062b2e0718aa57b42ba619c0 (diff)
cxl: Prevent read/write to AFU config space while AFU not configured
During EEH recovery, we deconfigure all AFUs whilst leaving the corresponding vPHB and virtual PCI device in place. If something attempts to interact with the AFU's PCI config space (e.g. running lspci) after the AFU has been deconfigured and before it's reconfigured, cxl_pcie_{read,write}_config() will read invalid values from the deconfigured struct cxl_afu and proceed to Oops when they try to dereference pointers that have been set to NULL during deconfiguration. Add a rwsem to struct cxl_afu so we can prevent interaction with config space while the AFU is deconfigured. Reported-by: Pradipta Ghosh <pradghos@in.ibm.com> Suggested-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> Cc: stable@vger.kernel.org # v4.9+ Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Signed-off-by: Vaibhav Jain <vaibhav@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'drivers/misc/cxl/pci.c')
-rw-r--r--drivers/misc/cxl/pci.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index 73432e7d925d..cca938845ffd 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1129,6 +1129,7 @@ static int pci_configure_afu(struct cxl_afu *afu, struct cxl *adapter, struct pc
1129 if ((rc = cxl_native_register_psl_irq(afu))) 1129 if ((rc = cxl_native_register_psl_irq(afu)))
1130 goto err2; 1130 goto err2;
1131 1131
1132 up_write(&afu->configured_rwsem);
1132 return 0; 1133 return 0;
1133 1134
1134err2: 1135err2:
@@ -1141,6 +1142,7 @@ err1:
1141 1142
1142static void pci_deconfigure_afu(struct cxl_afu *afu) 1143static void pci_deconfigure_afu(struct cxl_afu *afu)
1143{ 1144{
1145 down_write(&afu->configured_rwsem);
1144 cxl_native_release_psl_irq(afu); 1146 cxl_native_release_psl_irq(afu);
1145 if (afu->adapter->native->sl_ops->release_serr_irq) 1147 if (afu->adapter->native->sl_ops->release_serr_irq)
1146 afu->adapter->native->sl_ops->release_serr_irq(afu); 1148 afu->adapter->native->sl_ops->release_serr_irq(afu);