net/mlx5: enable meter bucket overflow for yellow color
authorBing Zhao <bingz@nvidia.com>
Wed, 21 Jul 2021 08:54:16 +0000 (11:54 +0300)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 22 Jul 2021 11:28:43 +0000 (13:28 +0200)
To support the meter policy for yellow action, the prerequisite is
that the hardware needs to support the EBS, as defined in the
RFC2697.
  https://datatracker.ietf.org/doc/html/rfc2697
Then some of the packets can be marked as yellow if the tokens of C
bucket is not enough but enough in E bucket. The color could be used
for the further steering of the packets.

In the current implementation EBS and overflow were ignored when
creating a meter profile. With this commit, if EBS is set by the
application, the generation of yellow color will be enabled in the
hardware for flow rules steering of packets.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5_flow_aso.c
drivers/net/mlx5/mlx5_flow_meter.c

index 64631ff..23e22e5 100644 (file)
@@ -747,6 +747,10 @@ mlx5_aso_mtr_sq_enqueue_single(struct mlx5_aso_sq *sq,
                wqe->aso_dseg.mtrs[dseg_idx].v_bo_sc_bbog_mm =
                                RTE_BE32((1 << ASO_DSEG_VALID_OFFSET) |
                                (MLX5_FLOW_COLOR_GREEN << ASO_DSEG_SC_OFFSET));
+       /* Only needed for RFC2697. */
+       if (fm->profile->srtcm_prm.ebs_eir)
+               wqe->aso_dseg.mtrs[dseg_idx].v_bo_sc_bbog_mm |=
+                               RTE_BE32(1 << ASO_DSEG_BO_OFFSET);
        sq->head++;
        sq->pi += 2;/* Each WQE contains 2 WQEBB's. */
        rte_io_wmb();
index 78eb2a6..73eba0d 100644 (file)
@@ -319,9 +319,9 @@ mlx5_flow_meter_param_fill(struct mlx5_flow_meter_profile *fmp,
        cbs_man = man;
        cbs_exp = exp;
        srtcm->cbs_cir = rte_cpu_to_be_32(cbs_exp << ASO_DSEG_CBS_EXP_OFFSET |
-                               cbs_man << ASO_DSEG_CBS_MAN_OFFSET |
-                               cir_exp << ASO_DSEG_CIR_EXP_OFFSET |
-                               cir_man);
+                                         cbs_man << ASO_DSEG_CBS_MAN_OFFSET |
+                                         cir_exp << ASO_DSEG_CIR_EXP_OFFSET |
+                                         cir_man);
        mlx5_flow_meter_xbs_man_exp_calc(ebs, &man, &exp);
        /* Check if ebs mantissa is too large. */
        if (exp > ASO_DSEG_EXP_MASK)
@@ -332,7 +332,7 @@ mlx5_flow_meter_param_fill(struct mlx5_flow_meter_profile *fmp,
        ebs_man = man;
        ebs_exp = exp;
        srtcm->ebs_eir = rte_cpu_to_be_32(ebs_exp << ASO_DSEG_EBS_EXP_OFFSET |
-                                       ebs_man << ASO_DSEG_EBS_MAN_OFFSET);
+                                         ebs_man << ASO_DSEG_EBS_MAN_OFFSET);
        return 0;
 }
 
@@ -421,7 +421,7 @@ mlx5_flow_meter_profile_add(struct rte_eth_dev *dev,
                return ret;
        /* Meter profile memory allocation. */
        fmp = mlx5_malloc(MLX5_MEM_ZERO, sizeof(struct mlx5_flow_meter_profile),
-                        RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
+                         RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
        if (fmp == NULL)
                return -rte_mtr_error_set(error, ENOMEM,
                                          RTE_MTR_ERROR_TYPE_UNSPECIFIED,