HWS context is created during port configuration.

PMD allowed meter operations before port configuration.

The patch rejects HWS meter operations before port configuration.

Signed-off-by: Gregory Etelson <getel...@nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnow...@nvidia.com>
---
 drivers/net/mlx5/mlx5.h            | 18 ++++++++++++++
 drivers/net/mlx5/mlx5_flow_hw.c    |  7 +++++-
 drivers/net/mlx5/mlx5_flow_meter.c | 40 ++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 0e026f7bbb..503366580b 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -2682,4 +2682,22 @@ int mlx5_quota_query(struct rte_eth_dev *dev, uint32_t 
queue,
 int mlx5_alloc_srh_flex_parser(struct rte_eth_dev *dev);
 
 void mlx5_free_srh_flex_parser(struct rte_eth_dev *dev);
+
+/* mlx5_flow_hw.c */
+struct rte_pmd_mlx5_host_action;
+
+struct mlx5dr_action *
+mlx5_flow_hw_get_dr_action(struct rte_eth_dev *dev,
+                          struct rte_pmd_mlx5_host_action *action,
+                          void **release_data);
+
+void
+mlx5_flow_hw_put_dr_action(struct rte_eth_dev *dev,
+                          enum rte_flow_action_type type,
+                          void *release_data);
+
+bool
+mlx5_hw_ctx_validate(const struct rte_eth_dev *dev,
+                    struct rte_flow_error *error);
+
 #endif /* RTE_PMD_MLX5_H_ */
diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c
index 5b34154bf1..9c33004c09 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -208,7 +208,12 @@ mlx5_destroy_multi_pattern_segment(struct 
mlx5_multi_pattern_segment *segment);
 static __rte_always_inline enum mlx5_indirect_list_type
 flow_hw_inlist_type_get(const struct rte_flow_action *actions);
 
-static bool
+static int
+flow_hw_allocate_actions(struct rte_eth_dev *dev,
+                        uint64_t action_flags,
+                        struct rte_flow_error *error);
+
+bool
 mlx5_hw_ctx_validate(const struct rte_eth_dev *dev, struct rte_flow_error 
*error)
 {
        const struct mlx5_priv *priv = dev->data->dev_private;
diff --git a/drivers/net/mlx5/mlx5_flow_meter.c 
b/drivers/net/mlx5/mlx5_flow_meter.c
index 19d8607070..299265f8bc 100644
--- a/drivers/net/mlx5/mlx5_flow_meter.c
+++ b/drivers/net/mlx5/mlx5_flow_meter.c
@@ -745,6 +745,10 @@ mlx5_flow_mtr_cap_get(struct rte_eth_dev *dev,
        struct mlx5_priv *priv = dev->data->dev_private;
        struct mlx5_hca_qos_attr *qattr = &priv->sh->cdev->config.hca_attr.qos;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_en)
                return -rte_mtr_error_set(error, ENOTSUP,
                                          RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
@@ -903,6 +907,12 @@ mlx5_flow_meter_profile_get(struct rte_eth_dev *dev,
 {
        struct mlx5_priv *priv = dev->data->dev_private;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL)) {
+               rte_mtr_error_set(error, EINVAL,
+                                 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                 "non-template flow engine was not 
configured");
+               return NULL;
+       }
        if (!priv->mtr_en) {
                rte_mtr_error_set(error, ENOTSUP,
                                  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
@@ -939,6 +949,10 @@ mlx5_flow_meter_profile_hws_add(struct rte_eth_dev *dev,
        struct mlx5_flow_meter_profile *fmp;
        int ret;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (priv->shared_host)
                return -rte_mtr_error_set(error, ENOTSUP, 
RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
                                          "Meter profiles cannot be created on 
guest port");
@@ -1167,6 +1181,10 @@ mlx5_flow_meter_policy_hws_validate(struct rte_eth_dev 
*dev,
        int ret;
        int i;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_en || !priv->sh->meter_aso_en)
                return -rte_mtr_error_set(error, ENOTSUP,
                                RTE_MTR_ERROR_TYPE_METER_POLICY,
@@ -1496,6 +1514,12 @@ mlx5_flow_meter_policy_get(struct rte_eth_dev *dev,
        struct mlx5_priv *priv = dev->data->dev_private;
        uint32_t policy_idx;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL)) {
+               rte_mtr_error_set(error, EINVAL,
+                                 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                 "non-template flow engine was not 
configured");
+               return NULL;
+       }
        if (!priv->mtr_en) {
                rte_mtr_error_set(error, ENOTSUP,
                                  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
@@ -1645,6 +1669,10 @@ mlx5_flow_meter_policy_hws_add(struct rte_eth_dev *dev,
                [1] = { .type = RTE_FLOW_ITEM_TYPE_END }
        };
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_policy_arr)
                return mlx5_flow_meter_policy_add(dev, policy_id, policy, 
error);
        mtr_policy = mlx5_flow_meter_policy_find(dev, policy_id, NULL);
@@ -2230,6 +2258,10 @@ mlx5_flow_meter_hws_create(struct rte_eth_dev *dev, 
uint32_t meter_id,
        struct mlx5_hw_q_job *job;
        int ret;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_profile_arr ||
            !priv->mtr_policy_arr ||
            !priv->mtr_bulk.aso)
@@ -2520,6 +2552,10 @@ mlx5_flow_meter_enable(struct rte_eth_dev *dev,
        struct mlx5_flow_meter_info *fm;
        int ret;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_en)
                return -rte_mtr_error_set(error, ENOTSUP,
                                          RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
@@ -2609,6 +2645,10 @@ mlx5_flow_meter_profile_update(struct rte_eth_dev *dev,
                               MLX5_FLOW_METER_OBJ_MODIFY_FIELD_CIR;
        int ret;
 
+       if (mlx5_hws_active(dev) && !mlx5_hw_ctx_validate(dev, NULL))
+               return -rte_mtr_error_set(error, EINVAL,
+                                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+                                         "non-template flow engine was not 
configured");
        if (!priv->mtr_en)
                return -rte_mtr_error_set(error, ENOTSUP,
                                          RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-- 
2.43.0

Reply via email to