On Thu, Jan 27, 2022, at 07:42, Sriharsha Basavapatna via dev wrote:
> In dp_netdev_pmd_remove_flow() we schedule the deletion of an
> offloaded flow, if a mark has been assigned to the flow. But if
> this occurs in the window in which the offload thread completes
> offloading the flow and assigns a mark to the flow, then we miss
> deleting the flow. This problem has been observed while adding
> and deleting flows in a loop. To fix this, always enqueue flow
> deletion regardless of the flow->mark being set.
>
> Fixes: 241bad15d99a("dpif-netdev: associate flow with a mark id")
> Signed-off-by: Sriharsha Basavapatna <[email protected]>
> ---
> lib/dpif-netdev.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index e28e0b554..22c5f19a8 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -3029,9 +3029,7 @@ dp_netdev_pmd_remove_flow(struct
> dp_netdev_pmd_thread *pmd,
> dp_netdev_simple_match_remove(pmd, flow);
> cmap_remove(&pmd->flow_table, node,
> dp_netdev_flow_hash(&flow->ufid));
> ccmap_dec(&pmd->n_flows, odp_to_u32(in_port));
> - if (flow->mark != INVALID_FLOW_MARK) {
> - queue_netdev_flow_del(pmd, flow);
> - }
> + queue_netdev_flow_del(pmd, flow);
Hi Sriharsha,
It makes sense, thanks for the patch.
Additionally, the mark is being written in a thread and read in another but is
not atomic. Without fence, coherence might take time, making the described
issue more likely on some archs.
Acked-by: Gaetan Rivet <[email protected]>
--
Gaetan Rivet
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev