vdpa/mlx5: add task ring for multi-thread management
[dpdk.git] / drivers / vdpa / mlx5 / mlx5_vdpa_steer.c
index 1fcd24c..4cbf097 100644 (file)
@@ -45,14 +45,6 @@ void
 mlx5_vdpa_steer_unset(struct mlx5_vdpa_priv *priv)
 {
        mlx5_vdpa_rss_flows_destroy(priv);
-       if (priv->steer.tbl) {
-               claim_zero(mlx5_glue->dr_destroy_flow_tbl(priv->steer.tbl));
-               priv->steer.tbl = NULL;
-       }
-       if (priv->steer.domain) {
-               claim_zero(mlx5_glue->dr_destroy_domain(priv->steer.domain));
-               priv->steer.domain = NULL;
-       }
        if (priv->steer.rqt) {
                claim_zero(mlx5_devx_cmd_destroy(priv->steer.rqt));
                priv->steer.rqt = NULL;
@@ -98,7 +90,8 @@ mlx5_vdpa_rqt_prepare(struct mlx5_vdpa_priv *priv)
        attr->rqt_max_size = rqt_n;
        attr->rqt_actual_size = rqt_n;
        if (!priv->steer.rqt) {
-               priv->steer.rqt = mlx5_devx_cmd_create_rqt(priv->ctx, attr);
+               priv->steer.rqt = mlx5_devx_cmd_create_rqt(priv->cdev->ctx,
+                                                          attr);
                if (!priv->steer.rqt) {
                        DRV_LOG(ERR, "Failed to create RQT.");
                        ret = -rte_errno;
@@ -140,11 +133,13 @@ mlx5_vdpa_rss_flows_create(struct mlx5_vdpa_priv *priv)
                /**< Matcher value. This value is used as the mask or a key. */
        } matcher_mask = {
                                .size = sizeof(matcher_mask.buf) -
-                                       MLX5_ST_SZ_BYTES(fte_match_set_misc4),
+                                       MLX5_ST_SZ_BYTES(fte_match_set_misc4) -
+                                       MLX5_ST_SZ_BYTES(fte_match_set_misc5),
                        },
          matcher_value = {
                                .size = sizeof(matcher_value.buf) -
-                                       MLX5_ST_SZ_BYTES(fte_match_set_misc4),
+                                       MLX5_ST_SZ_BYTES(fte_match_set_misc4) -
+                                       MLX5_ST_SZ_BYTES(fte_match_set_misc5),
                        };
        struct mlx5dv_flow_matcher_attr dv_attr = {
                .type = IBV_FLOW_ATTR_NORMAL,
@@ -202,13 +197,13 @@ mlx5_vdpa_rss_flows_create(struct mlx5_vdpa_priv *priv)
                tir_att.rx_hash_field_selector_outer.selected_fields =
                                                                  vars[i][HASH];
                priv->steer.rss[i].matcher = mlx5_glue->dv_create_flow_matcher
-                                        (priv->ctx, &dv_attr, priv->steer.tbl);
+                                  (priv->cdev->ctx, &dv_attr, priv->steer.tbl);
                if (!priv->steer.rss[i].matcher) {
                        DRV_LOG(ERR, "Failed to create matcher %d.", i);
                        goto error;
                }
-               priv->steer.rss[i].tir = mlx5_devx_cmd_create_tir(priv->ctx,
-                                                                 &tir_att);
+               priv->steer.rss[i].tir = mlx5_devx_cmd_create_tir
+                                                   (priv->cdev->ctx, &tir_att);
                if (!priv->steer.rss[i].tir) {
                        DRV_LOG(ERR, "Failed to create TIR %d.", i);
                        goto error;
@@ -242,49 +237,34 @@ error:
 int
 mlx5_vdpa_steer_update(struct mlx5_vdpa_priv *priv)
 {
-       int ret = mlx5_vdpa_rqt_prepare(priv);
+       int ret;
 
+       pthread_mutex_lock(&priv->steer_update_lock);
+       ret = mlx5_vdpa_rqt_prepare(priv);
        if (ret == 0) {
-               mlx5_vdpa_rss_flows_destroy(priv);
-               if (priv->steer.rqt) {
-                       claim_zero(mlx5_devx_cmd_destroy(priv->steer.rqt));
-                       priv->steer.rqt = NULL;
-               }
+               mlx5_vdpa_steer_unset(priv);
        } else if (ret < 0) {
+               pthread_mutex_unlock(&priv->steer_update_lock);
                return ret;
        } else if (!priv->steer.rss[0].flow) {
                ret = mlx5_vdpa_rss_flows_create(priv);
                if (ret) {
                        DRV_LOG(ERR, "Cannot create RSS flows.");
+                       pthread_mutex_unlock(&priv->steer_update_lock);
                        return -1;
                }
        }
+       pthread_mutex_unlock(&priv->steer_update_lock);
        return 0;
 }
 
 int
 mlx5_vdpa_steer_setup(struct mlx5_vdpa_priv *priv)
 {
-#ifdef HAVE_MLX5DV_DR
-       priv->steer.domain = mlx5_glue->dr_create_domain(priv->ctx,
-                                                 MLX5DV_DR_DOMAIN_TYPE_NIC_RX);
-       if (!priv->steer.domain) {
-               DRV_LOG(ERR, "Failed to create Rx domain.");
-               goto error;
-       }
-       priv->steer.tbl = mlx5_glue->dr_create_flow_tbl(priv->steer.domain, 0);
-       if (!priv->steer.tbl) {
-               DRV_LOG(ERR, "Failed to create table 0 with Rx domain.");
-               goto error;
-       }
        if (mlx5_vdpa_steer_update(priv))
                goto error;
        return 0;
 error:
        mlx5_vdpa_steer_unset(priv);
        return -1;
-#else
-       (void)priv;
-       return -ENOTSUP;
-#endif /* HAVE_MLX5DV_DR */
 }