From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D008B43345 for ; Thu, 16 Nov 2023 14:24:46 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CAA9740DF6; Thu, 16 Nov 2023 14:24:46 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 3BB22402C6 for ; Thu, 16 Nov 2023 14:24:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1700141084; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=na1Dbt1x8l+pFm0ZvpGdvEeaujMdTUFTt3pH4hkcBkg=; b=EXPUv6+wn50yRCWm5O/b9A5Lequ3aasGE6F2x+/vJ17a4QrNwU0IHamuCFVc4/pitF1bKg iOxfh4eF8gmsiK1TtLtvlBcgsBCMZkf5gXz9PODIEfOxq1iy0VNPxatt1milVWgKWcgs0a CeVZWIiEMlW/Ydpyw28C3PxbGHHvex0= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-627-2zjdD2KDPoWHLGdKzD78cw-1; Thu, 16 Nov 2023 08:24:43 -0500 X-MC-Unique: 2zjdD2KDPoWHLGdKzD78cw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 687DF811E88; Thu, 16 Nov 2023 13:24:43 +0000 (UTC) Received: from rh.Home (unknown [10.39.194.169]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4F5B52166B27; Thu, 16 Nov 2023 13:24:42 +0000 (UTC) From: Kevin Traynor To: Jiawei Wang Cc: Ori Kam , dpdk stable Subject: patch 'net/mlx5: fix E-Switch mirror flow rule validation' has been queued to stable release 21.11.6 Date: Thu, 16 Nov 2023 13:23:14 +0000 Message-ID: <20231116132348.557257-32-ktraynor@redhat.com> In-Reply-To: <20231116132348.557257-1-ktraynor@redhat.com> References: <20231116132348.557257-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Hi, FYI, your patch has been queued to stable release 21.11.6 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 11/21/23. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable/commit/986d9d2fbb4950db6b47042210f6dbcd0083f2db Thanks. Kevin --- >From 986d9d2fbb4950db6b47042210f6dbcd0083f2db Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Wed, 11 Oct 2023 09:43:19 +0300 Subject: [PATCH] net/mlx5: fix E-Switch mirror flow rule validation [ upstream commit a8697f50f50f35b2078c78b2d9ea84f78a0f325e ] The port action and jump to flow table action are not supported in the mirror flows (RTE_FLOW_ACTION_TYPE_SAMPLE with sample ratio=1) in E-Switch domain (transfer attribute set) without presented encap action. The encap action is supported for uplink port only. So, if flow with mirroring contains encap action application should provide encap and uplink port actions in the mirror action list and PMD validates this condition (to make sure we cover the hardware limitation). This patch adds the validation for E-Switch mirror flow rule checking and rejects as invalid. Fixes: 6a951567c159 ("net/mlx5: support E-Switch mirroring and jump in one flow") Signed-off-by: Jiawei Wang Acked-by: Ori Kam --- doc/guides/nics/mlx5.rst | 8 ++- drivers/net/mlx5/mlx5_flow_dv.c | 93 +++++++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index 593a71cf9a..e2fb45b1db 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -427,6 +427,10 @@ Limitations - For NIC Rx flow, supports ``MARK``, ``COUNT``, ``QUEUE``, ``RSS`` in the sample actions list. - - For E-Switch mirroring flow, supports ``RAW ENCAP``, ``Port ID``, - ``VXLAN ENCAP``, ``NVGRE ENCAP`` in the sample actions list. + - For E-Switch mirroring flow, supports ``RAW_ENCAP``, ``PORT_ID``, + ``VXLAN_ENCAP``, ``NVGRE_ENCAP`` in the sample actions list. + - For E-Switch mirroring flow with sample ratio = 1, the ``ENCAP`` action + supports uplink port only. + - For E-Switch mirroring flow with sample ratio = 1, the ``PORT`` and ``JUMP`` actions + are not supported without presented ``ENCAP`` action in the sample actions list. - For ConnectX-5 trusted device, the application metadata with SET_TAG index 0 is not supported before ``RTE_FLOW_ACTION_TYPE_SAMPLE`` action. diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 535e0ea618..a5e1beb769 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -5554,4 +5554,5 @@ flow_dv_modify_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry) static int flow_dv_validate_action_sample(uint64_t *action_flags, + uint64_t *sub_action_flags, const struct rte_flow_action *action, struct rte_eth_dev *dev, @@ -5562,4 +5563,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, const struct rte_flow_action_count **count, int *fdb_mirror, + uint16_t *sample_port_id, struct rte_flow_error *error) { @@ -5567,6 +5569,6 @@ flow_dv_validate_action_sample(uint64_t *action_flags, struct mlx5_dev_config *dev_conf = &priv->config; const struct rte_flow_action_sample *sample = action->conf; + const struct rte_flow_action_port_id *port = NULL; const struct rte_flow_action *act; - uint64_t sub_action_flags = 0; uint16_t queue_index = 0xFFFF; int actions_n = 0; @@ -5614,5 +5616,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, case RTE_FLOW_ACTION_TYPE_QUEUE: ret = mlx5_flow_validate_action_queue(act, - sub_action_flags, + *sub_action_flags, dev, attr, error); @@ -5621,5 +5623,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, queue_index = ((const struct rte_flow_action_queue *) (act->conf))->index; - sub_action_flags |= MLX5_FLOW_ACTION_QUEUE; + *sub_action_flags |= MLX5_FLOW_ACTION_QUEUE; ++actions_n; break; @@ -5627,5 +5629,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, *sample_rss = act->conf; ret = mlx5_flow_validate_action_rss(act, - sub_action_flags, + *sub_action_flags, dev, attr, item_flags, @@ -5643,28 +5645,28 @@ flow_dv_validate_action_sample(uint64_t *action_flags, if (*sample_rss != NULL && (*sample_rss)->queue_num) queue_index = (*sample_rss)->queue[0]; - sub_action_flags |= MLX5_FLOW_ACTION_RSS; + *sub_action_flags |= MLX5_FLOW_ACTION_RSS; ++actions_n; break; case RTE_FLOW_ACTION_TYPE_MARK: ret = flow_dv_validate_action_mark(dev, act, - sub_action_flags, + *sub_action_flags, attr, error); if (ret < 0) return ret; if (dev_conf->dv_xmeta_en != MLX5_XMETA_MODE_LEGACY) - sub_action_flags |= MLX5_FLOW_ACTION_MARK | + *sub_action_flags |= MLX5_FLOW_ACTION_MARK | MLX5_FLOW_ACTION_MARK_EXT; else - sub_action_flags |= MLX5_FLOW_ACTION_MARK; + *sub_action_flags |= MLX5_FLOW_ACTION_MARK; ++actions_n; break; case RTE_FLOW_ACTION_TYPE_COUNT: ret = flow_dv_validate_action_count - (dev, false, *action_flags | sub_action_flags, + (dev, false, *action_flags | *sub_action_flags, attr, error); if (ret < 0) return ret; *count = act->conf; - sub_action_flags |= MLX5_FLOW_ACTION_COUNT; + *sub_action_flags |= MLX5_FLOW_ACTION_COUNT; *action_flags |= MLX5_FLOW_ACTION_COUNT; ++actions_n; @@ -5673,5 +5675,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: ret = flow_dv_validate_action_port_id(dev, - sub_action_flags, + *sub_action_flags, act, attr, @@ -5679,10 +5681,19 @@ flow_dv_validate_action_sample(uint64_t *action_flags, if (ret) return ret; - sub_action_flags |= MLX5_FLOW_ACTION_PORT_ID; + if (act->type == RTE_FLOW_ACTION_TYPE_PORT_ID) { + port = (const struct rte_flow_action_port_id *) + act->conf; + *sample_port_id = port->original ? + dev->data->port_id : port->id; + } else { + *sample_port_id = ((const struct rte_flow_action_ethdev *) + act->conf)->port_id; + } + *sub_action_flags |= MLX5_FLOW_ACTION_PORT_ID; ++actions_n; break; case RTE_FLOW_ACTION_TYPE_RAW_ENCAP: ret = flow_dv_validate_action_raw_encap_decap - (dev, NULL, act->conf, attr, &sub_action_flags, + (dev, NULL, act->conf, attr, sub_action_flags, &actions_n, action, item_flags, error); if (ret < 0) @@ -5693,10 +5704,10 @@ flow_dv_validate_action_sample(uint64_t *action_flags, case RTE_FLOW_ACTION_TYPE_NVGRE_ENCAP: ret = flow_dv_validate_action_l2_encap(dev, - sub_action_flags, + *sub_action_flags, act, attr, error); if (ret < 0) return ret; - sub_action_flags |= MLX5_FLOW_ACTION_ENCAP; + *sub_action_flags |= MLX5_FLOW_ACTION_ENCAP; ++actions_n; break; @@ -5710,5 +5721,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, } if (attr->ingress && !attr->transfer) { - if (!(sub_action_flags & (MLX5_FLOW_ACTION_QUEUE | + if (!(*sub_action_flags & (MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS))) return rte_flow_error_set(error, EINVAL, @@ -5732,15 +5743,15 @@ flow_dv_validate_action_sample(uint64_t *action_flags, "any optional action " "for sampling"); - if (sub_action_flags & MLX5_FLOW_ACTION_QUEUE) + if (*sub_action_flags & MLX5_FLOW_ACTION_QUEUE) return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "unsupported action QUEUE"); - if (sub_action_flags & MLX5_FLOW_ACTION_RSS) + if (*sub_action_flags & MLX5_FLOW_ACTION_RSS) return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "unsupported action QUEUE"); - if (!(sub_action_flags & MLX5_FLOW_ACTION_PORT_ID)) + if (!(*sub_action_flags & MLX5_FLOW_ACTION_PORT_ID)) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, @@ -5751,8 +5762,8 @@ flow_dv_validate_action_sample(uint64_t *action_flags, } /* Continue validation for Xcap actions.*/ - if ((sub_action_flags & MLX5_FLOW_XCAP_ACTIONS) && + if ((*sub_action_flags & MLX5_FLOW_XCAP_ACTIONS) && (queue_index == 0xFFFF || mlx5_rxq_get_type(dev, queue_index) != MLX5_RXQ_TYPE_HAIRPIN)) { - if ((sub_action_flags & MLX5_FLOW_XCAP_ACTIONS) == + if ((*sub_action_flags & MLX5_FLOW_XCAP_ACTIONS) == MLX5_FLOW_XCAP_ACTIONS) return rte_flow_error_set(error, ENOTSUP, @@ -5761,5 +5772,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, "combination aren't " "supported"); - if (!attr->transfer && attr->ingress && (sub_action_flags & + if (!attr->transfer && attr->ingress && (*sub_action_flags & MLX5_FLOW_ACTION_ENCAP)) return rte_flow_error_set(error, ENOTSUP, @@ -6870,7 +6881,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, const struct rte_flow_action_age *non_shared_age = NULL; const struct rte_flow_action_count *count = NULL; + const struct rte_flow_action_port_id *port = NULL; const struct mlx5_rte_flow_item_tag *mlx5_tag; struct mlx5_priv *act_priv = NULL; int aso_after_sample = 0; + struct mlx5_priv *port_priv = NULL; + uint64_t sub_action_flags = 0; + uint16_t sample_port_id = 0; + uint16_t port_id = 0; if (items == NULL) @@ -7279,4 +7295,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, if (ret) return ret; + if (type == RTE_FLOW_ACTION_TYPE_PORT_ID) { + port = (const struct rte_flow_action_port_id *) + actions->conf; + port_id = port->original ? dev->data->port_id : port->id; + } else { + port_id = ((const struct rte_flow_action_ethdev *) + actions->conf)->port_id; + } action_flags |= MLX5_FLOW_ACTION_PORT_ID; ++actions_n; @@ -7778,4 +7802,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, case RTE_FLOW_ACTION_TYPE_SAMPLE: ret = flow_dv_validate_action_sample(&action_flags, + &sub_action_flags, actions, dev, attr, item_flags, @@ -7783,4 +7808,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, &sample_count, &fdb_mirror, + &sample_port_id, error); if (ret < 0) @@ -8087,4 +8113,27 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "sample before ASO action is not supported"); + if (sub_action_flags & MLX5_FLOW_ACTION_PORT_ID) { + port_priv = mlx5_port_to_eswitch_info(sample_port_id, false); + if (flow_source_vport_representor(priv, port_priv)) { + if (sub_action_flags & MLX5_FLOW_ACTION_ENCAP) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "mirror to rep port with encap is not supported"); + } else { + if ((sub_action_flags & ~MLX5_FLOW_ACTION_ENCAP) && + (action_flags & MLX5_FLOW_ACTION_JUMP)) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "mirror to wire port without encap is not supported"); + } + } + if ((action_flags & MLX5_FLOW_ACTION_PORT_ID) && + (action_flags & MLX5_FLOW_ACTION_ENCAP)) { + port_priv = mlx5_port_to_eswitch_info(port_id, false); + if (flow_source_vport_representor(priv, port_priv)) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "mirror to rep port with encap is not supported"); + } } /* -- 2.41.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2023-11-16 13:21:53.326145511 +0000 +++ 0032-net-mlx5-fix-E-Switch-mirror-flow-rule-validation.patch 2023-11-16 13:21:52.482946468 +0000 @@ -1 +1 @@ -From a8697f50f50f35b2078c78b2d9ea84f78a0f325e Mon Sep 17 00:00:00 2001 +From 986d9d2fbb4950db6b47042210f6dbcd0083f2db Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit a8697f50f50f35b2078c78b2d9ea84f78a0f325e ] + @@ -20 +21,0 @@ -Cc: stable@dpdk.org @@ -30 +31 @@ -index 5d64ad8810..4b3680ab32 100644 +index 593a71cf9a..e2fb45b1db 100644 @@ -33 +34 @@ -@@ -544,6 +544,10 @@ Limitations +@@ -427,6 +427,10 @@ Limitations @@ -47 +48 @@ -index bdc8d0076a..80ad7cd206 100644 +index 535e0ea618..a5e1beb769 100644 @@ -50 +51 @@ -@@ -6036,4 +6036,5 @@ flow_dv_modify_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry) +@@ -5554,4 +5554,5 @@ flow_dv_modify_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry) @@ -56 +57 @@ -@@ -6044,4 +6045,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5562,4 +5563,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -60 +60,0 @@ - bool root, @@ -62,2 +62,3 @@ -@@ -6050,6 +6052,6 @@ flow_dv_validate_action_sample(uint64_t *action_flags, - struct mlx5_sh_config *dev_conf = &priv->sh->config; + { +@@ -5567,6 +5569,6 @@ flow_dv_validate_action_sample(uint64_t *action_flags, + struct mlx5_dev_config *dev_conf = &priv->config; @@ -70 +71 @@ -@@ -6098,5 +6100,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5614,5 +5616,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -77 +78 @@ -@@ -6105,5 +6107,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5621,5 +5623,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -84 +85 @@ -@@ -6111,5 +6113,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5627,5 +5629,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -91 +92 @@ -@@ -6127,28 +6129,28 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5643,28 +5645,28 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -118 +119 @@ - root, error); + attr, error); @@ -126 +127 @@ -@@ -6157,5 +6159,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5673,5 +5675,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -133 +134 @@ -@@ -6163,10 +6165,19 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5679,10 +5681,19 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -155 +156 @@ -@@ -6177,10 +6188,10 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5693,10 +5704,10 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -168 +169 @@ -@@ -6194,5 +6205,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5710,5 +5721,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -170 +171 @@ - if (attr->ingress) { + if (attr->ingress && !attr->transfer) { @@ -175 +176 @@ -@@ -6216,15 +6227,15 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5732,15 +5743,15 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -194 +195 @@ -@@ -6235,7 +6246,7 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5751,8 +5762,8 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -199 +200,2 @@ - (queue_index == 0xFFFF || !mlx5_rxq_is_hairpin(dev, queue_index))) { + (queue_index == 0xFFFF || + mlx5_rxq_get_type(dev, queue_index) != MLX5_RXQ_TYPE_HAIRPIN)) { @@ -204 +206 @@ -@@ -6244,5 +6255,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, +@@ -5761,5 +5772,5 @@ flow_dv_validate_action_sample(uint64_t *action_flags, @@ -207,2 +209,3 @@ -- if (attr->ingress && (sub_action_flags & MLX5_FLOW_ACTION_ENCAP)) -+ if (attr->ingress && (*sub_action_flags & MLX5_FLOW_ACTION_ENCAP)) +- if (!attr->transfer && attr->ingress && (sub_action_flags & ++ if (!attr->transfer && attr->ingress && (*sub_action_flags & + MLX5_FLOW_ACTION_ENCAP)) @@ -210,2 +213 @@ - RTE_FLOW_ERROR_TYPE_ACTION, -@@ -7399,7 +7410,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, +@@ -6870,7 +6881,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -224 +226 @@ -@@ -7871,4 +7887,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, +@@ -7279,4 +7295,12 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -237 +239 @@ -@@ -8370,4 +8394,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, +@@ -7778,4 +7802,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -243 +245 @@ -@@ -8375,4 +8400,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, +@@ -7783,4 +7808,5 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -247 +248,0 @@ - is_root, @@ -249 +250,2 @@ -@@ -8687,4 +8713,27 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, + if (ret < 0) +@@ -8087,4 +8113,27 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,