net/mlx5/linux: fix Tx queue operations decision
One of the conditions to create Tx queue object by DevX is to be sure that the DPDK mlx5 driver is not going to be the E-Switch manager of the device. The issue is with the default FDB flows managed by the kernel driver, which are not created by the kernel when the Tx queues are created by DevX. The current decision is to create the Tx queues by Verbs when E-Switch is enabled while the current behavior uses an opposite condition to create them by DevX. Create the Tx queues by Verbs when E-Switch is enabled. Fixes: 86d259cec852 ("net/mlx5: separate Tx queue object creations") Signed-off-by: Matan Azrad <matan@nvidia.com> Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
This commit is contained in:
parent
8dc775d8b1
commit
3ec73abeed
@ -526,26 +526,16 @@ static int
|
|||||||
mlx5_os_txq_obj_new(struct rte_eth_dev *dev, uint16_t idx)
|
mlx5_os_txq_obj_new(struct rte_eth_dev *dev, uint16_t idx)
|
||||||
{
|
{
|
||||||
struct mlx5_priv *priv = dev->data->dev_private;
|
struct mlx5_priv *priv = dev->data->dev_private;
|
||||||
struct mlx5_dev_config *config = &priv->config;
|
|
||||||
struct mlx5_txq_data *txq_data = (*priv->txqs)[idx];
|
struct mlx5_txq_data *txq_data = (*priv->txqs)[idx];
|
||||||
struct mlx5_txq_ctrl *txq_ctrl =
|
struct mlx5_txq_ctrl *txq_ctrl =
|
||||||
container_of(txq_data, struct mlx5_txq_ctrl, txq);
|
container_of(txq_data, struct mlx5_txq_ctrl, txq);
|
||||||
|
|
||||||
/*
|
if (txq_ctrl->type == MLX5_TXQ_TYPE_HAIRPIN)
|
||||||
* When DevX is supported and DV flow is enable, and dest tir is enable,
|
return mlx5_txq_devx_obj_new(dev, idx);
|
||||||
* hairpin functions use DevX API.
|
|
||||||
* When, in addition, DV E-Switch is enable and DevX uar offset is
|
|
||||||
* supported, all Tx functions also use DevX API.
|
|
||||||
* Otherwise, all Tx functions use Verbs API.
|
|
||||||
*/
|
|
||||||
if (config->devx && config->dv_flow_en && config->dest_tir) {
|
|
||||||
if (txq_ctrl->type == MLX5_TXQ_TYPE_HAIRPIN)
|
|
||||||
return mlx5_txq_devx_obj_new(dev, idx);
|
|
||||||
#ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
#ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
||||||
if (config->dv_esw_en)
|
if (!priv->config.dv_esw_en)
|
||||||
return mlx5_txq_devx_obj_new(dev, idx);
|
return mlx5_txq_devx_obj_new(dev, idx);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
return mlx5_txq_ibv_obj_new(dev, idx);
|
return mlx5_txq_ibv_obj_new(dev, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,20 +548,16 @@ mlx5_os_txq_obj_new(struct rte_eth_dev *dev, uint16_t idx)
|
|||||||
static void
|
static void
|
||||||
mlx5_os_txq_obj_release(struct mlx5_txq_obj *txq_obj)
|
mlx5_os_txq_obj_release(struct mlx5_txq_obj *txq_obj)
|
||||||
{
|
{
|
||||||
struct mlx5_dev_config *config = &txq_obj->txq_ctrl->priv->config;
|
if (txq_obj->txq_ctrl->type == MLX5_TXQ_TYPE_HAIRPIN) {
|
||||||
|
mlx5_txq_devx_obj_release(txq_obj);
|
||||||
if (config->devx && config->dv_flow_en && config->dest_tir) {
|
return;
|
||||||
#ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
|
||||||
if (config->dv_esw_en) {
|
|
||||||
mlx5_txq_devx_obj_release(txq_obj);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (txq_obj->txq_ctrl->type == MLX5_TXQ_TYPE_HAIRPIN) {
|
|
||||||
mlx5_txq_devx_obj_release(txq_obj);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
||||||
|
if (!txq_obj->txq_ctrl->priv->config.dv_esw_en) {
|
||||||
|
mlx5_txq_devx_obj_release(txq_obj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
mlx5_txq_ibv_obj_release(txq_obj);
|
mlx5_txq_ibv_obj_release(txq_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1378,12 +1364,6 @@ err_secondary:
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Initialize the dev_ops structure with DevX/Verbs function pointers.
|
|
||||||
* When DevX is supported and both DV flow and dest tir are enabled, all
|
|
||||||
* Rx functions use DevX API (except for drop that has not yet been
|
|
||||||
* implemented in DevX).
|
|
||||||
*/
|
|
||||||
if (config->devx && config->dv_flow_en && config->dest_tir) {
|
if (config->devx && config->dv_flow_en && config->dest_tir) {
|
||||||
priv->obj_ops = devx_obj_ops;
|
priv->obj_ops = devx_obj_ops;
|
||||||
priv->obj_ops.drop_action_create =
|
priv->obj_ops.drop_action_create =
|
||||||
@ -1393,16 +1373,17 @@ err_secondary:
|
|||||||
#ifndef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
#ifndef HAVE_MLX5DV_DEVX_UAR_OFFSET
|
||||||
priv->obj_ops.txq_obj_modify = ibv_obj_ops.txq_obj_modify;
|
priv->obj_ops.txq_obj_modify = ibv_obj_ops.txq_obj_modify;
|
||||||
#else
|
#else
|
||||||
if (!config->dv_esw_en)
|
if (config->dv_esw_en)
|
||||||
priv->obj_ops.txq_obj_modify =
|
priv->obj_ops.txq_obj_modify =
|
||||||
ibv_obj_ops.txq_obj_modify;
|
ibv_obj_ops.txq_obj_modify;
|
||||||
#endif
|
#endif
|
||||||
|
/* Use specific wrappers for Tx object. */
|
||||||
|
priv->obj_ops.txq_obj_new = mlx5_os_txq_obj_new;
|
||||||
|
priv->obj_ops.txq_obj_release = mlx5_os_txq_obj_release;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
priv->obj_ops = ibv_obj_ops;
|
priv->obj_ops = ibv_obj_ops;
|
||||||
}
|
}
|
||||||
/* The Tx objects are managed by a specific linux wrapper functions. */
|
|
||||||
priv->obj_ops.txq_obj_new = mlx5_os_txq_obj_new;
|
|
||||||
priv->obj_ops.txq_obj_release = mlx5_os_txq_obj_release;
|
|
||||||
/* Supported Verbs flow priority number detection. */
|
/* Supported Verbs flow priority number detection. */
|
||||||
err = mlx5_flow_discover_priorities(eth_dev);
|
err = mlx5_flow_discover_priorities(eth_dev);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user