net/mlx5: fix Tx metadata for multi-segment packet

Original patch implemented the use of match_metadata offload in the
different burst functions.
The concurrent use of match_metadata and multi_segs offloads was
not handled.

This patch updates function txq_scatter_v(), to pass metadata value
from mbuf to wqe, when indicated by offload flags.

Fixes: 6bd7fbd03c62 ("net/mlx5: support metadata as flow rule criteria")
Cc: stable@dpdk.org

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Acked-by: Yongseok Koh <yskoh@mellanox.com>
This commit is contained in:
Dekel Peled 2019-01-30 08:43:29 +02:00 committed by Ferruh Yigit
parent b13baac8d5
commit 7f4019d370
2 changed files with 17 additions and 6 deletions

View File

@ -104,6 +104,8 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
sizeof(struct mlx5_wqe) / MLX5_WQE_DWORD_SIZE;
unsigned int n;
volatile struct mlx5_wqe *wqe = NULL;
bool metadata_ol =
txq->offloads & DEV_TX_OFFLOAD_MATCH_METADATA ? true : false;
assert(elts_n > pkts_n);
mlx5_tx_complete(txq);
@ -127,6 +129,9 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
uint8x16_t *t_wqe;
uint8_t *dseg;
uint8x16_t ctrl;
rte_be32_t metadata =
metadata_ol && (buf->ol_flags & PKT_TX_METADATA) ?
buf->tx_metadata : 0;
assert(segs_n);
max_elts = elts_n - (elts_head - txq->elts_tail);
@ -164,9 +169,10 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
ctrl = vqtbl1q_u8(ctrl, ctrl_shuf_m);
vst1q_u8((void *)t_wqe, ctrl);
/* Fill ESEG in the header. */
vst1q_u16((void *)(t_wqe + 1),
((uint16x8_t) { 0, 0, cs_flags, rte_cpu_to_be_16(len),
0, 0, 0, 0 }));
vst1q_u32((void *)(t_wqe + 1),
((uint32x4_t){ 0,
cs_flags << 16 | rte_cpu_to_be_16(len),
metadata, 0 }));
txq->wqe_ci = wqe_ci;
}
if (!n)

View File

@ -104,6 +104,8 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
sizeof(struct mlx5_wqe) / MLX5_WQE_DWORD_SIZE;
unsigned int n;
volatile struct mlx5_wqe *wqe = NULL;
bool metadata_ol =
txq->offloads & DEV_TX_OFFLOAD_MATCH_METADATA ? true : false;
assert(elts_n > pkts_n);
mlx5_tx_complete(txq);
@ -125,6 +127,9 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
uint16_t max_wqe;
__m128i *t_wqe, *dseg;
__m128i ctrl;
rte_be32_t metadata =
metadata_ol && (buf->ol_flags & PKT_TX_METADATA) ?
buf->tx_metadata : 0;
assert(segs_n);
max_elts = elts_n - (elts_head - txq->elts_tail);
@ -165,9 +170,9 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
_mm_store_si128(t_wqe, ctrl);
/* Fill ESEG in the header. */
_mm_store_si128(t_wqe + 1,
_mm_set_epi16(0, 0, 0, 0,
rte_cpu_to_be_16(len), cs_flags,
0, 0));
_mm_set_epi32(0, metadata,
(rte_cpu_to_be_16(len) << 16) |
cs_flags, 0));
txq->wqe_ci = wqe_ci;
}
if (!n)