Commit 07301c98 authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I Committed by Lorenzo Pieralisi
Browse files

PCI: endpoint: Protect concurrent access to pci_epf_ops with mutex



Protect concurrent access to pci_epf_ops with a mutex.

Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
parent 04e046ca
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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) {
+3 −0
Original line number Diff line number Diff line
@@ -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)