From fc8914e1d87fece357702a8ecbeffa2c05c9ca40 Mon Sep 17 00:00:00 2001 From: Tonghao Zhang Date: Tue, 9 Jun 2020 08:53:40 +0800 Subject: [PATCH] dpif-netdev: Add check mark to avoid ovs-vswitchd crash. When changing the pmd interfaces attribute, ovs-vswitchd will reload pmd and flush offload flows. reload_affected_pmds may be invoked twice or more. In that case, the flows may been queued to "dp_netdev_flow_offload" thread again. For example: $ ovs-vsctl -- set interface options:dpdk-lsc-interrupt=true ovs-vswitchd main flow-offload thread append F to queue ... ... append F to queue ... del F ... del F (crash [1]) [1]: ovs_assert_failure lib/cmap.c:922 cmap_replace lib/cmap.c:921 cmap_remove lib/cmap.h:295 mark_to_flow_disassociate lib/dpif-netdev.c:2269 dp_netdev_flow_offload_del lib/dpif-netdev.c:2369 dp_netdev_flow_offload_main lib/dpif-netdev.c:2492 Fixes: 02bb2824e51d ("dpif-netdev: do hw flow offload in a thread") Signed-off-by: Tonghao Zhang Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index bd88e6d3f..83edfbd2f 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2264,6 +2264,12 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, struct cmap_node *mark_node = CONST_CAST(struct cmap_node *, &flow->mark_node); + /* INVALID_FLOW_MARK may mean that the flow has been disassociated or + * never associated. */ + if (OVS_UNLIKELY(mark == INVALID_FLOW_MARK)) { + return EINVAL; + } + cmap_remove(&flow_mark.mark_to_flow, mark_node, hash_int(mark, 0)); flow->mark = INVALID_FLOW_MARK; -- 2.39.5