* [PATCH rdma-nxt] i40iw: Do an RCU lookup in i40iw_add_ipv4_addr
@ 2020-01-17 21:47 Shiraz Saleem
2020-01-25 18:31 ` Jason Gunthorpe
0 siblings, 1 reply; 2+ messages in thread
From: Shiraz Saleem @ 2020-01-17 21:47 UTC (permalink / raw)
To: dledford, jgg; +Cc: linux-rdma, Shiraz Saleem
From: "Shiraz Saleem" <shiraz.saleem@intel.com>
The in_dev_for_each_ifa_rtnl iterator in i40iw_add_ipv4_addr
requires that the rtnl lock be held. But the rtnl_trylock/unlock
scheme in this function does not guarantee it.
Replace the rtnl locking with an RCU lookup since there are
no netdev object updates in this function.
Fixes: 8e06af711bf2 ("i40iw: add main, hdr, status")
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
---
drivers/infiniband/hw/i40iw/i40iw_main.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index 2386143..d7a1219 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -1212,22 +1212,19 @@ static void i40iw_add_ipv4_addr(struct i40iw_device *iwdev)
{
struct net_device *dev;
struct in_device *idev;
- bool got_lock = true;
u32 ip_addr;
- if (!rtnl_trylock())
- got_lock = false;
-
- for_each_netdev(&init_net, dev) {
+ rcu_read_lock();
+ for_each_netdev_rcu(&init_net, dev) {
if ((((rdma_vlan_dev_vlan_id(dev) < 0xFFFF) &&
(rdma_vlan_dev_real_dev(dev) == iwdev->netdev)) ||
(dev == iwdev->netdev)) && (dev->flags & IFF_UP)) {
const struct in_ifaddr *ifa;
- idev = in_dev_get(dev);
+ idev = __in_dev_get_rcu(dev);
if (!idev)
continue;
- in_dev_for_each_ifa_rtnl(ifa, idev) {
+ in_dev_for_each_ifa_rcu(ifa, idev) {
i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM,
"IP=%pI4, vlan_id=%d, MAC=%pM\n", &ifa->ifa_address,
rdma_vlan_dev_vlan_id(dev), dev->dev_addr);
@@ -1239,12 +1236,9 @@ static void i40iw_add_ipv4_addr(struct i40iw_device *iwdev)
true,
I40IW_ARP_ADD);
}
-
- in_dev_put(idev);
}
}
- if (got_lock)
- rtnl_unlock();
+ rcu_read_unlock();
}
/**
--
1.8.3.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH rdma-nxt] i40iw: Do an RCU lookup in i40iw_add_ipv4_addr
2020-01-17 21:47 [PATCH rdma-nxt] i40iw: Do an RCU lookup in i40iw_add_ipv4_addr Shiraz Saleem
@ 2020-01-25 18:31 ` Jason Gunthorpe
0 siblings, 0 replies; 2+ messages in thread
From: Jason Gunthorpe @ 2020-01-25 18:31 UTC (permalink / raw)
To: Shiraz Saleem; +Cc: dledford, linux-rdma
On Fri, Jan 17, 2020 at 03:47:20PM -0600, Shiraz Saleem wrote:
> From: "Shiraz Saleem" <shiraz.saleem@intel.com>
>
> The in_dev_for_each_ifa_rtnl iterator in i40iw_add_ipv4_addr
> requires that the rtnl lock be held. But the rtnl_trylock/unlock
> scheme in this function does not guarantee it.
>
> Replace the rtnl locking with an RCU lookup since there are
> no netdev object updates in this function.
>
> Fixes: 8e06af711bf2 ("i40iw: add main, hdr, status")
> Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
> ---
> drivers/infiniband/hw/i40iw/i40iw_main.c | 16 +++++-----------
> 1 file changed, 5 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
> index 2386143..d7a1219 100644
> --- a/drivers/infiniband/hw/i40iw/i40iw_main.c
> +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
> @@ -1212,22 +1212,19 @@ static void i40iw_add_ipv4_addr(struct i40iw_device *iwdev)
> {
> struct net_device *dev;
> struct in_device *idev;
> - bool got_lock = true;
> u32 ip_addr;
>
> - if (!rtnl_trylock())
> - got_lock = false;
> -
> - for_each_netdev(&init_net, dev) {
> + rcu_read_lock();
> + for_each_netdev_rcu(&init_net, dev) {
> if ((((rdma_vlan_dev_vlan_id(dev) < 0xFFFF) &&
> (rdma_vlan_dev_real_dev(dev) == iwdev->netdev)) ||
> (dev == iwdev->netdev)) && (dev->flags & IFF_UP)) {
> const struct in_ifaddr *ifa;
The rtnl does not just protect the pointers, but also values like
flags from changing. When using RCU any varient values of the dev
should be read with READ_ONCE, such as flags.
I'm not completely sure the vlan tests are OK under RCU either, but
netdev has historically been loose on its READ_ONCE/WRITE_ONCE
annotations..
Jason
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-01-25 18:31 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-17 21:47 [PATCH rdma-nxt] i40iw: Do an RCU lookup in i40iw_add_ipv4_addr Shiraz Saleem
2020-01-25 18:31 ` Jason Gunthorpe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).