PCI: endpoint: Protect concurrent access to pci_epf_ops with mutex
authorKishon Vijay Abraham I <kishon@ti.com>
Mon, 24 Feb 2020 09:53:37 +0000 (15:23 +0530)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 24 Feb 2020 10:15:33 +0000 (10:15 +0000)
Protect concurrent access to pci_epf_ops with a mutex.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
drivers/pci/endpoint/pci-epf-core.c
include/linux/pci-epf.h

index 93f28c6..6e06489 100644 (file)
@@ -35,7 +35,9 @@ void pci_epf_unbind(struct pci_epf *epf)
                return;
        }
 
+       mutex_lock(&epf->lock);
        epf->driver->ops->unbind(epf);
+       mutex_unlock(&epf->lock);
        module_put(epf->driver->owner);
 }
 EXPORT_SYMBOL_GPL(pci_epf_unbind);
@@ -49,6 +51,8 @@ EXPORT_SYMBOL_GPL(pci_epf_unbind);
  */
 int pci_epf_bind(struct pci_epf *epf)
 {
+       int ret;
+
        if (!epf->driver) {
                dev_WARN(&epf->dev, "epf device not bound to driver\n");
                return -EINVAL;
@@ -57,7 +61,11 @@ int pci_epf_bind(struct pci_epf *epf)
        if (!try_module_get(epf->driver->owner))
                return -EAGAIN;
 
-       return epf->driver->ops->bind(epf);
+       mutex_lock(&epf->lock);
+       ret = epf->driver->ops->bind(epf);
+       mutex_unlock(&epf->lock);
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(pci_epf_bind);
 
@@ -252,6 +260,7 @@ struct pci_epf *pci_epf_create(const char *name)
        device_initialize(dev);
        dev->bus = &pci_epf_bus_type;
        dev->type = &pci_epf_type;
+       mutex_init(&epf->lock);
 
        ret = dev_set_name(dev, "%s", name);
        if (ret) {
index 4993f7f..bcdf4f0 100644 (file)
@@ -110,6 +110,7 @@ struct pci_epf_bar {
  * @driver: the EPF driver to which this EPF device is bound
  * @list: to add pci_epf as a list of PCI endpoint functions to pci_epc
  * @nb: notifier block to notify EPF of any EPC events (like linkup)
+ * @lock: mutex to protect pci_epf_ops
  */
 struct pci_epf {
        struct device           dev;
@@ -124,6 +125,8 @@ struct pci_epf {
        struct pci_epf_driver   *driver;
        struct list_head        list;
        struct notifier_block   nb;
+       /* mutex to protect against concurrent access of pci_epf_ops */
+       struct mutex            lock;
 };
 
 #define to_pci_epf(epf_dev) container_of((epf_dev), struct pci_epf, dev)