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: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
9e0773c387
Коммит
30a4616c1b
|
@ -62,7 +62,7 @@ static struct tipc_bearer *bearer_get(struct net *net, int bearer_id)
|
|||
{
|
||||
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);
|
||||
|
@ -210,7 +210,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest)
|
|||
struct tipc_bearer *b;
|
||||
|
||||
rcu_read_lock();
|
||||
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
|
||||
b = rcu_dereference(tn->bearer_list[bearer_id]);
|
||||
if (b)
|
||||
tipc_disc_add_dest(b->disc);
|
||||
rcu_read_unlock();
|
||||
|
@ -222,7 +222,7 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
|
|||
struct tipc_bearer *b;
|
||||
|
||||
rcu_read_lock();
|
||||
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
|
||||
b = rcu_dereference(tn->bearer_list[bearer_id]);
|
||||
if (b)
|
||||
tipc_disc_remove_dest(b->disc);
|
||||
rcu_read_unlock();
|
||||
|
@ -444,7 +444,7 @@ int tipc_l2_send_msg(struct net *net, struct sk_buff *skb,
|
|||
struct net_device *dev;
|
||||
int delta;
|
||||
|
||||
dev = (struct net_device *)rcu_dereference_rtnl(b->media_ptr);
|
||||
dev = (struct net_device *)rcu_dereference(b->media_ptr);
|
||||
if (!dev)
|
||||
return 0;
|
||||
|
||||
|
@ -481,7 +481,7 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id)
|
|||
struct tipc_bearer *b;
|
||||
|
||||
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)
|
||||
mtu = b->mtu;
|
||||
rcu_read_unlock();
|
||||
|
@ -574,8 +574,8 @@ static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev,
|
|||
struct tipc_bearer *b;
|
||||
|
||||
rcu_read_lock();
|
||||
b = rcu_dereference_rtnl(dev->tipc_ptr) ?:
|
||||
rcu_dereference_rtnl(orig_dev->tipc_ptr);
|
||||
b = rcu_dereference(dev->tipc_ptr) ?:
|
||||
rcu_dereference(orig_dev->tipc_ptr);
|
||||
if (likely(b && test_bit(0, &b->up) &&
|
||||
(skb->pkt_type <= PACKET_MULTICAST))) {
|
||||
skb_mark_not_on_list(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));
|
||||
ub = rcu_dereference_rtnl(b->media_ptr);
|
||||
ub = rcu_dereference(b->media_ptr);
|
||||
if (!ub) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
|
@ -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) {
|
||||
rtnl_unlock();
|
||||
return -EINVAL;
|
||||
|
@ -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 nlattr *nest;
|
||||
|
||||
ub = rcu_dereference_rtnl(b->media_ptr);
|
||||
ub = rtnl_dereference(b->media_ptr);
|
||||
if (!ub)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -806,7 +806,7 @@ static void tipc_udp_disable(struct tipc_bearer *b)
|
|||
{
|
||||
struct udp_bearer *ub;
|
||||
|
||||
ub = rcu_dereference_rtnl(b->media_ptr);
|
||||
ub = rtnl_dereference(b->media_ptr);
|
||||
if (!ub) {
|
||||
pr_err("UDP bearer instance not found\n");
|
||||
return;
|
||||
|
|
Загрузка…
Ссылка в новой задаче