mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 14:21:47 +00:00
rtnetlink: allow rtnl_fill_link_netnsid() to run under RCU protection
We want to be able to run rtnl_fill_ifinfo() under RCU protection instead of RTNL in the future. All rtnl_link_ops->get_link_net() methods already using dev_net() are ready. I added READ_ONCE() annotations on others. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
979aad40da
commit
9cf621bd5f
@ -1357,7 +1357,7 @@ static struct net *ppp_nl_get_link_net(const struct net_device *dev)
|
||||
{
|
||||
struct ppp *ppp = netdev_priv(dev);
|
||||
|
||||
return ppp->ppp_net;
|
||||
return READ_ONCE(ppp->ppp_net);
|
||||
}
|
||||
|
||||
static struct rtnl_link_ops ppp_link_ops __read_mostly = {
|
||||
|
@ -4569,7 +4569,7 @@ static struct net *vxlan_get_link_net(const struct net_device *dev)
|
||||
{
|
||||
struct vxlan_dev *vxlan = netdev_priv(dev);
|
||||
|
||||
return vxlan->net;
|
||||
return READ_ONCE(vxlan->net);
|
||||
}
|
||||
|
||||
static struct rtnl_link_ops vxlan_link_ops __read_mostly = {
|
||||
|
@ -1923,9 +1923,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (rtnl_fill_link_netnsid(skb, dev, src_net, gfp))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (new_nsid &&
|
||||
nla_put_s32(skb, IFLA_NEW_NETNSID, *new_nsid) < 0)
|
||||
goto nla_put_failure;
|
||||
@ -1938,6 +1935,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
||||
goto nla_put_failure;
|
||||
|
||||
rcu_read_lock();
|
||||
if (rtnl_fill_link_netnsid(skb, dev, src_net, GFP_ATOMIC))
|
||||
goto nla_put_failure_rcu;
|
||||
qdisc = rcu_dereference(dev->qdisc);
|
||||
if (qdisc && nla_put_string(skb, IFLA_QDISC, qdisc->ops->id))
|
||||
goto nla_put_failure_rcu;
|
||||
|
@ -1120,7 +1120,7 @@ struct net *ip_tunnel_get_link_net(const struct net_device *dev)
|
||||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
|
||||
return tunnel->net;
|
||||
return READ_ONCE(tunnel->net);
|
||||
}
|
||||
EXPORT_SYMBOL(ip_tunnel_get_link_net);
|
||||
|
||||
|
@ -2146,7 +2146,7 @@ struct net *ip6_tnl_get_link_net(const struct net_device *dev)
|
||||
{
|
||||
struct ip6_tnl *tunnel = netdev_priv(dev);
|
||||
|
||||
return tunnel->net;
|
||||
return READ_ONCE(tunnel->net);
|
||||
}
|
||||
EXPORT_SYMBOL(ip6_tnl_get_link_net);
|
||||
|
||||
|
@ -926,7 +926,7 @@ static struct net *xfrmi_get_link_net(const struct net_device *dev)
|
||||
{
|
||||
struct xfrm_if *xi = netdev_priv(dev);
|
||||
|
||||
return xi->net;
|
||||
return READ_ONCE(xi->net);
|
||||
}
|
||||
|
||||
static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = {
|
||||
|
Loading…
Reference in New Issue
Block a user