On 7/12/21 5:07 PM, Eli Britstein wrote:
> Association of a mark to a flow is done as part of its offload handling,
> in the offloading thread. However, the PMD thread specifies whether an
> offload request is an "add" or "modify" by the association of a mark to
> the flow.
> This is exposed to a race condition. A flow might be created with
> actions that cannot be fully offloaded, for example flooding (before MAC
> learning), and later modified to have actions that can be fully
> offloaded. If the two requests are queued before the offload thread
> handling, they are both marked as "add". When the offload thread handles
> them, the first request is partially offloaded, and the second one is
> ignored as the flow is already considered as offloaded.
> 
> Fix it by specifying add/modify of an offload request by the actual flow
> state change, without relying on the mark.
> 
> Fixes: 3c7330ebf036 ("netdev-offload-dpdk: Support offload of output action.")
> Signed-off-by: Eli Britstein <[email protected]>
> Reviewed-by: Gaetan Rivet <[email protected]>
> ---
>  lib/dpif-netdev.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 21b0e025d..9b2b8d6d9 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2451,7 +2451,8 @@ static void
>  queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
>                        struct dp_netdev_flow *flow, struct match *match,
>                        const struct nlattr *actions, size_t actions_len,
> -                      odp_port_t orig_in_port)
> +                      odp_port_t orig_in_port,
> +                      const struct dp_netdev_actions *old_actions)
>  {
>      struct dp_flow_offload_item *offload;
>      int op;
> @@ -2467,11 +2468,9 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
>          ovsthread_once_done(&offload_thread_once);
>      }
>  
> -    if (flow->mark != INVALID_FLOW_MARK) {
> -        op = DP_NETDEV_FLOW_OFFLOAD_OP_MOD;
> -    } else {
> -        op = DP_NETDEV_FLOW_OFFLOAD_OP_ADD;
> -    }
> +    op = old_actions
> +        ? DP_NETDEV_FLOW_OFFLOAD_OP_MOD
> +        : DP_NETDEV_FLOW_OFFLOAD_OP_ADD;

The change looks good to me in general, but I think it's better to
just directly pass DP_NETDEV_FLOW_OFFLOAD_OP_MOD/ADD to the function
instead of passing 'old_actions' pointer that is not really used here.

I see that you will use it in the next patch of the set.  I'll reply
to patch #3.

Best regards, Ilya Maximets.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to