Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f565232 authored by Dominik Brodowski's avatar Dominik Brodowski
Browse files

pcmcia: use mutex for dynid lock



Even though we weren't calling a blocking function within the dynid
spinlock, we do not need a spinlock here but can and should be using
a mutex.

Reported-by: default avatarJiri Slaby <jirislaby@gmail.com>
Tested-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent 94a819f8
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -124,9 +124,9 @@ pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count)
	dynid->id.device_no = device_no;
	dynid->id.device_no = device_no;
	memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);
	memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);


	spin_lock(&pdrv->dynids.lock);
	mutex_lock(&pdrv->dynids.lock);
	list_add_tail(&dynid->node, &pdrv->dynids.list);
	list_add_tail(&dynid->node, &pdrv->dynids.list);
	spin_unlock(&pdrv->dynids.lock);
	mutex_unlock(&pdrv->dynids.lock);


	if (get_driver(&pdrv->drv)) {
	if (get_driver(&pdrv->drv)) {
		retval = driver_attach(&pdrv->drv);
		retval = driver_attach(&pdrv->drv);
@@ -144,12 +144,12 @@ pcmcia_free_dynids(struct pcmcia_driver *drv)
{
{
	struct pcmcia_dynid *dynid, *n;
	struct pcmcia_dynid *dynid, *n;


	spin_lock(&drv->dynids.lock);
	mutex_lock(&drv->dynids.lock);
	list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
	list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
		list_del(&dynid->node);
		list_del(&dynid->node);
		kfree(dynid);
		kfree(dynid);
	}
	}
	spin_unlock(&drv->dynids.lock);
	mutex_unlock(&drv->dynids.lock);
}
}


static int
static int
@@ -180,7 +180,7 @@ int pcmcia_register_driver(struct pcmcia_driver *driver)
	/* initialize common fields */
	/* initialize common fields */
	driver->drv.bus = &pcmcia_bus_type;
	driver->drv.bus = &pcmcia_bus_type;
	driver->drv.owner = driver->owner;
	driver->drv.owner = driver->owner;
	spin_lock_init(&driver->dynids.lock);
	mutex_init(&driver->dynids.lock);
	INIT_LIST_HEAD(&driver->dynids.list);
	INIT_LIST_HEAD(&driver->dynids.list);


	pr_debug("registering driver %s\n", driver->drv.name);
	pr_debug("registering driver %s\n", driver->drv.name);
@@ -894,16 +894,16 @@ static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
	struct pcmcia_dynid *dynid;
	struct pcmcia_dynid *dynid;


	/* match dynamic devices first */
	/* match dynamic devices first */
	spin_lock(&p_drv->dynids.lock);
	mutex_lock(&p_drv->dynids.lock);
	list_for_each_entry(dynid, &p_drv->dynids.list, node) {
	list_for_each_entry(dynid, &p_drv->dynids.list, node) {
		dev_dbg(dev, "trying to match to %s\n", drv->name);
		dev_dbg(dev, "trying to match to %s\n", drv->name);
		if (pcmcia_devmatch(p_dev, &dynid->id)) {
		if (pcmcia_devmatch(p_dev, &dynid->id)) {
			dev_dbg(dev, "matched to %s\n", drv->name);
			dev_dbg(dev, "matched to %s\n", drv->name);
			spin_unlock(&p_drv->dynids.lock);
			mutex_unlock(&p_drv->dynids.lock);
			return 1;
			return 1;
		}
		}
	}
	}
	spin_unlock(&p_drv->dynids.lock);
	mutex_unlock(&p_drv->dynids.lock);


#ifdef CONFIG_PCMCIA_IOCTL
#ifdef CONFIG_PCMCIA_IOCTL
	/* matching by cardmgr */
	/* matching by cardmgr */
+1 −1
Original line number Original line Diff line number Diff line
@@ -40,7 +40,7 @@ struct net_device;
 * Documentation/pcmcia/driver.txt for details.
 * Documentation/pcmcia/driver.txt for details.
*/
*/
struct pcmcia_dynids {
struct pcmcia_dynids {
	spinlock_t		lock;
	struct mutex		lock;
	struct list_head	list;
	struct list_head	list;
};
};