netlink: convert netlink tap spinlock to mutex
authorCong Wang <xiyou.wangcong@gmail.com>
Wed, 6 Dec 2017 23:03:20 +0000 (15:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Dec 2017 15:56:55 +0000 (10:56 -0500)
Both netlink_add_tap() and netlink_remove_tap() are
called in process context, no need to bother spinlock.

Note, in fact, currently we always hold RTNL when calling
these two functions, so we don't need any other lock at
all, but keeping this lock doesn't harm anything.

Cc: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/netlink/af_netlink.c

index 1dda94c9695a37d24d1152cbbd4cc2313c9799fb..b0fe1fb12b99b5eb18ed624e2088d5e1369f8f95 100644 (file)
@@ -176,7 +176,7 @@ static unsigned int netlink_tap_net_id;
 
 struct netlink_tap_net {
        struct list_head netlink_tap_all;
-       spinlock_t netlink_tap_lock;
+       struct mutex netlink_tap_lock;
 };
 
 int netlink_add_tap(struct netlink_tap *nt)
@@ -187,9 +187,9 @@ int netlink_add_tap(struct netlink_tap *nt)
        if (unlikely(nt->dev->type != ARPHRD_NETLINK))
                return -EINVAL;
 
-       spin_lock(&nn->netlink_tap_lock);
+       mutex_lock(&nn->netlink_tap_lock);
        list_add_rcu(&nt->list, &nn->netlink_tap_all);
-       spin_unlock(&nn->netlink_tap_lock);
+       mutex_unlock(&nn->netlink_tap_lock);
 
        __module_get(nt->module);
 
@@ -204,7 +204,7 @@ static int __netlink_remove_tap(struct netlink_tap *nt)
        bool found = false;
        struct netlink_tap *tmp;
 
-       spin_lock(&nn->netlink_tap_lock);
+       mutex_lock(&nn->netlink_tap_lock);
 
        list_for_each_entry(tmp, &nn->netlink_tap_all, list) {
                if (nt == tmp) {
@@ -216,7 +216,7 @@ static int __netlink_remove_tap(struct netlink_tap *nt)
 
        pr_warn("__netlink_remove_tap: %p not found\n", nt);
 out:
-       spin_unlock(&nn->netlink_tap_lock);
+       mutex_unlock(&nn->netlink_tap_lock);
 
        if (found)
                module_put(nt->module);
@@ -240,7 +240,7 @@ static __net_init int netlink_tap_init_net(struct net *net)
        struct netlink_tap_net *nn = net_generic(net, netlink_tap_net_id);
 
        INIT_LIST_HEAD(&nn->netlink_tap_all);
-       spin_lock_init(&nn->netlink_tap_lock);
+       mutex_init(&nn->netlink_tap_lock);
        return 0;
 }