net/mlx5: optimize meter statistics
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.h
index ec673c2..3145f8f 100644 (file)
@@ -5,11 +5,10 @@
 #ifndef RTE_PMD_MLX5_FLOW_H_
 #define RTE_PMD_MLX5_FLOW_H_
 
-#include <netinet/in.h>
-#include <sys/queue.h>
 #include <stdalign.h>
 #include <stdint.h>
 #include <string.h>
+#include <sys/queue.h>
 
 #include <rte_alarm.h>
 #include <rte_mtr.h>
@@ -39,11 +38,11 @@ enum mlx5_rte_flow_action_type {
        MLX5_RTE_FLOW_ACTION_TYPE_AGE,
 };
 
-#define MLX5_SHARED_ACTION_TYPE_OFFSET 30
+#define MLX5_INDIRECT_ACTION_TYPE_OFFSET 30
 
 enum {
-       MLX5_SHARED_ACTION_TYPE_RSS,
-       MLX5_SHARED_ACTION_TYPE_AGE,
+       MLX5_INDIRECT_ACTION_TYPE_RSS,
+       MLX5_INDIRECT_ACTION_TYPE_AGE,
 };
 
 /* Matches on selected register. */
@@ -79,7 +78,7 @@ enum mlx5_feature_name {
        MLX5_APP_TAG,
        MLX5_COPY_MARK,
        MLX5_MTR_COLOR,
-       MLX5_MTR_SFX,
+       MLX5_MTR_ID,
        MLX5_ASO_FLOW_HIT,
 };
 
@@ -655,7 +654,8 @@ struct mlx5_flow_handle {
        uint64_t layers;
        /**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
        void *drv_flow; /**< pointer to driver flow object. */
-       uint32_t split_flow_id:28; /**< Sub flow unique match flow id. */
+       uint32_t split_flow_id:27; /**< Sub flow unique match flow id. */
+       uint32_t is_meter_flow_id:1; /**< Indate if flow_id is for meter. */
        uint32_t mark:1; /**< Metadate rxq mark flag. */
        uint32_t fate_action:3; /**< Fate action type. */
        union {
@@ -830,10 +830,10 @@ struct mlx5_flow {
 
 /* Meter policer statistics */
 struct mlx5_flow_policer_stats {
-       uint32_t cnt[RTE_COLORS + 1];
-       /**< Color counter, extra for drop. */
-       uint64_t stats_mask;
-       /**< Statistics mask for the colors. */
+       uint32_t pass_cnt;
+       /**< Color counter for pass. */
+       uint32_t drop_cnt;
+       /**< Color counter for drop. */
 };
 
 /* Meter table structure. */
@@ -842,14 +842,16 @@ struct mlx5_meter_domain_info {
        /**< Meter table. */
        struct mlx5_flow_tbl_resource *sfx_tbl;
        /**< Meter suffix table. */
-       void *any_matcher;
-       /**< Meter color not match default criteria. */
-       void *color_matcher;
-       /**< Meter color match criteria. */
+       struct mlx5_flow_dv_matcher *drop_matcher;
+       /**< Matcher for Drop. */
+       struct mlx5_flow_dv_matcher *color_matcher;
+       /**< Matcher for Color. */
        void *jump_actn;
        /**< Meter match action. */
-       void *policer_rules[RTE_MTR_DROPPED + 1];
-       /**< Meter policer for the match. */
+       void *green_rule;
+       /**< Meter green rule. */
+       void *drop_rule;
+       /**< Meter drop rule. */
 };
 
 /* Meter table set for TX RX FDB. */
@@ -862,10 +864,10 @@ struct mlx5_meter_domains_infos {
        /**< RX meter table. */
        struct mlx5_meter_domain_info transfer;
        /**< FDB meter table. */
-       void *drop_actn;
-       /**< Drop action as not matched. */
-       void *count_actns[RTE_MTR_DROPPED + 1];
-       /**< Counters for match and unmatched statistics. */
+       void *green_count;
+       /**< Counters for green rule. */
+       void *drop_count;
+       /**< Counters for green rule. */
        uint32_t fmp[MLX5_ST_SZ_DW(flow_meter_parameters)];
        /**< Flow meter parameter. */
        size_t fmp_size;
@@ -889,10 +891,18 @@ struct mlx5_flow_meter {
        /** Policer actions (per meter output color). */
        enum rte_mtr_policer_action action[RTE_COLORS];
 
-       /** Set of stats counters to be enabled.
-        * @see enum rte_mtr_stats_type
-        */
-       uint64_t stats_mask;
+       uint32_t green_bytes:1;
+       /** Set green bytes stats to be enabled. */
+       uint32_t green_pkts:1;
+       /** Set green packets stats to be enabled. */
+       uint32_t red_bytes:1;
+       /** Set red bytes stats to be enabled. */
+       uint32_t red_pkts:1;
+       /** Set red packets stats to be enabled. */
+       uint32_t bytes_dropped:1;
+       /** Set bytes dropped stats to be enabled. */
+       uint32_t pkts_dropped:1;
+       /** Set packets dropped stats to be enabled. */
 
        /**< Rule applies to ingress traffic. */
        uint32_t ingress:1;
@@ -928,6 +938,8 @@ struct mlx5_flow_meter {
        /**< Meter state. */
        uint32_t shared:1;
        /**< Meter shared or not. */
+       struct mlx5_indexed_pool *flow_ipool;
+       /**< Index pool for flow id. */
 };
 
 /* RFC2697 parameter structure. */
@@ -1152,7 +1164,7 @@ struct mlx5_shared_action_rss {
        rte_spinlock_t action_rss_sl; /**< Shared RSS action spinlock. */
 };
 
-struct rte_flow_shared_action {
+struct rte_flow_action_handle {
        uint32_t id;
 };
 
@@ -1166,6 +1178,7 @@ struct mlx5_flow_workspace {
        struct mlx5_flow_rss_desc rss_desc;
        uint32_t rssq_num; /* Allocated queue num in rss_desc. */
        uint32_t flow_idx; /* Intermediate device flow index. */
+       struct mlx5_flow_meter *fm; /* Pointer to the meter in flow. */
 };
 
 struct mlx5_flow_split_info {
@@ -1206,8 +1219,7 @@ typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
                                 void *data,
                                 struct rte_flow_error *error);
 typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)
-                                           (struct rte_eth_dev *dev,
-                                            const struct mlx5_flow_meter *fm);
+                                           (struct rte_eth_dev *dev);
 typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
                                        struct mlx5_meter_domains_infos *tbls);
 typedef int (*mlx5_flow_create_policer_rules_t)
@@ -1233,26 +1245,26 @@ typedef int (*mlx5_flow_get_aged_flows_t)
                                         struct rte_flow_error *error);
 typedef int (*mlx5_flow_action_validate_t)
                                (struct rte_eth_dev *dev,
-                                const struct rte_flow_shared_action_conf *conf,
+                                const struct rte_flow_indir_action_conf *conf,
                                 const struct rte_flow_action *action,
                                 struct rte_flow_error *error);
-typedef struct rte_flow_shared_action *(*mlx5_flow_action_create_t)
+typedef struct rte_flow_action_handle *(*mlx5_flow_action_create_t)
                                (struct rte_eth_dev *dev,
-                                const struct rte_flow_shared_action_conf *conf,
+                                const struct rte_flow_indir_action_conf *conf,
                                 const struct rte_flow_action *action,
                                 struct rte_flow_error *error);
 typedef int (*mlx5_flow_action_destroy_t)
                                (struct rte_eth_dev *dev,
-                                struct rte_flow_shared_action *action,
+                                struct rte_flow_action_handle *action,
                                 struct rte_flow_error *error);
 typedef int (*mlx5_flow_action_update_t)
                        (struct rte_eth_dev *dev,
-                        struct rte_flow_shared_action *action,
-                        const void *action_conf,
+                        struct rte_flow_action_handle *action,
+                        const void *update,
                         struct rte_flow_error *error);
 typedef int (*mlx5_flow_action_query_t)
                        (struct rte_eth_dev *dev,
-                        const struct rte_flow_shared_action *action,
+                        const struct rte_flow_action_handle *action,
                         void *data,
                         struct rte_flow_error *error);
 typedef int (*mlx5_flow_sync_domain_t)
@@ -1270,7 +1282,7 @@ struct mlx5_flow_driver_ops {
        mlx5_flow_query_t query;
        mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
        mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
-       mlx5_flow_create_policer_rules_t create_policer_rules;
+       mlx5_flow_create_policer_rules_t prepare_policer_rules;
        mlx5_flow_destroy_policer_rules_t destroy_policer_rules;
        mlx5_flow_counter_alloc_t counter_alloc;
        mlx5_flow_counter_free_t counter_free;
@@ -1470,11 +1482,10 @@ int mlx5_flow_validate_item_ecpri(const struct rte_flow_item *item,
                                  const struct rte_flow_item_ecpri *acc_mask,
                                  struct rte_flow_error *error);
 struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls
-                                       (struct rte_eth_dev *dev,
-                                        const struct mlx5_flow_meter *fm);
+                                       (struct rte_eth_dev *dev);
 int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
                               struct mlx5_meter_domains_infos *tbl);
-int mlx5_flow_create_policer_rules(struct rte_eth_dev *dev,
+int mlx5_flow_prepare_policer_rules(struct rte_eth_dev *dev,
                                   struct mlx5_flow_meter *fm,
                                   const struct rte_flow_attr *attr);
 int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
@@ -1483,7 +1494,7 @@ int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
 int mlx5_flow_meter_flush(struct rte_eth_dev *dev,
                          struct rte_mtr_error *error);
 int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);
-int mlx5_shared_action_flush(struct rte_eth_dev *dev);
+int mlx5_action_handle_flush(struct rte_eth_dev *dev);
 void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id);
 int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh);