mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
ipv6: prepare inet6_fill_ifinfo() for RCU protection
We want to use RCU protection instead of RTNL for inet6_fill_ifinfo(). Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4ad2681364
commit
8afc7a78d5
@ -4354,8 +4354,10 @@ static inline bool netif_testing(const struct net_device *dev)
|
||||
*/
|
||||
static inline bool netif_oper_up(const struct net_device *dev)
|
||||
{
|
||||
return (dev->operstate == IF_OPER_UP ||
|
||||
dev->operstate == IF_OPER_UNKNOWN /* backward compat */);
|
||||
unsigned int operstate = READ_ONCE(dev->operstate);
|
||||
|
||||
return operstate == IF_OPER_UP ||
|
||||
operstate == IF_OPER_UNKNOWN /* backward compat */;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -8632,12 +8632,12 @@ unsigned int dev_get_flags(const struct net_device *dev)
|
||||
{
|
||||
unsigned int flags;
|
||||
|
||||
flags = (dev->flags & ~(IFF_PROMISC |
|
||||
flags = (READ_ONCE(dev->flags) & ~(IFF_PROMISC |
|
||||
IFF_ALLMULTI |
|
||||
IFF_RUNNING |
|
||||
IFF_LOWER_UP |
|
||||
IFF_DORMANT)) |
|
||||
(dev->gflags & (IFF_PROMISC |
|
||||
(READ_ONCE(dev->gflags) & (IFF_PROMISC |
|
||||
IFF_ALLMULTI));
|
||||
|
||||
if (netif_running(dev)) {
|
||||
|
@ -6062,6 +6062,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
|
||||
struct net_device *dev = idev->dev;
|
||||
struct ifinfomsg *hdr;
|
||||
struct nlmsghdr *nlh;
|
||||
int ifindex, iflink;
|
||||
void *protoinfo;
|
||||
|
||||
nlh = nlmsg_put(skb, portid, seq, event, sizeof(*hdr), flags);
|
||||
@ -6072,16 +6073,18 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
|
||||
hdr->ifi_family = AF_INET6;
|
||||
hdr->__ifi_pad = 0;
|
||||
hdr->ifi_type = dev->type;
|
||||
hdr->ifi_index = dev->ifindex;
|
||||
ifindex = READ_ONCE(dev->ifindex);
|
||||
hdr->ifi_index = ifindex;
|
||||
hdr->ifi_flags = dev_get_flags(dev);
|
||||
hdr->ifi_change = 0;
|
||||
|
||||
iflink = dev_get_iflink(dev);
|
||||
if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
|
||||
(dev->addr_len &&
|
||||
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
||||
nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
|
||||
(dev->ifindex != dev_get_iflink(dev) &&
|
||||
nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))) ||
|
||||
nla_put_u32(skb, IFLA_MTU, READ_ONCE(dev->mtu)) ||
|
||||
(ifindex != iflink &&
|
||||
nla_put_u32(skb, IFLA_LINK, iflink)) ||
|
||||
nla_put_u8(skb, IFLA_OPERSTATE,
|
||||
netif_running(dev) ? READ_ONCE(dev->operstate) : IF_OPER_DOWN))
|
||||
goto nla_put_failure;
|
||||
|
Loading…
Reference in New Issue
Block a user