net/mlx5: fix meter suffix table leak
[dpdk.git] / drivers / net / mlx5 / mlx5.h
index 9864aa7..1850cf9 100644 (file)
 #include <mlx5_glue.h>
 #include <mlx5_devx_cmds.h>
 #include <mlx5_prm.h>
+#include <mlx5_nl.h>
 
 #include "mlx5_defs.h"
 #include "mlx5_utils.h"
 #include "mlx5_mr.h"
-#include "mlx5_nl.h"
 #include "mlx5_autoconf.h"
 
 /* Request types for IPC. */
@@ -112,12 +112,15 @@ struct mlx5_xstats_ctrl {
        /* Index in the device counters table. */
        uint16_t dev_table_idx[MLX5_MAX_XSTATS];
        uint64_t base[MLX5_MAX_XSTATS];
+       uint64_t xstats[MLX5_MAX_XSTATS];
+       uint64_t hw_stats[MLX5_MAX_XSTATS];
        struct mlx5_counter_ctrl info[MLX5_MAX_XSTATS];
 };
 
 struct mlx5_stats_ctrl {
        /* Base for imissed counter. */
        uint64_t imissed_base;
+       uint64_t imissed;
 };
 
 /* Flow list . */
@@ -176,6 +179,7 @@ struct mlx5_dev_config {
        struct {
                unsigned int enabled:1; /* Whether MPRQ is enabled. */
                unsigned int stride_num_n; /* Number of strides. */
+               unsigned int stride_size_n; /* Size of a stride. */
                unsigned int min_stride_size_n; /* Min size of a stride. */
                unsigned int max_stride_size_n; /* Max size of a stride. */
                unsigned int max_memcpy_len;
@@ -191,6 +195,7 @@ struct mlx5_dev_config {
        unsigned int tso_max_payload_sz; /* Maximum TCP payload for TSO. */
        unsigned int ind_table_max_size; /* Maximum indirection table size. */
        unsigned int max_dump_files_num; /* Maximum dump files per queue. */
+       unsigned int log_hp_size; /* Single hairpin queue data size in total. */
        int txqs_inline; /* Queue number threshold for inlining. */
        int txq_inline_min; /* Minimal amount of data bytes to inline. */
        int txq_inline_max; /* Max packet size for inlining with SEND. */
@@ -234,6 +239,20 @@ struct mlx5_drop {
 
 #define MLX5_COUNTERS_PER_POOL 512
 #define MLX5_MAX_PENDING_QUERIES 4
+#define MLX5_CNT_CONTAINER_RESIZE 64
+/*
+ * The pool index and offset of counter in the pool array makes up the
+ * counter index. In case the counter is from pool 0 and offset 0, it
+ * should plus 1 to avoid index 0, since 0 means invalid counter index
+ * currently.
+ */
+#define MLX5_MAKE_CNT_IDX(pi, offset) \
+       ((pi) * MLX5_COUNTERS_PER_POOL + (offset) + 1)
+#define MLX5_CNT_TO_CNT_EXT(pool, cnt) (&((struct mlx5_flow_counter_ext *) \
+                           ((pool) + 1))[((cnt) - (pool)->counters_raw)])
+#define MLX5_GET_POOL_CNT_EXT(pool, offset) \
+                             (&((struct mlx5_flow_counter_ext *) \
+                             ((pool) + 1))[offset])
 
 struct mlx5_flow_counter_pool;
 
@@ -242,15 +261,25 @@ struct flow_counter_stats {
        uint64_t bytes;
 };
 
-/* Counters information. */
+/* Generic counters information. */
 struct mlx5_flow_counter {
        TAILQ_ENTRY(mlx5_flow_counter) next;
        /**< Pointer to the next flow counter structure. */
+       union {
+               uint64_t hits; /**< Reset value of hits packets. */
+               int64_t query_gen; /**< Generation of the last release. */
+       };
+       uint64_t bytes; /**< Reset value of bytes. */
+       void *action; /**< Pointer to the dv action. */
+};
+
+/* Extend counters information for none batch counters. */
+struct mlx5_flow_counter_ext {
        uint32_t shared:1; /**< Share counter ID with other flow rules. */
        uint32_t batch: 1;
        /**< Whether the counter was allocated by batch command. */
        uint32_t ref_cnt:30; /**< Reference counter. */
-       uint32_t id; /**< Counter ID. */
+       uint32_t id; /**< User counter ID. */
        union {  /**< Holds the counters for the rule. */
 #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42)
                struct ibv_counter_set *cs;
@@ -258,19 +287,13 @@ struct mlx5_flow_counter {
                struct ibv_counters *cs;
 #endif
                struct mlx5_devx_obj *dcs; /**< Counter Devx object. */
-               struct mlx5_flow_counter_pool *pool; /**< The counter pool. */
-       };
-       union {
-               uint64_t hits; /**< Reset value of hits packets. */
-               int64_t query_gen; /**< Generation of the last release. */
        };
-       uint64_t bytes; /**< Reset value of bytes. */
-       void *action; /**< Pointer to the dv action. */
 };
 
+
 TAILQ_HEAD(mlx5_counters, mlx5_flow_counter);
 
-/* Counter pool structure - query is in pool resolution. */
+/* Generic counter pool structure - query is in pool resolution. */
 struct mlx5_flow_counter_pool {
        TAILQ_ENTRY(mlx5_flow_counter_pool) next;
        struct mlx5_counters counters; /* Free counter list. */
@@ -279,12 +302,14 @@ struct mlx5_flow_counter_pool {
                rte_atomic64_t a64_dcs;
        };
        /* The devx object of the minimum counter ID. */
-       rte_atomic64_t query_gen;
-       uint32_t n_counters: 16; /* Number of devx allocated counters. */
+       rte_atomic64_t start_query_gen; /* Query start round. */
+       rte_atomic64_t end_query_gen; /* Query end round. */
+       uint32_t index; /* Pool index in container. */
        rte_spinlock_t sl; /* The pool lock. */
        struct mlx5_counter_stats_raw *raw;
        struct mlx5_counter_stats_raw *raw_hw; /* The raw on HW working. */
-       struct mlx5_flow_counter counters_raw[]; /* The pool counters memory. */
+       struct mlx5_flow_counter counters_raw[MLX5_COUNTERS_PER_POOL];
+       /* The pool counters memory. */
 };
 
 struct mlx5_counter_stats_raw;
@@ -430,14 +455,8 @@ struct mlx5_ibv_shared {
        uint32_t dv_regc0_mask; /* available bits of metatada reg_c[0]. */
        uint32_t dv_refcnt; /* DV/DR data reference counter. */
        void *fdb_domain; /* FDB Direct Rules name space handle. */
-       struct mlx5_flow_tbl_resource *fdb_mtr_sfx_tbl;
-       /* FDB meter suffix rules table. */
        void *rx_domain; /* RX Direct Rules name space handle. */
-       struct mlx5_flow_tbl_resource *rx_mtr_sfx_tbl;
-       /* RX meter suffix rules table. */
        void *tx_domain; /* TX Direct Rules name space handle. */
-       struct mlx5_flow_tbl_resource *tx_mtr_sfx_tbl;
-       /* TX meter suffix rules table. */
        struct mlx5_hlist *flow_tbls;
        /* Direct Rules tables for FDB, NIC TX+RX */
        void *esw_drop_action; /* Pointer to DR E-Switch drop action. */
@@ -517,6 +536,9 @@ struct mlx5_priv {
        struct mlx5_drop drop_queue; /* Flow drop queues. */
        struct mlx5_flows flows; /* RTE Flow rules. */
        struct mlx5_flows ctrl_flows; /* Control flow rules. */
+       void *inter_flows; /* Intermediate resources for flow creation. */
+       int flow_idx; /* Intermediate device flow index. */
+       int flow_nested_idx; /* Intermediate device flow index, nested. */
        LIST_HEAD(rxq, mlx5_rxq_ctrl) rxqsctrl; /* DPDK Rx queues. */
        LIST_HEAD(rxqobj, mlx5_rxq_obj) rxqsobj; /* Verbs/DevX Rx queues. */
        LIST_HEAD(hrxq, mlx5_hrxq) hrxqs; /* Verbs Hash Rx queues. */
@@ -554,6 +576,7 @@ struct mlx5_priv {
        /* UAR same-page access control required in 32bit implementations. */
 #endif
        uint8_t skip_default_rss_reta; /* Skip configuration of default reta. */
+       uint8_t fdb_def_rule; /* Whether fdb jump to table 1 is configured. */
 };
 
 #define PORT_ID(priv) ((priv)->dev_data->port_id)
@@ -711,7 +734,8 @@ struct rte_flow *mlx5_flow_create(struct rte_eth_dev *dev,
                                  struct rte_flow_error *error);
 int mlx5_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow,
                      struct rte_flow_error *error);
-void mlx5_flow_list_flush(struct rte_eth_dev *dev, struct mlx5_flows *list);
+void mlx5_flow_list_flush(struct rte_eth_dev *dev, struct mlx5_flows *list,
+                         bool active);
 int mlx5_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error);
 int mlx5_flow_query(struct rte_eth_dev *dev, struct rte_flow *flow,
                    const struct rte_flow_action *action, void *data,
@@ -724,6 +748,10 @@ int mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
                         void *arg);
 int mlx5_flow_start(struct rte_eth_dev *dev, struct mlx5_flows *list);
 void mlx5_flow_stop(struct rte_eth_dev *dev, struct mlx5_flows *list);
+int mlx5_flow_start_default(struct rte_eth_dev *dev);
+void mlx5_flow_stop_default(struct rte_eth_dev *dev);
+void mlx5_flow_alloc_intermediate(struct rte_eth_dev *dev);
+void mlx5_flow_free_intermediate(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
 int mlx5_ctrl_flow_source_queue(struct rte_eth_dev *dev, uint32_t queue);
 int mlx5_ctrl_flow_vlan(struct rte_eth_dev *dev,
@@ -741,9 +769,9 @@ void mlx5_flow_async_pool_query_handle(struct mlx5_ibv_shared *sh,
                                       uint64_t async_id, int status);
 void mlx5_set_query_alarm(struct mlx5_ibv_shared *sh);
 void mlx5_flow_query_alarm(void *arg);
-struct mlx5_flow_counter *mlx5_counter_alloc(struct rte_eth_dev *dev);
-void mlx5_counter_free(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt);
-int mlx5_counter_query(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt,
+uint32_t mlx5_counter_alloc(struct rte_eth_dev *dev);
+void mlx5_counter_free(struct rte_eth_dev *dev, uint32_t cnt);
+int mlx5_counter_query(struct rte_eth_dev *dev, uint32_t cnt,
                       bool clear, uint64_t *pkts, uint64_t *bytes);
 int mlx5_flow_dev_dump(struct rte_eth_dev *dev, FILE *file,
                       struct rte_flow_error *error);
@@ -763,7 +791,6 @@ void mlx5_mp_uninit_secondary(void);
 /* mlx5_socket.c */
 
 int mlx5_pmd_socket_init(void);
-void mlx5_pmd_socket_uninit(void);
 
 /* mlx5_flow_meter.c */