nfp: flower-ct: add tc_merge_tb
authorLouis Peens <louis.peens@corigine.com>
Wed, 2 Jun 2021 11:59:51 +0000 (13:59 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Jun 2021 21:04:42 +0000 (14:04 -0700)
Add the table required to store the merge result of pre_ct and post_ct
flows. This is just the initial setup and teardown of the table,
the implementation will be in follow-up patches.

Signed-off-by: Louis Peens <louis.peens@corigine.com>
Signed-off-by: Yinjun Zhang <yinjun.zhang@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/flower/conntrack.c
drivers/net/ethernet/netronome/nfp/flower/conntrack.h
drivers/net/ethernet/netronome/nfp/flower/metadata.c

index f6f9722..afa0249 100644 (file)
@@ -3,6 +3,14 @@
 
 #include "conntrack.h"
 
+const struct rhashtable_params nfp_tc_ct_merge_params = {
+       .head_offset            = offsetof(struct nfp_fl_ct_tc_merge,
+                                          hash_node),
+       .key_len                = sizeof(unsigned long) * 2,
+       .key_offset             = offsetof(struct nfp_fl_ct_tc_merge, cookie),
+       .automatic_shrinking    = true,
+};
+
 /**
  * get_hashentry() - Wrapper around hashtable lookup.
  * @ht:                hashtable where entry could be found
@@ -87,6 +95,10 @@ nfp_fl_ct_zone_entry *get_nfp_zone_entry(struct nfp_flower_priv *priv,
        INIT_LIST_HEAD(&zt->pre_ct_list);
        INIT_LIST_HEAD(&zt->post_ct_list);
 
+       err = rhashtable_init(&zt->tc_merge_tb, &nfp_tc_ct_merge_params);
+       if (err)
+               goto err_tc_merge_tb_init;
+
        if (wildcarded) {
                priv->ct_zone_wc = zt;
        } else {
@@ -100,6 +112,8 @@ nfp_fl_ct_zone_entry *get_nfp_zone_entry(struct nfp_flower_priv *priv,
        return zt;
 
 err_zone_insert:
+       rhashtable_destroy(&zt->tc_merge_tb);
+err_tc_merge_tb_init:
        kfree(zt);
        return ERR_PTR(err);
 }
index a7f0d7c..3d7d260 100644 (file)
@@ -10,6 +10,7 @@
 
 extern const struct rhashtable_params nfp_zone_table_params;
 extern const struct rhashtable_params nfp_ct_map_params;
+extern const struct rhashtable_params nfp_tc_ct_merge_params;
 
 /**
  * struct nfp_fl_ct_zone_entry - Zone entry containing conntrack flow information
@@ -23,6 +24,9 @@ extern const struct rhashtable_params nfp_ct_map_params;
  *
  * @post_ct_list:      The post_ct_list of nfp_fl_ct_flow_entry entries
  * @post_ct_count:     Keep count of the number of post_ct entries
+ *
+ * @tc_merge_tb:       The table of merged tc flows
+ * @tc_merge_count:    Keep count of the number of merged tc entries
  */
 struct nfp_fl_ct_zone_entry {
        u16 zone;
@@ -36,6 +40,9 @@ struct nfp_fl_ct_zone_entry {
 
        struct list_head post_ct_list;
        unsigned int post_ct_count;
+
+       struct rhashtable tc_merge_tb;
+       unsigned int tc_merge_count;
 };
 
 enum ct_entry_type {
@@ -70,6 +77,28 @@ struct nfp_fl_ct_flow_entry {
        u8 tun_offset;          // Set to NFP_FL_CT_NO_TUN if no tun
 };
 
+/**
+ * struct nfp_fl_ct_tc_merge - Merge of two flows from tc
+ * @cookie:            Flow cookie, combination of pre and post ct cookies
+ * @hash_node:         Used by the hashtable
+ * @pre_ct_list:       This entry is part of a pre_ct_list
+ * @post_ct_list:      This entry is part of a post_ct_list
+ * @zt:                        Reference to the zone table this belongs to
+ * @pre_ct_parent:     The pre_ct_parent
+ * @post_ct_parent:    The post_ct_parent
+ * @children:          List of nft merged entries
+ */
+struct nfp_fl_ct_tc_merge {
+       unsigned long cookie[2];
+       struct rhash_head hash_node;
+       struct list_head pre_ct_list;
+       struct list_head post_ct_list;
+       struct nfp_fl_ct_zone_entry *zt;
+       struct nfp_fl_ct_flow_entry *pre_ct_parent;
+       struct nfp_fl_ct_flow_entry *post_ct_parent;
+       struct list_head children;
+};
+
 /**
  * struct nfp_fl_ct_map_entry - Map between flow cookie and specific ct_flow
  * @cookie:    Flow cookie, same as original TC flow, used as key
index 7654cf6..8658c5c 100644 (file)
@@ -638,6 +638,10 @@ static void nfp_zone_table_entry_destroy(struct nfp_fl_ct_zone_entry *zt)
                        kfree(map);
                }
        }
+
+       rhashtable_free_and_destroy(&zt->tc_merge_tb,
+                                   nfp_check_rhashtable_empty, NULL);
+
        kfree(zt);
 }