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 |
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 --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;
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