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:
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| actions.c | ||
| conntrack.c | ||
| conntrack.h | ||
| datapath.c | ||
| datapath.h | ||
| dp_notify.c | ||
| drop.h | ||
| flow.c | ||
| flow.h | ||
| flow_netlink.c | ||
| flow_netlink.h | ||
| flow_table.c | ||
| flow_table.h | ||
| meter.c | ||
| meter.h | ||
| openvswitch_trace.c | ||
| openvswitch_trace.h | ||
| vport-geneve.c | ||
| vport-gre.c | ||
| vport-internal_dev.c | ||
| vport-internal_dev.h | ||
| vport-netdev.c | ||
| vport-netdev.h | ||
| vport-vxlan.c | ||
| vport.c | ||
| vport.h | ||