net/mlx5: add missing sanity checks for Tx completion queue
Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
This commit is contained in:
parent
36aa55ea57
commit
2eefbec531
@ -357,6 +357,8 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
|||||||
/* Start processing. */
|
/* Start processing. */
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
||||||
if (unlikely(!max_wqe))
|
if (unlikely(!max_wqe))
|
||||||
return 0;
|
return 0;
|
||||||
@ -700,6 +702,9 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
|||||||
/* Save elts_head in unused "immediate" field of WQE. */
|
/* Save elts_head in unused "immediate" field of WQE. */
|
||||||
last_wqe->ctrl3 = txq->elts_head;
|
last_wqe->ctrl3 = txq->elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
txq->elts_comp = comp;
|
txq->elts_comp = comp;
|
||||||
}
|
}
|
||||||
@ -818,6 +823,8 @@ mlx5_tx_burst_mpw(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
|||||||
/* Start processing. */
|
/* Start processing. */
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
||||||
if (unlikely(!max_wqe))
|
if (unlikely(!max_wqe))
|
||||||
return 0;
|
return 0;
|
||||||
@ -911,6 +918,9 @@ mlx5_tx_burst_mpw(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
|||||||
/* Save elts_head in unused "immediate" field of WQE. */
|
/* Save elts_head in unused "immediate" field of WQE. */
|
||||||
wqe->ctrl[3] = elts_head;
|
wqe->ctrl[3] = elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
txq->elts_comp = comp;
|
txq->elts_comp = comp;
|
||||||
}
|
}
|
||||||
@ -1042,6 +1052,8 @@ mlx5_tx_burst_mpw_inline(void *dpdk_txq, struct rte_mbuf **pkts,
|
|||||||
/* Start processing. */
|
/* Start processing. */
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
do {
|
do {
|
||||||
struct rte_mbuf *buf = *(pkts++);
|
struct rte_mbuf *buf = *(pkts++);
|
||||||
uintptr_t addr;
|
uintptr_t addr;
|
||||||
@ -1203,6 +1215,9 @@ mlx5_tx_burst_mpw_inline(void *dpdk_txq, struct rte_mbuf **pkts,
|
|||||||
/* Save elts_head in unused "immediate" field of WQE. */
|
/* Save elts_head in unused "immediate" field of WQE. */
|
||||||
wqe->ctrl[3] = elts_head;
|
wqe->ctrl[3] = elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
txq->elts_comp = comp;
|
txq->elts_comp = comp;
|
||||||
}
|
}
|
||||||
@ -1549,7 +1564,9 @@ mlx5_tx_burst_empw(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
|||||||
wqe->ctrl[3] = elts_head;
|
wqe->ctrl[3] = elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
txq->mpw_comp = txq->wqe_ci;
|
txq->mpw_comp = txq->wqe_ci;
|
||||||
txq->cq_pi++;
|
#ifndef NDEBUG
|
||||||
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
txq->elts_comp += j;
|
txq->elts_comp += j;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,9 @@ struct mlx5_txq_data {
|
|||||||
uint16_t elts_comp; /* Counter since last completion request. */
|
uint16_t elts_comp; /* Counter since last completion request. */
|
||||||
uint16_t mpw_comp; /* WQ index since last completion request. */
|
uint16_t mpw_comp; /* WQ index since last completion request. */
|
||||||
uint16_t cq_ci; /* Consumer index for completion queue. */
|
uint16_t cq_ci; /* Consumer index for completion queue. */
|
||||||
|
#ifndef NDEBUG
|
||||||
uint16_t cq_pi; /* Producer index for completion queue. */
|
uint16_t cq_pi; /* Producer index for completion queue. */
|
||||||
|
#endif
|
||||||
uint16_t wqe_ci; /* Consumer index for work queue. */
|
uint16_t wqe_ci; /* Consumer index for work queue. */
|
||||||
uint16_t wqe_pi; /* Producer index for work queue. */
|
uint16_t wqe_pi; /* Producer index for work queue. */
|
||||||
uint16_t elts_n:4; /* (*elts)[] length (in log2). */
|
uint16_t elts_n:4; /* (*elts)[] length (in log2). */
|
||||||
|
@ -135,6 +135,8 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
|
|||||||
|
|
||||||
assert(elts_n > pkts_n);
|
assert(elts_n > pkts_n);
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
if (unlikely(!pkts_n))
|
if (unlikely(!pkts_n))
|
||||||
return 0;
|
return 0;
|
||||||
for (n = 0; n < pkts_n; ++n) {
|
for (n = 0; n < pkts_n; ++n) {
|
||||||
@ -205,7 +207,9 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
|
|||||||
wqe->ctrl[2] = rte_cpu_to_be_32(8);
|
wqe->ctrl[2] = rte_cpu_to_be_32(8);
|
||||||
wqe->ctrl[3] = txq->elts_head;
|
wqe->ctrl[3] = txq->elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
++txq->cq_pi;
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef MLX5_PMD_SOFT_COUNTERS
|
#ifdef MLX5_PMD_SOFT_COUNTERS
|
||||||
txq->stats.opackets += n;
|
txq->stats.opackets += n;
|
||||||
@ -269,6 +273,8 @@ txq_burst_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts, uint16_t pkts_n,
|
|||||||
assert(elts_n > pkts_n);
|
assert(elts_n > pkts_n);
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
||||||
pkts_n = RTE_MIN((unsigned int)RTE_MIN(pkts_n, max_wqe), max_elts);
|
pkts_n = RTE_MIN((unsigned int)RTE_MIN(pkts_n, max_wqe), max_elts);
|
||||||
if (unlikely(!pkts_n))
|
if (unlikely(!pkts_n))
|
||||||
@ -306,7 +312,9 @@ txq_burst_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts, uint16_t pkts_n,
|
|||||||
} else {
|
} else {
|
||||||
/* Request a completion. */
|
/* Request a completion. */
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
++txq->cq_pi;
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
comp_req = 8;
|
comp_req = 8;
|
||||||
}
|
}
|
||||||
/* Fill CTRL in the header. */
|
/* Fill CTRL in the header. */
|
||||||
|
@ -135,6 +135,8 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
|
|||||||
|
|
||||||
assert(elts_n > pkts_n);
|
assert(elts_n > pkts_n);
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
if (unlikely(!pkts_n))
|
if (unlikely(!pkts_n))
|
||||||
return 0;
|
return 0;
|
||||||
for (n = 0; n < pkts_n; ++n) {
|
for (n = 0; n < pkts_n; ++n) {
|
||||||
@ -206,7 +208,9 @@ txq_scatter_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
|
|||||||
wqe->ctrl[2] = rte_cpu_to_be_32(8);
|
wqe->ctrl[2] = rte_cpu_to_be_32(8);
|
||||||
wqe->ctrl[3] = txq->elts_head;
|
wqe->ctrl[3] = txq->elts_head;
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
++txq->cq_pi;
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef MLX5_PMD_SOFT_COUNTERS
|
#ifdef MLX5_PMD_SOFT_COUNTERS
|
||||||
txq->stats.opackets += n;
|
txq->stats.opackets += n;
|
||||||
@ -268,6 +272,8 @@ txq_burst_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts, uint16_t pkts_n,
|
|||||||
assert(elts_n > pkts_n);
|
assert(elts_n > pkts_n);
|
||||||
mlx5_tx_complete(txq);
|
mlx5_tx_complete(txq);
|
||||||
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
max_elts = (elts_n - (elts_head - txq->elts_tail));
|
||||||
|
/* A CQE slot must always be available. */
|
||||||
|
assert((1u << txq->cqe_n) - (txq->cq_pi - txq->cq_ci));
|
||||||
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
|
||||||
pkts_n = RTE_MIN((unsigned int)RTE_MIN(pkts_n, max_wqe), max_elts);
|
pkts_n = RTE_MIN((unsigned int)RTE_MIN(pkts_n, max_wqe), max_elts);
|
||||||
assert(pkts_n <= MLX5_DSEG_MAX - nb_dword_in_hdr);
|
assert(pkts_n <= MLX5_DSEG_MAX - nb_dword_in_hdr);
|
||||||
@ -307,7 +313,9 @@ txq_burst_v(struct mlx5_txq_data *txq, struct rte_mbuf **pkts, uint16_t pkts_n,
|
|||||||
} else {
|
} else {
|
||||||
/* Request a completion. */
|
/* Request a completion. */
|
||||||
txq->elts_comp = 0;
|
txq->elts_comp = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
++txq->cq_pi;
|
++txq->cq_pi;
|
||||||
|
#endif
|
||||||
comp_req = 8;
|
comp_req = 8;
|
||||||
}
|
}
|
||||||
/* Fill CTRL in the header. */
|
/* Fill CTRL in the header. */
|
||||||
|
@ -418,7 +418,9 @@ mlx5_priv_txq_ibv_new(struct priv *priv, uint16_t idx)
|
|||||||
(volatile struct mlx5_cqe (*)[])
|
(volatile struct mlx5_cqe (*)[])
|
||||||
(uintptr_t)cq_info.buf;
|
(uintptr_t)cq_info.buf;
|
||||||
txq_data->cq_ci = 0;
|
txq_data->cq_ci = 0;
|
||||||
|
#ifndef NDEBUG
|
||||||
txq_data->cq_pi = 0;
|
txq_data->cq_pi = 0;
|
||||||
|
#endif
|
||||||
txq_data->wqe_ci = 0;
|
txq_data->wqe_ci = 0;
|
||||||
txq_data->wqe_pi = 0;
|
txq_data->wqe_pi = 0;
|
||||||
txq_ibv->qp = tmpl.qp;
|
txq_ibv->qp = tmpl.qp;
|
||||||
|
Loading…
Reference in New Issue
Block a user