This patch fix the dead lock when using dpdk userspace datapath. The problem is described as follows: 1) when add or delete port, the main thread will call reconfigure_datapath() in the function dpif_netdev_run() 2) Here the dp->port_mutex is locked. In dp_netdev_reload_pmd__(), it will notify each pmd to reload. 3) If pmd is doing packet upcall in fast_path_processing() and try to get dp->port_mutex in do_xlate_actions()-->tnl_route_lookup_flow()-->dpif_netdev_port_query_by_name(). Here pmd get lock failed because the main thread has got the lock in step 2. 4) So the main thread was stuck for waiting pmd to reload done. Now we got a dead lock.
Here reload_affected_pmds() may not need to lock dp->port_mutex. So we release the lock temporarily when calling reload_affected_pmds(). Signed-off-by: Lilijun <jerry.lili...@huawei.com> --- lib/dpif-netdev.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 0f57e3f8a..fc3bdae66 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -4813,8 +4813,11 @@ reconfigure_datapath(struct dp_netdev *dp) /* Reload affected pmd threads. We must wait for the pmd threads before * reconfiguring the ports, because a port cannot be reconfigured while - * it's being used. */ + * it's being used. We need release dp->port_mutex to make sure that pmds + * don't wait for getting the mutex when handling packet upcalls */ + ovs_mutex_unlock(&dp->port_mutex); reload_affected_pmds(dp); + ovs_mutex_lock(&dp->port_mutex); /* Step 3: Reconfigure ports. */ @@ -4877,7 +4880,9 @@ reconfigure_datapath(struct dp_netdev *dp) /* Reload affected pmd threads. We must wait for the pmd threads to remove * the old queues before readding them, otherwise a queue can be polled by * two threads at the same time. */ + ovs_mutex_unlock(&dp->port_mutex); reload_affected_pmds(dp); + ovs_mutex_lock(&dp->port_mutex); /* Step 6: Add queues from scheduling, if they're not there already. */ HMAP_FOR_EACH (port, node, &dp->ports) { @@ -4909,7 +4914,9 @@ reconfigure_datapath(struct dp_netdev *dp) } /* Reload affected pmd threads. */ + ovs_mutex_unlock(&dp->port_mutex); reload_affected_pmds(dp); + ovs_mutex_lock(&dp->port_mutex); /* Check if PMD Auto LB is to be enabled */ set_pmd_auto_lb(dp); -- 2.14.1.windows.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev