When the ovs control thread del vhost-user port and
the vhost-event thread process the vhost-user port down concurrently,
the main thread may fall into a deadlock.
E.g., vhostuser port is created as client.
The ovs control thread executes the following process:
rte_vhost_driver_unregister->fdset_try_del.
At the same time, the vhost-event thread executes the following process:
fdset_event_dispatch->vhost_user_read_cb->destroy_device.
At this time, vhost-event will wait for rcu scheduling,
and the ovs control thread is waiting for pfdentry->busy to be 0.
The two threads are waiting for each other and fall into a deadlock.
Fixes: afee281 ("netdev-dpdk: Fix dpdk_watchdog failure to quiesce.")
Signed-off-by: Xinxin Zhao <[email protected]>
---
lib/netdev-dpdk.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 02cef6e45..0c02357f5 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1808,7 +1808,16 @@ dpdk_vhost_driver_unregister(struct netdev_dpdk *dev
OVS_UNUSED,
OVS_EXCLUDED(dpdk_mutex)
OVS_EXCLUDED(dev->mutex)
{
- return rte_vhost_driver_unregister(vhost_id);
+ int ret;
+ /* Due to the rcu wait of the vhost-event thread,
+ * rte_vhost_driver_unregister() may loop endlessly.
+ * So the unregister action needs to be removed from the rcu_list.
+ */
+ ovsrcu_quiesce_start();
+ ret = rte_vhost_driver_unregister(vhost_id);
+ ovsrcu_quiesce_end();
+
+ return ret;
}
static void
--
2.45.2
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev