Skip to content

Commit

Permalink
netlink: convert netlink tap spinlock to mutex
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Cong Wang authored and David S. Miller committed Dec 11, 2017
1 parent 25e3f70 commit b1042d3
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions net/netlink/af_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);

Expand All @@ -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) {
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down

0 comments on commit b1042d3

Please sign in to comment.