Commit 30a4616c authored by Xin Long's avatar Xin Long Committed by David S. Miller

tipc: use rcu dereference functions properly

For these places are protected by rcu_read_lock, we change from
rcu_dereference_rtnl to rcu_dereference, as there is no need to
check if rtnl lock is held.

For these places are protected by rtnl_lock, we change from
rcu_dereference_rtnl to rtnl_dereference/rcu_dereference_protected,
as no extra memory barriers are needed under rtnl_lock() which also
protects tn->bearer_list[] and dev->tipc_ptr/b->media_ptr updating.

rcu_dereference_rtnl will be only used in the places where it could
be under rcu_read_lock or rtnl_lock.
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9e0773c3
...@@ -62,7 +62,7 @@ static struct tipc_bearer *bearer_get(struct net *net, int bearer_id) ...@@ -62,7 +62,7 @@ static struct tipc_bearer *bearer_get(struct net *net, int bearer_id)
{ {
struct tipc_net *tn = tipc_net(net); struct tipc_net *tn = tipc_net(net);
return rcu_dereference_rtnl(tn->bearer_list[bearer_id]); return rcu_dereference(tn->bearer_list[bearer_id]);
} }
static void bearer_disable(struct net *net, struct tipc_bearer *b); static void bearer_disable(struct net *net, struct tipc_bearer *b);
...@@ -210,7 +210,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest) ...@@ -210,7 +210,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest)
struct tipc_bearer *b; struct tipc_bearer *b;
rcu_read_lock(); rcu_read_lock();
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]); b = rcu_dereference(tn->bearer_list[bearer_id]);
if (b) if (b)
tipc_disc_add_dest(b->disc); tipc_disc_add_dest(b->disc);
rcu_read_unlock(); rcu_read_unlock();
...@@ -222,7 +222,7 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest) ...@@ -222,7 +222,7 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
struct tipc_bearer *b; struct tipc_bearer *b;
rcu_read_lock(); rcu_read_lock();
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]); b = rcu_dereference(tn->bearer_list[bearer_id]);
if (b) if (b)
tipc_disc_remove_dest(b->disc); tipc_disc_remove_dest(b->disc);
rcu_read_unlock(); rcu_read_unlock();
...@@ -444,7 +444,7 @@ int tipc_l2_send_msg(struct net *net, struct sk_buff *skb, ...@@ -444,7 +444,7 @@ int tipc_l2_send_msg(struct net *net, struct sk_buff *skb,
struct net_device *dev; struct net_device *dev;
int delta; int delta;
dev = (struct net_device *)rcu_dereference_rtnl(b->media_ptr); dev = (struct net_device *)rcu_dereference(b->media_ptr);
if (!dev) if (!dev)
return 0; return 0;
...@@ -481,7 +481,7 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id) ...@@ -481,7 +481,7 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id)
struct tipc_bearer *b; struct tipc_bearer *b;
rcu_read_lock(); rcu_read_lock();
b = rcu_dereference_rtnl(tipc_net(net)->bearer_list[bearer_id]); b = rcu_dereference(tipc_net(net)->bearer_list[bearer_id]);
if (b) if (b)
mtu = b->mtu; mtu = b->mtu;
rcu_read_unlock(); rcu_read_unlock();
...@@ -574,8 +574,8 @@ static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev, ...@@ -574,8 +574,8 @@ static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev,
struct tipc_bearer *b; struct tipc_bearer *b;
rcu_read_lock(); rcu_read_lock();
b = rcu_dereference_rtnl(dev->tipc_ptr) ?: b = rcu_dereference(dev->tipc_ptr) ?:
rcu_dereference_rtnl(orig_dev->tipc_ptr); rcu_dereference(orig_dev->tipc_ptr);
if (likely(b && test_bit(0, &b->up) && if (likely(b && test_bit(0, &b->up) &&
(skb->pkt_type <= PACKET_MULTICAST))) { (skb->pkt_type <= PACKET_MULTICAST))) {
skb_mark_not_on_list(skb); skb_mark_not_on_list(skb);
......
...@@ -231,7 +231,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb, ...@@ -231,7 +231,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
} }
skb_set_inner_protocol(skb, htons(ETH_P_TIPC)); skb_set_inner_protocol(skb, htons(ETH_P_TIPC));
ub = rcu_dereference_rtnl(b->media_ptr); ub = rcu_dereference(b->media_ptr);
if (!ub) { if (!ub) {
err = -ENODEV; err = -ENODEV;
goto out; goto out;
...@@ -490,7 +490,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -490,7 +490,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb)
} }
} }
ub = rcu_dereference_rtnl(b->media_ptr); ub = rtnl_dereference(b->media_ptr);
if (!ub) { if (!ub) {
rtnl_unlock(); rtnl_unlock();
return -EINVAL; return -EINVAL;
...@@ -532,7 +532,7 @@ int tipc_udp_nl_add_bearer_data(struct tipc_nl_msg *msg, struct tipc_bearer *b) ...@@ -532,7 +532,7 @@ int tipc_udp_nl_add_bearer_data(struct tipc_nl_msg *msg, struct tipc_bearer *b)
struct udp_bearer *ub; struct udp_bearer *ub;
struct nlattr *nest; struct nlattr *nest;
ub = rcu_dereference_rtnl(b->media_ptr); ub = rtnl_dereference(b->media_ptr);
if (!ub) if (!ub)
return -ENODEV; return -ENODEV;
...@@ -806,7 +806,7 @@ static void tipc_udp_disable(struct tipc_bearer *b) ...@@ -806,7 +806,7 @@ static void tipc_udp_disable(struct tipc_bearer *b)
{ {
struct udp_bearer *ub; struct udp_bearer *ub;
ub = rcu_dereference_rtnl(b->media_ptr); ub = rtnl_dereference(b->media_ptr);
if (!ub) { if (!ub) {
pr_err("UDP bearer instance not found\n"); pr_err("UDP bearer instance not found\n");
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment