Commit 54982276 authored by Toke Høiland-Jørgensen's avatar Toke Høiland-Jørgensen Committed by Paolo Abeni
Browse files

net: openvswitch: Avoid needlessly taking the RTNL on vport destroy



The openvswitch teardown code will immediately call
ovs_netdev_detach_dev() in response to a NETDEV_UNREGISTER notification.
It will then start the dp_notify_work workqueue, which will later end up
calling the vport destroy() callback. This callback takes the RTNL to do
another ovs_netdev_detach_port(), which in this case is unnecessary.
This causes extra pressure on the RTNL, in some cases leading to
"unregister_netdevice: waiting for XX to become free" warnings on
teardown.

We can straight-forwardly avoid the extra RTNL lock acquisition by
checking the device flags before taking the lock, and skip the locking
altogether if the IFF_OVS_DATAPATH flag has already been unset.

Fixes: b07c2651 ("openvswitch: fix vport-netdev unregister")
Tested-by: default avatarAdrian Moreno <amorenoz@redhat.com>
Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
Acked-by: default avatarEelco Chaudron <echaudro@redhat.com>
Acked-by: default avatarAaron Conole <aconole@redhat.com>
Link: https://patch.msgid.link/20251211115006.228876-1-toke@redhat.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 1e5a5414
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -160,10 +160,19 @@ void ovs_netdev_detach_dev(struct vport *vport)

static void netdev_destroy(struct vport *vport)
{
	/* When called from ovs_db_notify_wq() after a dp_device_event(), the
	 * port has already been detached, so we can avoid taking the RTNL by
	 * checking this first.
	 */
	if (netif_is_ovs_port(vport->dev)) {
		rtnl_lock();
		/* Check again while holding the lock to ensure we don't race
		 * with the netdev notifier and detach twice.
		 */
		if (netif_is_ovs_port(vport->dev))
			ovs_netdev_detach_dev(vport);
		rtnl_unlock();
	}

	call_rcu(&vport->rcu, vport_netdev_free);
}