decnet: convert dndev_lock to spinlock
authorstephen hemminger <shemminger@vyatta.com>
Wed, 11 Nov 2009 07:40:36 +0000 (07:40 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Nov 2009 03:22:18 +0000 (19:22 -0800)
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: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/decnet/dn_dev.c

index 5790d66..6c916e2 100644 (file)
@@ -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 @@ rarok:
 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);
 }