* [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field
@ 2018-11-13 6:00 Shahaf Shuler
2018-11-13 8:03 ` Shahaf Shuler
0 siblings, 1 reply; 4+ messages in thread
From: Shahaf Shuler @ 2018-11-13 6:00 UTC (permalink / raw)
To: shahafs; +Cc: dev, Yongseok Koh, orika
From: Yongseok Koh <yskoh@mellanox.com>
As mlx5_flow_hashfields_adjust() refers to flow->rss, actions must be
translated prior to items like in Verbs. Otherwise, hash fields are not
correctly set.
Fixes: d02cb0691299 ("net/mlx5: add Direct Verbs translate actions")
Cc: orika@mellanox.com
Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---
drivers/net/mlx5/mlx5_flow_dv.c | 221 ++++++++++++++++++++--------------------
1 file changed, 111 insertions(+), 110 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index f5a3eded45..a2edd168e4 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -1797,116 +1797,6 @@ flow_dv_translate(struct rte_eth_dev *dev,
if (priority == MLX5_FLOW_PRIO_RSVD)
priority = priv->config.flow_prio - 1;
- for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
- int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
- void *match_mask = matcher.mask.buf;
- void *match_value = dev_flow->dv.value.buf;
-
- switch (items->type) {
- case RTE_FLOW_ITEM_TYPE_ETH:
- flow_dv_translate_item_eth(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L2;
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
- MLX5_FLOW_LAYER_OUTER_L2;
- break;
- case RTE_FLOW_ITEM_TYPE_VLAN:
- flow_dv_translate_item_vlan(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L2;
- item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
- MLX5_FLOW_LAYER_INNER_VLAN) :
- (MLX5_FLOW_LAYER_OUTER_L2 |
- MLX5_FLOW_LAYER_OUTER_VLAN);
- break;
- case RTE_FLOW_ITEM_TYPE_IPV4:
- flow_dv_translate_item_ipv4(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L3;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel,
- MLX5_IPV4_LAYER_TYPES,
- MLX5_IPV4_IBV_RX_HASH);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
- MLX5_FLOW_LAYER_OUTER_L3_IPV4;
- break;
- case RTE_FLOW_ITEM_TYPE_IPV6:
- flow_dv_translate_item_ipv6(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L3;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel,
- MLX5_IPV6_LAYER_TYPES,
- MLX5_IPV6_IBV_RX_HASH);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
- MLX5_FLOW_LAYER_OUTER_L3_IPV6;
- break;
- case RTE_FLOW_ITEM_TYPE_TCP:
- flow_dv_translate_item_tcp(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L4;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel, ETH_RSS_TCP,
- IBV_RX_HASH_SRC_PORT_TCP |
- IBV_RX_HASH_DST_PORT_TCP);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
- MLX5_FLOW_LAYER_OUTER_L4_TCP;
- break;
- case RTE_FLOW_ITEM_TYPE_UDP:
- flow_dv_translate_item_udp(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L4;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel, ETH_RSS_UDP,
- IBV_RX_HASH_SRC_PORT_UDP |
- IBV_RX_HASH_DST_PORT_UDP);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
- MLX5_FLOW_LAYER_OUTER_L4_UDP;
- break;
- case RTE_FLOW_ITEM_TYPE_GRE:
- flow_dv_translate_item_gre(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_GRE;
- break;
- case RTE_FLOW_ITEM_TYPE_NVGRE:
- flow_dv_translate_item_nvgre(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_GRE;
- break;
- case RTE_FLOW_ITEM_TYPE_VXLAN:
- flow_dv_translate_item_vxlan(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_VXLAN;
- break;
- case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
- flow_dv_translate_item_vxlan(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
- break;
- case RTE_FLOW_ITEM_TYPE_META:
- flow_dv_translate_item_meta(match_mask, match_value,
- items);
- item_flags |= MLX5_FLOW_ITEM_METADATA;
- break;
- default:
- break;
- }
- }
- assert(!flow_dv_check_valid_spec(matcher.mask.buf,
- dev_flow->dv.value.buf));
- dev_flow->layers = item_flags;
- /* Register matcher. */
- matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
- matcher.mask.size);
- matcher.priority = mlx5_flow_adjust_priority(dev, priority,
- matcher.priority);
- matcher.egress = attr->egress;
- if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
- return -rte_errno;
for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
const struct rte_flow_action_queue *queue;
const struct rte_flow_action_rss *rss;
@@ -2040,6 +1930,116 @@ flow_dv_translate(struct rte_eth_dev *dev,
}
dev_flow->dv.actions_n = actions_n;
flow->actions = action_flags;
+ for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
+ int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
+ void *match_mask = matcher.mask.buf;
+ void *match_value = dev_flow->dv.value.buf;
+
+ switch (items->type) {
+ case RTE_FLOW_ITEM_TYPE_ETH:
+ flow_dv_translate_item_eth(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L2;
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
+ MLX5_FLOW_LAYER_OUTER_L2;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VLAN:
+ flow_dv_translate_item_vlan(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L2;
+ item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
+ MLX5_FLOW_LAYER_INNER_VLAN) :
+ (MLX5_FLOW_LAYER_OUTER_L2 |
+ MLX5_FLOW_LAYER_OUTER_VLAN);
+ break;
+ case RTE_FLOW_ITEM_TYPE_IPV4:
+ flow_dv_translate_item_ipv4(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L3;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel,
+ MLX5_IPV4_LAYER_TYPES,
+ MLX5_IPV4_IBV_RX_HASH);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
+ MLX5_FLOW_LAYER_OUTER_L3_IPV4;
+ break;
+ case RTE_FLOW_ITEM_TYPE_IPV6:
+ flow_dv_translate_item_ipv6(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L3;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel,
+ MLX5_IPV6_LAYER_TYPES,
+ MLX5_IPV6_IBV_RX_HASH);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
+ MLX5_FLOW_LAYER_OUTER_L3_IPV6;
+ break;
+ case RTE_FLOW_ITEM_TYPE_TCP:
+ flow_dv_translate_item_tcp(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L4;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel, ETH_RSS_TCP,
+ IBV_RX_HASH_SRC_PORT_TCP |
+ IBV_RX_HASH_DST_PORT_TCP);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
+ MLX5_FLOW_LAYER_OUTER_L4_TCP;
+ break;
+ case RTE_FLOW_ITEM_TYPE_UDP:
+ flow_dv_translate_item_udp(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L4;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel, ETH_RSS_UDP,
+ IBV_RX_HASH_SRC_PORT_UDP |
+ IBV_RX_HASH_DST_PORT_UDP);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
+ MLX5_FLOW_LAYER_OUTER_L4_UDP;
+ break;
+ case RTE_FLOW_ITEM_TYPE_GRE:
+ flow_dv_translate_item_gre(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_GRE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_NVGRE:
+ flow_dv_translate_item_nvgre(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_GRE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VXLAN:
+ flow_dv_translate_item_vxlan(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_VXLAN;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
+ flow_dv_translate_item_vxlan(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_META:
+ flow_dv_translate_item_meta(match_mask, match_value,
+ items);
+ item_flags |= MLX5_FLOW_ITEM_METADATA;
+ break;
+ default:
+ break;
+ }
+ }
+ assert(!flow_dv_check_valid_spec(matcher.mask.buf,
+ dev_flow->dv.value.buf));
+ dev_flow->layers = item_flags;
+ /* Register matcher. */
+ matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
+ matcher.mask.size);
+ matcher.priority = mlx5_flow_adjust_priority(dev, priority,
+ matcher.priority);
+ matcher.egress = attr->egress;
+ if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
+ return -rte_errno;
return 0;
}
@@ -2083,6 +2083,7 @@ flow_dv_apply(struct rte_eth_dev *dev, struct rte_flow *flow,
} else if (flow->actions &
(MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS)) {
struct mlx5_hrxq *hrxq;
+
hrxq = mlx5_hrxq_get(dev, flow->key,
MLX5_RSS_HASH_KEY_LEN,
dv->hash_fields,
--
2.12.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field
2018-11-13 6:00 [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field Shahaf Shuler
@ 2018-11-13 8:03 ` Shahaf Shuler
0 siblings, 0 replies; 4+ messages in thread
From: Shahaf Shuler @ 2018-11-13 8:03 UTC (permalink / raw)
To: Shahaf Shuler; +Cc: dev, Yongseok Koh, Ori Kam
Tuesday, November 13, 2018 8:00 AM, Shahaf Shuler:
> Subject: [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field
>
> From: Yongseok Koh <yskoh@mellanox.com>
>
> As mlx5_flow_hashfields_adjust() refers to flow->rss, actions must be
> translated prior to items like in Verbs. Otherwise, hash fields are not correctly
> set.
>
> Fixes: d02cb0691299 ("net/mlx5: add Direct Verbs translate actions")
> Cc: orika@mellanox.com
>
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Applied to next-net-mlx, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field
2018-11-13 7:32 Yongseok Koh
@ 2018-11-13 7:40 ` Yongseok Koh
0 siblings, 0 replies; 4+ messages in thread
From: Yongseok Koh @ 2018-11-13 7:40 UTC (permalink / raw)
To: Shahaf Shuler; +Cc: dev, Ori Kam
Please disregard this email.
Shahaf already sent it on my behalf.
Thanks,
Yongseok
> On Nov 12, 2018, at 11:32 PM, Yongseok Koh <yskoh@mellanox.com> wrote:
>
> As mlx5_flow_hashfields_adjust() refers to flow->rss, actions must be
> translated prior to items like in Verbs. Otherwise, hash fields are not
> correctly set.
>
> Fixes: d02cb0691299 ("net/mlx5: add Direct Verbs translate actions")
> Cc: orika@mellanox.com
>
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> drivers/net/mlx5/mlx5_flow_dv.c | 221 ++++++++++++++++++++--------------------
> 1 file changed, 111 insertions(+), 110 deletions(-)
>
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
> index f5a3eded45..a2edd168e4 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -1797,116 +1797,6 @@ flow_dv_translate(struct rte_eth_dev *dev,
>
> if (priority == MLX5_FLOW_PRIO_RSVD)
> priority = priv->config.flow_prio - 1;
> - for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
> - int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
> - void *match_mask = matcher.mask.buf;
> - void *match_value = dev_flow->dv.value.buf;
> -
> - switch (items->type) {
> - case RTE_FLOW_ITEM_TYPE_ETH:
> - flow_dv_translate_item_eth(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L2;
> - item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
> - MLX5_FLOW_LAYER_OUTER_L2;
> - break;
> - case RTE_FLOW_ITEM_TYPE_VLAN:
> - flow_dv_translate_item_vlan(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L2;
> - item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
> - MLX5_FLOW_LAYER_INNER_VLAN) :
> - (MLX5_FLOW_LAYER_OUTER_L2 |
> - MLX5_FLOW_LAYER_OUTER_VLAN);
> - break;
> - case RTE_FLOW_ITEM_TYPE_IPV4:
> - flow_dv_translate_item_ipv4(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L3;
> - dev_flow->dv.hash_fields |=
> - mlx5_flow_hashfields_adjust
> - (dev_flow, tunnel,
> - MLX5_IPV4_LAYER_TYPES,
> - MLX5_IPV4_IBV_RX_HASH);
> - item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
> - MLX5_FLOW_LAYER_OUTER_L3_IPV4;
> - break;
> - case RTE_FLOW_ITEM_TYPE_IPV6:
> - flow_dv_translate_item_ipv6(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L3;
> - dev_flow->dv.hash_fields |=
> - mlx5_flow_hashfields_adjust
> - (dev_flow, tunnel,
> - MLX5_IPV6_LAYER_TYPES,
> - MLX5_IPV6_IBV_RX_HASH);
> - item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
> - MLX5_FLOW_LAYER_OUTER_L3_IPV6;
> - break;
> - case RTE_FLOW_ITEM_TYPE_TCP:
> - flow_dv_translate_item_tcp(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L4;
> - dev_flow->dv.hash_fields |=
> - mlx5_flow_hashfields_adjust
> - (dev_flow, tunnel, ETH_RSS_TCP,
> - IBV_RX_HASH_SRC_PORT_TCP |
> - IBV_RX_HASH_DST_PORT_TCP);
> - item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
> - MLX5_FLOW_LAYER_OUTER_L4_TCP;
> - break;
> - case RTE_FLOW_ITEM_TYPE_UDP:
> - flow_dv_translate_item_udp(match_mask, match_value,
> - items, tunnel);
> - matcher.priority = MLX5_PRIORITY_MAP_L4;
> - dev_flow->dv.hash_fields |=
> - mlx5_flow_hashfields_adjust
> - (dev_flow, tunnel, ETH_RSS_UDP,
> - IBV_RX_HASH_SRC_PORT_UDP |
> - IBV_RX_HASH_DST_PORT_UDP);
> - item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
> - MLX5_FLOW_LAYER_OUTER_L4_UDP;
> - break;
> - case RTE_FLOW_ITEM_TYPE_GRE:
> - flow_dv_translate_item_gre(match_mask, match_value,
> - items, tunnel);
> - item_flags |= MLX5_FLOW_LAYER_GRE;
> - break;
> - case RTE_FLOW_ITEM_TYPE_NVGRE:
> - flow_dv_translate_item_nvgre(match_mask, match_value,
> - items, tunnel);
> - item_flags |= MLX5_FLOW_LAYER_GRE;
> - break;
> - case RTE_FLOW_ITEM_TYPE_VXLAN:
> - flow_dv_translate_item_vxlan(match_mask, match_value,
> - items, tunnel);
> - item_flags |= MLX5_FLOW_LAYER_VXLAN;
> - break;
> - case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
> - flow_dv_translate_item_vxlan(match_mask, match_value,
> - items, tunnel);
> - item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
> - break;
> - case RTE_FLOW_ITEM_TYPE_META:
> - flow_dv_translate_item_meta(match_mask, match_value,
> - items);
> - item_flags |= MLX5_FLOW_ITEM_METADATA;
> - break;
> - default:
> - break;
> - }
> - }
> - assert(!flow_dv_check_valid_spec(matcher.mask.buf,
> - dev_flow->dv.value.buf));
> - dev_flow->layers = item_flags;
> - /* Register matcher. */
> - matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
> - matcher.mask.size);
> - matcher.priority = mlx5_flow_adjust_priority(dev, priority,
> - matcher.priority);
> - matcher.egress = attr->egress;
> - if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
> - return -rte_errno;
> for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> const struct rte_flow_action_queue *queue;
> const struct rte_flow_action_rss *rss;
> @@ -2040,6 +1930,116 @@ flow_dv_translate(struct rte_eth_dev *dev,
> }
> dev_flow->dv.actions_n = actions_n;
> flow->actions = action_flags;
> + for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
> + int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
> + void *match_mask = matcher.mask.buf;
> + void *match_value = dev_flow->dv.value.buf;
> +
> + switch (items->type) {
> + case RTE_FLOW_ITEM_TYPE_ETH:
> + flow_dv_translate_item_eth(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L2;
> + item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
> + MLX5_FLOW_LAYER_OUTER_L2;
> + break;
> + case RTE_FLOW_ITEM_TYPE_VLAN:
> + flow_dv_translate_item_vlan(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L2;
> + item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
> + MLX5_FLOW_LAYER_INNER_VLAN) :
> + (MLX5_FLOW_LAYER_OUTER_L2 |
> + MLX5_FLOW_LAYER_OUTER_VLAN);
> + break;
> + case RTE_FLOW_ITEM_TYPE_IPV4:
> + flow_dv_translate_item_ipv4(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L3;
> + dev_flow->dv.hash_fields |=
> + mlx5_flow_hashfields_adjust
> + (dev_flow, tunnel,
> + MLX5_IPV4_LAYER_TYPES,
> + MLX5_IPV4_IBV_RX_HASH);
> + item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
> + MLX5_FLOW_LAYER_OUTER_L3_IPV4;
> + break;
> + case RTE_FLOW_ITEM_TYPE_IPV6:
> + flow_dv_translate_item_ipv6(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L3;
> + dev_flow->dv.hash_fields |=
> + mlx5_flow_hashfields_adjust
> + (dev_flow, tunnel,
> + MLX5_IPV6_LAYER_TYPES,
> + MLX5_IPV6_IBV_RX_HASH);
> + item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
> + MLX5_FLOW_LAYER_OUTER_L3_IPV6;
> + break;
> + case RTE_FLOW_ITEM_TYPE_TCP:
> + flow_dv_translate_item_tcp(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L4;
> + dev_flow->dv.hash_fields |=
> + mlx5_flow_hashfields_adjust
> + (dev_flow, tunnel, ETH_RSS_TCP,
> + IBV_RX_HASH_SRC_PORT_TCP |
> + IBV_RX_HASH_DST_PORT_TCP);
> + item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
> + MLX5_FLOW_LAYER_OUTER_L4_TCP;
> + break;
> + case RTE_FLOW_ITEM_TYPE_UDP:
> + flow_dv_translate_item_udp(match_mask, match_value,
> + items, tunnel);
> + matcher.priority = MLX5_PRIORITY_MAP_L4;
> + dev_flow->dv.hash_fields |=
> + mlx5_flow_hashfields_adjust
> + (dev_flow, tunnel, ETH_RSS_UDP,
> + IBV_RX_HASH_SRC_PORT_UDP |
> + IBV_RX_HASH_DST_PORT_UDP);
> + item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
> + MLX5_FLOW_LAYER_OUTER_L4_UDP;
> + break;
> + case RTE_FLOW_ITEM_TYPE_GRE:
> + flow_dv_translate_item_gre(match_mask, match_value,
> + items, tunnel);
> + item_flags |= MLX5_FLOW_LAYER_GRE;
> + break;
> + case RTE_FLOW_ITEM_TYPE_NVGRE:
> + flow_dv_translate_item_nvgre(match_mask, match_value,
> + items, tunnel);
> + item_flags |= MLX5_FLOW_LAYER_GRE;
> + break;
> + case RTE_FLOW_ITEM_TYPE_VXLAN:
> + flow_dv_translate_item_vxlan(match_mask, match_value,
> + items, tunnel);
> + item_flags |= MLX5_FLOW_LAYER_VXLAN;
> + break;
> + case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
> + flow_dv_translate_item_vxlan(match_mask, match_value,
> + items, tunnel);
> + item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
> + break;
> + case RTE_FLOW_ITEM_TYPE_META:
> + flow_dv_translate_item_meta(match_mask, match_value,
> + items);
> + item_flags |= MLX5_FLOW_ITEM_METADATA;
> + break;
> + default:
> + break;
> + }
> + }
> + assert(!flow_dv_check_valid_spec(matcher.mask.buf,
> + dev_flow->dv.value.buf));
> + dev_flow->layers = item_flags;
> + /* Register matcher. */
> + matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
> + matcher.mask.size);
> + matcher.priority = mlx5_flow_adjust_priority(dev, priority,
> + matcher.priority);
> + matcher.egress = attr->egress;
> + if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
> + return -rte_errno;
> return 0;
> }
>
> @@ -2083,6 +2083,7 @@ flow_dv_apply(struct rte_eth_dev *dev, struct rte_flow *flow,
> } else if (flow->actions &
> (MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS)) {
> struct mlx5_hrxq *hrxq;
> +
> hrxq = mlx5_hrxq_get(dev, flow->key,
> MLX5_RSS_HASH_KEY_LEN,
> dv->hash_fields,
> --
> 2.11.0
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field
@ 2018-11-13 7:32 Yongseok Koh
2018-11-13 7:40 ` Yongseok Koh
0 siblings, 1 reply; 4+ messages in thread
From: Yongseok Koh @ 2018-11-13 7:32 UTC (permalink / raw)
To: Shahaf Shuler; +Cc: dev, Yongseok Koh, Ori Kam
As mlx5_flow_hashfields_adjust() refers to flow->rss, actions must be
translated prior to items like in Verbs. Otherwise, hash fields are not
correctly set.
Fixes: d02cb0691299 ("net/mlx5: add Direct Verbs translate actions")
Cc: orika@mellanox.com
Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---
drivers/net/mlx5/mlx5_flow_dv.c | 221 ++++++++++++++++++++--------------------
1 file changed, 111 insertions(+), 110 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index f5a3eded45..a2edd168e4 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -1797,116 +1797,6 @@ flow_dv_translate(struct rte_eth_dev *dev,
if (priority == MLX5_FLOW_PRIO_RSVD)
priority = priv->config.flow_prio - 1;
- for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
- int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
- void *match_mask = matcher.mask.buf;
- void *match_value = dev_flow->dv.value.buf;
-
- switch (items->type) {
- case RTE_FLOW_ITEM_TYPE_ETH:
- flow_dv_translate_item_eth(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L2;
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
- MLX5_FLOW_LAYER_OUTER_L2;
- break;
- case RTE_FLOW_ITEM_TYPE_VLAN:
- flow_dv_translate_item_vlan(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L2;
- item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
- MLX5_FLOW_LAYER_INNER_VLAN) :
- (MLX5_FLOW_LAYER_OUTER_L2 |
- MLX5_FLOW_LAYER_OUTER_VLAN);
- break;
- case RTE_FLOW_ITEM_TYPE_IPV4:
- flow_dv_translate_item_ipv4(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L3;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel,
- MLX5_IPV4_LAYER_TYPES,
- MLX5_IPV4_IBV_RX_HASH);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
- MLX5_FLOW_LAYER_OUTER_L3_IPV4;
- break;
- case RTE_FLOW_ITEM_TYPE_IPV6:
- flow_dv_translate_item_ipv6(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L3;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel,
- MLX5_IPV6_LAYER_TYPES,
- MLX5_IPV6_IBV_RX_HASH);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
- MLX5_FLOW_LAYER_OUTER_L3_IPV6;
- break;
- case RTE_FLOW_ITEM_TYPE_TCP:
- flow_dv_translate_item_tcp(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L4;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel, ETH_RSS_TCP,
- IBV_RX_HASH_SRC_PORT_TCP |
- IBV_RX_HASH_DST_PORT_TCP);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
- MLX5_FLOW_LAYER_OUTER_L4_TCP;
- break;
- case RTE_FLOW_ITEM_TYPE_UDP:
- flow_dv_translate_item_udp(match_mask, match_value,
- items, tunnel);
- matcher.priority = MLX5_PRIORITY_MAP_L4;
- dev_flow->dv.hash_fields |=
- mlx5_flow_hashfields_adjust
- (dev_flow, tunnel, ETH_RSS_UDP,
- IBV_RX_HASH_SRC_PORT_UDP |
- IBV_RX_HASH_DST_PORT_UDP);
- item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
- MLX5_FLOW_LAYER_OUTER_L4_UDP;
- break;
- case RTE_FLOW_ITEM_TYPE_GRE:
- flow_dv_translate_item_gre(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_GRE;
- break;
- case RTE_FLOW_ITEM_TYPE_NVGRE:
- flow_dv_translate_item_nvgre(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_GRE;
- break;
- case RTE_FLOW_ITEM_TYPE_VXLAN:
- flow_dv_translate_item_vxlan(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_VXLAN;
- break;
- case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
- flow_dv_translate_item_vxlan(match_mask, match_value,
- items, tunnel);
- item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
- break;
- case RTE_FLOW_ITEM_TYPE_META:
- flow_dv_translate_item_meta(match_mask, match_value,
- items);
- item_flags |= MLX5_FLOW_ITEM_METADATA;
- break;
- default:
- break;
- }
- }
- assert(!flow_dv_check_valid_spec(matcher.mask.buf,
- dev_flow->dv.value.buf));
- dev_flow->layers = item_flags;
- /* Register matcher. */
- matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
- matcher.mask.size);
- matcher.priority = mlx5_flow_adjust_priority(dev, priority,
- matcher.priority);
- matcher.egress = attr->egress;
- if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
- return -rte_errno;
for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
const struct rte_flow_action_queue *queue;
const struct rte_flow_action_rss *rss;
@@ -2040,6 +1930,116 @@ flow_dv_translate(struct rte_eth_dev *dev,
}
dev_flow->dv.actions_n = actions_n;
flow->actions = action_flags;
+ for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
+ int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
+ void *match_mask = matcher.mask.buf;
+ void *match_value = dev_flow->dv.value.buf;
+
+ switch (items->type) {
+ case RTE_FLOW_ITEM_TYPE_ETH:
+ flow_dv_translate_item_eth(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L2;
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
+ MLX5_FLOW_LAYER_OUTER_L2;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VLAN:
+ flow_dv_translate_item_vlan(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L2;
+ item_flags |= tunnel ? (MLX5_FLOW_LAYER_INNER_L2 |
+ MLX5_FLOW_LAYER_INNER_VLAN) :
+ (MLX5_FLOW_LAYER_OUTER_L2 |
+ MLX5_FLOW_LAYER_OUTER_VLAN);
+ break;
+ case RTE_FLOW_ITEM_TYPE_IPV4:
+ flow_dv_translate_item_ipv4(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L3;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel,
+ MLX5_IPV4_LAYER_TYPES,
+ MLX5_IPV4_IBV_RX_HASH);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
+ MLX5_FLOW_LAYER_OUTER_L3_IPV4;
+ break;
+ case RTE_FLOW_ITEM_TYPE_IPV6:
+ flow_dv_translate_item_ipv6(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L3;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel,
+ MLX5_IPV6_LAYER_TYPES,
+ MLX5_IPV6_IBV_RX_HASH);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :
+ MLX5_FLOW_LAYER_OUTER_L3_IPV6;
+ break;
+ case RTE_FLOW_ITEM_TYPE_TCP:
+ flow_dv_translate_item_tcp(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L4;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel, ETH_RSS_TCP,
+ IBV_RX_HASH_SRC_PORT_TCP |
+ IBV_RX_HASH_DST_PORT_TCP);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :
+ MLX5_FLOW_LAYER_OUTER_L4_TCP;
+ break;
+ case RTE_FLOW_ITEM_TYPE_UDP:
+ flow_dv_translate_item_udp(match_mask, match_value,
+ items, tunnel);
+ matcher.priority = MLX5_PRIORITY_MAP_L4;
+ dev_flow->dv.hash_fields |=
+ mlx5_flow_hashfields_adjust
+ (dev_flow, tunnel, ETH_RSS_UDP,
+ IBV_RX_HASH_SRC_PORT_UDP |
+ IBV_RX_HASH_DST_PORT_UDP);
+ item_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :
+ MLX5_FLOW_LAYER_OUTER_L4_UDP;
+ break;
+ case RTE_FLOW_ITEM_TYPE_GRE:
+ flow_dv_translate_item_gre(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_GRE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_NVGRE:
+ flow_dv_translate_item_nvgre(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_GRE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VXLAN:
+ flow_dv_translate_item_vxlan(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_VXLAN;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
+ flow_dv_translate_item_vxlan(match_mask, match_value,
+ items, tunnel);
+ item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
+ break;
+ case RTE_FLOW_ITEM_TYPE_META:
+ flow_dv_translate_item_meta(match_mask, match_value,
+ items);
+ item_flags |= MLX5_FLOW_ITEM_METADATA;
+ break;
+ default:
+ break;
+ }
+ }
+ assert(!flow_dv_check_valid_spec(matcher.mask.buf,
+ dev_flow->dv.value.buf));
+ dev_flow->layers = item_flags;
+ /* Register matcher. */
+ matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
+ matcher.mask.size);
+ matcher.priority = mlx5_flow_adjust_priority(dev, priority,
+ matcher.priority);
+ matcher.egress = attr->egress;
+ if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
+ return -rte_errno;
return 0;
}
@@ -2083,6 +2083,7 @@ flow_dv_apply(struct rte_eth_dev *dev, struct rte_flow *flow,
} else if (flow->actions &
(MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS)) {
struct mlx5_hrxq *hrxq;
+
hrxq = mlx5_hrxq_get(dev, flow->key,
MLX5_RSS_HASH_KEY_LEN,
dv->hash_fields,
--
2.11.0
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-11-13 8:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-13 6:00 [dpdk-dev] [PATCH] net/mlx5: fix Direct Verbs RSS hash field Shahaf Shuler
2018-11-13 8:03 ` Shahaf Shuler
2018-11-13 7:32 Yongseok Koh
2018-11-13 7:40 ` Yongseok Koh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).