net/mlx5: make tunnel hub list thread safe
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.h
index 0fe8698..3105463 100644 (file)
@@ -394,11 +394,9 @@ struct mlx5_flow_dv_match_params {
 
 /* Matcher structure. */
 struct mlx5_flow_dv_matcher {
-       LIST_ENTRY(mlx5_flow_dv_matcher) next;
-       /**< Pointer to the next element. */
+       struct mlx5_cache_entry entry; /**< Pointer to the next element. */
        struct mlx5_flow_tbl_resource *tbl;
        /**< Pointer to the table(group) the matcher associated with. */
-       uint32_t refcnt; /**< Reference counter. */
        void *matcher_object; /**< Pointer to DV matcher */
        uint16_t crc; /**< CRC of key. */
        uint16_t priority; /**< Priority of matcher. */
@@ -487,22 +485,19 @@ struct mlx5_flow_dv_jump_tbl_resource {
 
 /* Port ID resource structure. */
 struct mlx5_flow_dv_port_id_action_resource {
-       ILIST_ENTRY(uint32_t)next;
-       /* Pointer to next element. */
-       uint32_t refcnt; /**< Reference counter. */
-       void *action;
-       /**< Action object. */
+       struct mlx5_cache_entry entry;
+       void *action; /**< Action object. */
        uint32_t port_id; /**< Port ID value. */
+       uint32_t idx; /**< Indexed pool memory index. */
 };
 
 /* Push VLAN action resource structure */
 struct mlx5_flow_dv_push_vlan_action_resource {
-       ILIST_ENTRY(uint32_t)next;
-       /* Pointer to next element. */
-       uint32_t refcnt; /**< Reference counter. */
+       struct mlx5_cache_entry entry; /* Cache entry. */
        void *action; /**< Action object. */
        uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
        rte_be32_t vlan_tag; /**< VLAN tag value. */
+       uint32_t idx; /**< Indexed pool memory index. */
 };
 
 /* Metadata register copy table entry. */
@@ -532,7 +527,7 @@ struct mlx5_flow_tbl_data_entry {
        /**< hash list entry, 64-bits key inside. */
        struct mlx5_flow_tbl_resource tbl;
        /**< flow table resource. */
-       LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
+       struct mlx5_cache_list matchers;
        /**< matchers' header associated with the flow table. */
        struct mlx5_flow_dv_jump_tbl_resource jump;
        /**< jump resource, at most one for each table created. */
@@ -542,6 +537,7 @@ struct mlx5_flow_tbl_data_entry {
        uint32_t group_id;
        bool external;
        bool tunnel_offload; /* Tunnel offlod table or not. */
+       bool is_egress; /**< Egress table. */
 };
 
 /* Sub rdma-core actions list. */
@@ -566,9 +562,12 @@ struct mlx5_flow_sub_actions_idx {
 
 /* Sample action resource structure. */
 struct mlx5_flow_dv_sample_resource {
-       ILIST_ENTRY(uint32_t)next; /**< Pointer to next element. */
-       uint32_t refcnt; /**< Reference counter. */
-       void *verbs_action; /**< Verbs sample action object. */
+       struct mlx5_cache_entry entry; /**< Cache entry. */
+       union {
+               void *verbs_action; /**< Verbs sample action object. */
+               void **sub_actions; /**< Sample sub-action array. */
+       };
+       uint32_t idx; /** Sample object index. */
        uint8_t ft_type; /** Flow Table Type */
        uint32_t ft_id; /** Flow Table Level */
        uint32_t ratio;   /** Sample Ratio */
@@ -585,8 +584,8 @@ struct mlx5_flow_dv_sample_resource {
 
 /* Destination array action resource structure. */
 struct mlx5_flow_dv_dest_array_resource {
-       ILIST_ENTRY(uint32_t)next; /**< Pointer to next element. */
-       uint32_t refcnt; /**< Reference counter. */
+       struct mlx5_cache_entry entry; /**< Cache entry. */
+       uint32_t idx; /** Destination array action object index. */
        uint8_t ft_type; /** Flow Table Type */
        uint8_t num_of_dest; /**< Number of destination actions. */
        void *action; /**< Pointer to the rdma core action. */
@@ -946,6 +945,7 @@ struct mlx5_flow_tunnel {
 /** PMD tunnel related context */
 struct mlx5_flow_tunnel_hub {
        LIST_HEAD(, mlx5_flow_tunnel) tunnels;
+       rte_spinlock_t sl;                      /* Tunnel list spinlock. */
        struct mlx5_hlist *groups;              /** non tunnel groups */
 };
 
@@ -1430,4 +1430,42 @@ struct mlx5_hlist_entry *flow_dv_encap_decap_create_cb(struct mlx5_hlist *list,
                                uint64_t key, void *cb_ctx);
 void flow_dv_encap_decap_remove_cb(struct mlx5_hlist *list,
                                   struct mlx5_hlist_entry *entry);
+
+int flow_dv_matcher_match_cb(struct mlx5_cache_list *list,
+                            struct mlx5_cache_entry *entry, void *ctx);
+struct mlx5_cache_entry *flow_dv_matcher_create_cb(struct mlx5_cache_list *list,
+               struct mlx5_cache_entry *entry, void *ctx);
+void flow_dv_matcher_remove_cb(struct mlx5_cache_list *list,
+                              struct mlx5_cache_entry *entry);
+
+int flow_dv_port_id_match_cb(struct mlx5_cache_list *list,
+                            struct mlx5_cache_entry *entry, void *cb_ctx);
+struct mlx5_cache_entry *flow_dv_port_id_create_cb(struct mlx5_cache_list *list,
+               struct mlx5_cache_entry *entry, void *cb_ctx);
+void flow_dv_port_id_remove_cb(struct mlx5_cache_list *list,
+                              struct mlx5_cache_entry *entry);
+
+int flow_dv_push_vlan_match_cb(struct mlx5_cache_list *list,
+                              struct mlx5_cache_entry *entry, void *cb_ctx);
+struct mlx5_cache_entry *flow_dv_push_vlan_create_cb
+                               (struct mlx5_cache_list *list,
+                                struct mlx5_cache_entry *entry, void *cb_ctx);
+void flow_dv_push_vlan_remove_cb(struct mlx5_cache_list *list,
+                                struct mlx5_cache_entry *entry);
+
+int flow_dv_sample_match_cb(struct mlx5_cache_list *list,
+                           struct mlx5_cache_entry *entry, void *cb_ctx);
+struct mlx5_cache_entry *flow_dv_sample_create_cb
+                               (struct mlx5_cache_list *list,
+                                struct mlx5_cache_entry *entry, void *cb_ctx);
+void flow_dv_sample_remove_cb(struct mlx5_cache_list *list,
+                             struct mlx5_cache_entry *entry);
+
+int flow_dv_dest_array_match_cb(struct mlx5_cache_list *list,
+                               struct mlx5_cache_entry *entry, void *cb_ctx);
+struct mlx5_cache_entry *flow_dv_dest_array_create_cb
+                               (struct mlx5_cache_list *list,
+                                struct mlx5_cache_entry *entry, void *cb_ctx);
+void flow_dv_dest_array_remove_cb(struct mlx5_cache_list *list,
+                                 struct mlx5_cache_entry *entry);
 #endif /* RTE_PMD_MLX5_FLOW_H_ */