err = ENOMEM;
goto error;
}
+ snprintf(s, sizeof(s), "%s_encaps_decaps", sh->ibdev_name);
+ sh->encaps_decaps = mlx5_hlist_create(s,
+ MLX5_FLOW_ENCAP_DECAP_HTABLE_SZ);
+ if (!sh->encaps_decaps) {
+ DRV_LOG(ERR, "encap decap hash creation failed");
+ err = ENOMEM;
+ goto error;
+ }
#ifdef HAVE_MLX5DV_DR
void *domain;
mlx5_glue->destroy_flow_action(sh->pop_vlan_action);
sh->pop_vlan_action = NULL;
}
+ if (sh->encaps_decaps) {
+ mlx5_hlist_destroy(sh->encaps_decaps, NULL, NULL);
+ sh->encaps_decaps = NULL;
+ }
if (sh->modify_cmds) {
mlx5_hlist_destroy(sh->modify_cmds, NULL, NULL);
sh->modify_cmds = NULL;
}
pthread_mutex_destroy(&sh->dv_mutex);
#endif /* HAVE_MLX5DV_DR */
+ if (sh->encaps_decaps) {
+ mlx5_hlist_destroy(sh->encaps_decaps, NULL, NULL);
+ sh->encaps_decaps = NULL;
+ }
if (sh->modify_cmds) {
mlx5_hlist_destroy(sh->modify_cmds, NULL, NULL);
sh->modify_cmds = NULL;
return ret;
}
+/**
+ * Create the Tx queue DevX/Verbs object.
+ *
+ * @param dev
+ * Pointer to Ethernet device.
+ * @param idx
+ * Queue index in DPDK Tx queue array.
+ *
+ * @return
+ * 0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx5_os_txq_obj_new(struct rte_eth_dev *dev, uint16_t idx)
+{
+ 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_ctrl *txq_ctrl =
+ container_of(txq_data, struct mlx5_txq_ctrl, txq);
+
+ /*
+ * When DevX is supported and DV flow is enable, and dest tir is enable,
+ * 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
+ if (config->dv_esw_en)
+ return mlx5_txq_devx_obj_new(dev, idx);
+#endif
+ }
+ return mlx5_txq_ibv_obj_new(dev, idx);
+}
+
+/**
+ * Release an Tx DevX/verbs queue object.
+ *
+ * @param txq_obj
+ * DevX/Verbs Tx queue object.
+ */
+static void
+mlx5_os_txq_obj_release(struct mlx5_txq_obj *txq_obj)
+{
+ struct mlx5_dev_config *config = &txq_obj->txq_ctrl->priv->config;
+
+ if (config->devx && config->dv_flow_en && config->dest_tir) {
+#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;
+ }
+ }
+ mlx5_txq_ibv_obj_release(txq_obj);
+}
+
/**
* Spawn an Ethernet device from Verbs information.
*
priv->mtr_color_reg);
}
}
+#endif
+#if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_FLOW_SAMPLE)
+ if (config->hca_attr.log_max_ft_sampler_num > 0 &&
+ config->dv_flow_en) {
+ priv->sampler_en = 1;
+ DRV_LOG(DEBUG, "The Sampler enabled!\n");
+ } else {
+ priv->sampler_en = 0;
+ if (!config->hca_attr.log_max_ft_sampler_num)
+ DRV_LOG(WARNING, "No available register for"
+ " Sampler.");
+ else
+ DRV_LOG(DEBUG, "DV flow is not supported!\n");
+ }
#endif
}
if (config->tx_pp) {
err = ENOMEM;
goto error;
}
- /* Flag to call rte_eth_dev_release_port() in rte_eth_dev_close(). */
- eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
if (priv->representor) {
eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
eth_dev->data->representor_id = priv->representor_id;
priv->dev_data = eth_dev->data;
eth_dev->data->mac_addrs = priv->mac;
eth_dev->device = dpdk_dev;
+ eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
/* Configure the first MAC address by default. */
if (mlx5_get_mac(eth_dev, &mac.addr_bytes)) {
DRV_LOG(ERR,
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) {
priv->obj_ops = devx_obj_ops;
priv->obj_ops.drop_action_create =
ibv_obj_ops.drop_action_create;
priv->obj_ops.drop_action_destroy =
ibv_obj_ops.drop_action_destroy;
+#ifndef HAVE_MLX5DV_DEVX_UAR_OFFSET
+ priv->obj_ops.txq_obj_modify = ibv_obj_ops.txq_obj_modify;
+#else
+ if (!config->dv_esw_en)
+ priv->obj_ops.txq_obj_modify =
+ ibv_obj_ops.txq_obj_modify;
+#endif
} else {
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. */
err = mlx5_flow_discover_priorities(eth_dev);
if (err < 0) {