diff mbox series

RDMA: Add netdevice_tracker to ib_device_set_netdev()

Message ID 0-v1-a7c81b3842ce+e5-netdev_tracker_jgg@nvidia.com (mailing list archive)
State Accepted
Headers show
Series RDMA: Add netdevice_tracker to ib_device_set_netdev() | expand

Commit Message

Jason Gunthorpe Nov. 24, 2022, 12:27 a.m. UTC
This will cause an informative backtrace to print if the user of
ib_device_set_netdev() isn't careful about tearing down the ibdevice
before its the netdevice parent is destroyed. Such as like this:

  unregister_netdevice: waiting for vlan0 to become free. Usage count = 2
  leaked reference.
   ib_device_set_netdev+0x266/0x730
   siw_newlink+0x4e0/0xfd0
   nldev_newlink+0x35c/0x5c0
   rdma_nl_rcv_msg+0x36d/0x690
   rdma_nl_rcv+0x2ee/0x430
   netlink_unicast+0x543/0x7f0
   netlink_sendmsg+0x918/0xe20
   sock_sendmsg+0xcf/0x120
   ____sys_sendmsg+0x70d/0x8b0
   ___sys_sendmsg+0x11d/0x1b0
   __sys_sendmsg+0xfa/0x1d0
   do_syscall_64+0x35/0xb0
   entry_SYSCALL_64_after_hwframe+0x63/0xcd

This will help debug the issues syzkaller is seeing.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
 drivers/infiniband/core/device.c | 6 ++++--
 include/rdma/ib_verbs.h          | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)


base-commit: f67376d801499f4fa0838c18c1efcad8840e550d

Comments

Leon Romanovsky Nov. 28, 2022, 10:18 a.m. UTC | #1
On Wed, 23 Nov 2022 20:27:14 -0400, Jason Gunthorpe wrote:
> This will cause an informative backtrace to print if the user of
> ib_device_set_netdev() isn't careful about tearing down the ibdevice
> before its the netdevice parent is destroyed. Such as like this:
> 
>   unregister_netdevice: waiting for vlan0 to become free. Usage count = 2
>   leaked reference.
>    ib_device_set_netdev+0x266/0x730
>    siw_newlink+0x4e0/0xfd0
>    nldev_newlink+0x35c/0x5c0
>    rdma_nl_rcv_msg+0x36d/0x690
>    rdma_nl_rcv+0x2ee/0x430
>    netlink_unicast+0x543/0x7f0
>    netlink_sendmsg+0x918/0xe20
>    sock_sendmsg+0xcf/0x120
>    ____sys_sendmsg+0x70d/0x8b0
>    ___sys_sendmsg+0x11d/0x1b0
>    __sys_sendmsg+0xfa/0x1d0
>    do_syscall_64+0x35/0xb0
>    entry_SYSCALL_64_after_hwframe+0x63/0xcd
> 
> [...]

Applied, thanks!

[1/1] RDMA: Add netdevice_tracker to ib_device_set_netdev()
      https://git.kernel.org/rdma/rdma/c/09f530f0c6d668

Best regards,
diff mbox series

Patch

diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 3409c55ea88bff..ff35cebb25e265 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -2159,14 +2159,16 @@  int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
 		return 0;
 	}
 
+	if (old_ndev)
+		netdev_tracker_free(ndev, &pdata->netdev_tracker);
 	if (ndev)
-		dev_hold(ndev);
+		netdev_hold(ndev, &pdata->netdev_tracker, GFP_ATOMIC);
 	rcu_assign_pointer(pdata->netdev, ndev);
 	spin_unlock_irqrestore(&pdata->netdev_lock, flags);
 
 	add_ndev_hash(pdata);
 	if (old_ndev)
-		dev_put(old_ndev);
+		__dev_put(old_ndev);
 
 	return 0;
 }
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index a1f4d53a4bb636..77dd9148815b9c 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -2203,6 +2203,7 @@  struct ib_port_data {
 	struct ib_port_cache cache;
 
 	struct net_device __rcu *netdev;
+	netdevice_tracker netdev_tracker;
 	struct hlist_node ndev_hash_link;
 	struct rdma_port_counter port_counter;
 	struct ib_port *sysfs;