mirror of
https://github.com/openvswitch/ovs
synced 2025-09-05 00:35:33 +00:00
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 <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: 02bb2824e5
("dpif-netdev: do hw flow offload in a thread")
Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
committed by
Ilya Maximets
parent
fd4d477760
commit
058b80d3de
@@ -2389,6 +2389,12 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd,
|
||||
uint32_t mark = flow->mark;
|
||||
int ret = 0;
|
||||
|
||||
/* 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;
|
||||
|
||||
|
Reference in New Issue
Block a user