From e4ed8de39b31c2a5d2c529726315106421abdc97 Mon Sep 17 00:00:00 2001 From: Dekel Peled Date: Sun, 28 Jun 2020 17:06:53 +0300 Subject: [PATCH] net/mlx5: add OS specific flow type selection In current implementation the flow type (DV/Verbs) is selected using dedicated function flow_get_drv_type(). This patch adds OS specific function mlx5_flow_os_get_type(), to allow OS specific flow type selection. The new function is called by flow_get_drv_type(), and if it returns a valid value (DV/Verbs) no more logic is required. Otherwise the existing logic is executed. Signed-off-by: Dekel Peled Acked-by: Matan Azrad --- drivers/net/mlx5/linux/mlx5_flow_os.h | 18 ++++++++++++++++++ drivers/net/mlx5/mlx5_flow.c | 10 ++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_flow_os.h b/drivers/net/mlx5/linux/mlx5_flow_os.h index 4ad4e0a1f6..41691a16a4 100644 --- a/drivers/net/mlx5/linux/mlx5_flow_os.h +++ b/drivers/net/mlx5/linux/mlx5_flow_os.h @@ -5,6 +5,24 @@ #ifndef RTE_PMD_MLX5_FLOW_OS_H_ #define RTE_PMD_MLX5_FLOW_OS_H_ +#include "mlx5_flow.h" + +#ifdef HAVE_IBV_FLOW_DV_SUPPORT +extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops; +#endif + +/** + * Get OS enforced flow type. MLX5_FLOW_TYPE_MAX means "non enforced type". + * + * @return + * Flow type (MLX5_FLOW_TYPE_MAX) + */ +static inline enum mlx5_flow_drv_type +mlx5_flow_os_get_type(void) +{ + return MLX5_FLOW_TYPE_MAX; +} + /** * Check if item type is supported. * diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 4a031a523b..ae5ccc2edd 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -36,12 +36,10 @@ #include "mlx5_defs.h" #include "mlx5.h" #include "mlx5_flow.h" +#include "mlx5_flow_os.h" #include "mlx5_rxtx.h" /** Device flow drivers. */ -#ifdef HAVE_IBV_FLOW_DV_SUPPORT -extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops; -#endif extern const struct mlx5_flow_driver_ops mlx5_flow_verbs_drv_ops; const struct mlx5_flow_driver_ops mlx5_flow_null_drv_ops; @@ -2501,8 +2499,12 @@ static enum mlx5_flow_drv_type flow_get_drv_type(struct rte_eth_dev *dev, const struct rte_flow_attr *attr) { struct mlx5_priv *priv = dev->data->dev_private; - enum mlx5_flow_drv_type type = MLX5_FLOW_TYPE_MAX; + /* The OS can determine first a specific flow type (DV, VERBS) */ + enum mlx5_flow_drv_type type = mlx5_flow_os_get_type(); + if (type != MLX5_FLOW_TYPE_MAX) + return type; + /* If no OS specific type - continue with DV/VERBS selection */ if (attr->transfer && priv->config.dv_esw_en) type = MLX5_FLOW_TYPE_DV; if (!attr->transfer) -- 2.20.1