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

Commit e5c140a3 authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller
Browse files

decnet: convert dndev_lock to spinlock



There is no reason for this lock to be reader/writer since
the reader only has lock held for a very brief period.
The overhead of read_lock is more expensive than spinlock.

Compile tested only, I am not a decnet user.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 41bdecf1
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ extern struct neigh_table dn_neigh_table;
 */
__le16 decnet_address = 0;

static DEFINE_RWLOCK(dndev_lock);
static DEFINE_SPINLOCK(dndev_lock);
static struct net_device *decnet_default_device;
static BLOCKING_NOTIFIER_HEAD(dnaddr_chain);

@@ -557,7 +557,8 @@ int dn_dev_ioctl(unsigned int cmd, void __user *arg)
struct net_device *dn_dev_get_default(void)
{
	struct net_device *dev;
	read_lock(&dndev_lock);

	spin_lock(&dndev_lock);
	dev = decnet_default_device;
	if (dev) {
		if (dev->dn_ptr)
@@ -565,7 +566,8 @@ struct net_device *dn_dev_get_default(void)
		else
			dev = NULL;
	}
	read_unlock(&dndev_lock);
	spin_unlock(&dndev_lock);

	return dev;
}

@@ -575,13 +577,15 @@ int dn_dev_set_default(struct net_device *dev, int force)
	int rv = -EBUSY;
	if (!dev->dn_ptr)
		return -ENODEV;
	write_lock(&dndev_lock);

	spin_lock(&dndev_lock);
	if (force || decnet_default_device == NULL) {
		old = decnet_default_device;
		decnet_default_device = dev;
		rv = 0;
	}
	write_unlock(&dndev_lock);
	spin_unlock(&dndev_lock);

	if (old)
		dev_put(old);
	return rv;
@@ -589,13 +593,14 @@ int dn_dev_set_default(struct net_device *dev, int force)

static void dn_dev_check_default(struct net_device *dev)
{
	write_lock(&dndev_lock);
	spin_lock(&dndev_lock);
	if (dev == decnet_default_device) {
		decnet_default_device = NULL;
	} else {
		dev = NULL;
	}
	write_unlock(&dndev_lock);
	spin_unlock(&dndev_lock);

	if (dev)
		dev_put(dev);
}