net/mlx5: fix descriptors number adjustment

The number of descriptors to configure in a Rx/Tx queue is passed to
the mlx5_tx/rx_queue_pre_setup() function by value. That means any
adjustments of this variable are local and cannot affect the actual
value that is used to allocate mbufs in the mlx5_txq/rxq_new()
functions. Pass the number as a reference to actually update it.

Fixes: 6218063b39 ("net/mlx5: refactor Rx data path")
Fixes: 1d88ba1719 ("net/mlx5: refactor Tx data path")
Cc: stable@dpdk.org

Signed-off-by: Alexander Kozyrev <akozyrev@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
This commit is contained in:
Alexander Kozyrev 2020-06-11 17:43:27 +00:00 committed by Ferruh Yigit
parent a23d96ae59
commit e891b54a9e
2 changed files with 18 additions and 18 deletions

View File

@ -453,19 +453,19 @@ mlx5_rxq_releasable(struct rte_eth_dev *dev, uint16_t idx)
* 0 on success, a negative errno value otherwise and rte_errno is set. * 0 on success, a negative errno value otherwise and rte_errno is set.
*/ */
static int static int
mlx5_rx_queue_pre_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc) mlx5_rx_queue_pre_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t *desc)
{ {
struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_priv *priv = dev->data->dev_private;
if (!rte_is_power_of_2(desc)) { if (!rte_is_power_of_2(*desc)) {
desc = 1 << log2above(desc); *desc = 1 << log2above(*desc);
DRV_LOG(WARNING, DRV_LOG(WARNING,
"port %u increased number of descriptors in Rx queue %u" "port %u increased number of descriptors in Rx queue %u"
" to the next power of two (%d)", " to the next power of two (%d)",
dev->data->port_id, idx, desc); dev->data->port_id, idx, *desc);
} }
DRV_LOG(DEBUG, "port %u configuring Rx queue %u for %u descriptors", DRV_LOG(DEBUG, "port %u configuring Rx queue %u for %u descriptors",
dev->data->port_id, idx, desc); dev->data->port_id, idx, *desc);
if (idx >= priv->rxqs_n) { if (idx >= priv->rxqs_n) {
DRV_LOG(ERR, "port %u Rx queue index out of range (%u >= %u)", DRV_LOG(ERR, "port %u Rx queue index out of range (%u >= %u)",
dev->data->port_id, idx, priv->rxqs_n); dev->data->port_id, idx, priv->rxqs_n);
@ -511,7 +511,7 @@ mlx5_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
container_of(rxq, struct mlx5_rxq_ctrl, rxq); container_of(rxq, struct mlx5_rxq_ctrl, rxq);
int res; int res;
res = mlx5_rx_queue_pre_setup(dev, idx, desc); res = mlx5_rx_queue_pre_setup(dev, idx, &desc);
if (res) if (res)
return res; return res;
rxq_ctrl = mlx5_rxq_new(dev, idx, desc, socket, conf, mp); rxq_ctrl = mlx5_rxq_new(dev, idx, desc, socket, conf, mp);
@ -552,7 +552,7 @@ mlx5_rx_hairpin_queue_setup(struct rte_eth_dev *dev, uint16_t idx,
container_of(rxq, struct mlx5_rxq_ctrl, rxq); container_of(rxq, struct mlx5_rxq_ctrl, rxq);
int res; int res;
res = mlx5_rx_queue_pre_setup(dev, idx, desc); res = mlx5_rx_queue_pre_setup(dev, idx, &desc);
if (res) if (res)
return res; return res;
if (hairpin_conf->peer_count != 1 || if (hairpin_conf->peer_count != 1 ||

View File

@ -150,27 +150,27 @@ mlx5_get_tx_port_offloads(struct rte_eth_dev *dev)
* 0 on success, a negative errno value otherwise and rte_errno is set. * 0 on success, a negative errno value otherwise and rte_errno is set.
*/ */
static int static int
mlx5_tx_queue_pre_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc) mlx5_tx_queue_pre_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t *desc)
{ {
struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_priv *priv = dev->data->dev_private;
if (desc <= MLX5_TX_COMP_THRESH) { if (*desc <= MLX5_TX_COMP_THRESH) {
DRV_LOG(WARNING, DRV_LOG(WARNING,
"port %u number of descriptors requested for Tx queue" "port %u number of descriptors requested for Tx queue"
" %u must be higher than MLX5_TX_COMP_THRESH, using %u" " %u must be higher than MLX5_TX_COMP_THRESH, using %u"
" instead of %u", " instead of %u", dev->data->port_id, idx,
dev->data->port_id, idx, MLX5_TX_COMP_THRESH + 1, desc); MLX5_TX_COMP_THRESH + 1, *desc);
desc = MLX5_TX_COMP_THRESH + 1; *desc = MLX5_TX_COMP_THRESH + 1;
} }
if (!rte_is_power_of_2(desc)) { if (!rte_is_power_of_2(*desc)) {
desc = 1 << log2above(desc); *desc = 1 << log2above(*desc);
DRV_LOG(WARNING, DRV_LOG(WARNING,
"port %u increased number of descriptors in Tx queue" "port %u increased number of descriptors in Tx queue"
" %u to the next power of two (%d)", " %u to the next power of two (%d)",
dev->data->port_id, idx, desc); dev->data->port_id, idx, *desc);
} }
DRV_LOG(DEBUG, "port %u configuring queue %u for %u descriptors", DRV_LOG(DEBUG, "port %u configuring queue %u for %u descriptors",
dev->data->port_id, idx, desc); dev->data->port_id, idx, *desc);
if (idx >= priv->txqs_n) { if (idx >= priv->txqs_n) {
DRV_LOG(ERR, "port %u Tx queue index out of range (%u >= %u)", DRV_LOG(ERR, "port %u Tx queue index out of range (%u >= %u)",
dev->data->port_id, idx, priv->txqs_n); dev->data->port_id, idx, priv->txqs_n);
@ -213,7 +213,7 @@ mlx5_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
container_of(txq, struct mlx5_txq_ctrl, txq); container_of(txq, struct mlx5_txq_ctrl, txq);
int res; int res;
res = mlx5_tx_queue_pre_setup(dev, idx, desc); res = mlx5_tx_queue_pre_setup(dev, idx, &desc);
if (res) if (res)
return res; return res;
txq_ctrl = mlx5_txq_new(dev, idx, desc, socket, conf); txq_ctrl = mlx5_txq_new(dev, idx, desc, socket, conf);
@ -254,7 +254,7 @@ mlx5_tx_hairpin_queue_setup(struct rte_eth_dev *dev, uint16_t idx,
container_of(txq, struct mlx5_txq_ctrl, txq); container_of(txq, struct mlx5_txq_ctrl, txq);
int res; int res;
res = mlx5_tx_queue_pre_setup(dev, idx, desc); res = mlx5_tx_queue_pre_setup(dev, idx, &desc);
if (res) if (res)
return res; return res;
if (hairpin_conf->peer_count != 1 || if (hairpin_conf->peer_count != 1 ||