OSDN Git Service

nfp: flower-ct: add ct zone table
authorLouis Peens <louis.peens@corigine.com>
Wed, 2 Jun 2021 11:59:47 +0000 (13:59 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Jun 2021 21:04:42 +0000 (14:04 -0700)
Add initial zone table to nfp_flower_priv. This table will be used
to store all the information required to offload conntrack.

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.h
drivers/net/ethernet/netronome/nfp/flower/main.h
drivers/net/ethernet/netronome/nfp/flower/metadata.c

index e8d034b..5f1f54c 100644 (file)
@@ -6,6 +6,23 @@
 
 #include "main.h"
 
+extern const struct rhashtable_params nfp_zone_table_params;
+
+/**
+ * struct nfp_fl_ct_zone_entry - Zone entry containing conntrack flow information
+ * @zone:      The zone number, used as lookup key in hashtable
+ * @hash_node: Used by the hashtable
+ * @priv:      Pointer to nfp_flower_priv data
+ * @nft:       Pointer to nf_flowtable for this zone
+ */
+struct nfp_fl_ct_zone_entry {
+       u16 zone;
+       struct rhash_head hash_node;
+
+       struct nfp_flower_priv *priv;
+       struct nf_flowtable *nft;
+};
+
 bool is_pre_ct_flow(struct flow_cls_offload *flow);
 bool is_post_ct_flow(struct flow_cls_offload *flow);
 
index 3137792..0073851 100644 (file)
@@ -193,6 +193,7 @@ struct nfp_fl_internal_ports {
  * @qos_stats_lock:    Lock on qos stats updates
  * @pre_tun_rule_cnt:  Number of pre-tunnel rules offloaded
  * @merge_table:       Hash table to store merged flows
+ * @ct_zone_table:     Hash table used to store the different zones
  */
 struct nfp_flower_priv {
        struct nfp_app *app;
@@ -227,6 +228,7 @@ struct nfp_flower_priv {
        spinlock_t qos_stats_lock; /* Protect the qos stats */
        int pre_tun_rule_cnt;
        struct rhashtable merge_table;
+       struct rhashtable ct_zone_table;
 };
 
 /**
index 327bb56..4a00ce8 100644 (file)
@@ -9,6 +9,7 @@
 #include <net/pkt_cls.h>
 
 #include "cmsg.h"
+#include "conntrack.h"
 #include "main.h"
 #include "../nfp_app.h"
 
@@ -496,6 +497,13 @@ const struct rhashtable_params merge_table_params = {
        .key_len        = sizeof(u64),
 };
 
+const struct rhashtable_params nfp_zone_table_params = {
+       .head_offset            = offsetof(struct nfp_fl_ct_zone_entry, hash_node),
+       .key_len                = sizeof(u16),
+       .key_offset             = offsetof(struct nfp_fl_ct_zone_entry, zone),
+       .automatic_shrinking    = false,
+};
+
 int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
                             unsigned int host_num_mems)
 {
@@ -516,6 +524,10 @@ int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
        if (err)
                goto err_free_stats_ctx_table;
 
+       err = rhashtable_init(&priv->ct_zone_table, &nfp_zone_table_params);
+       if (err)
+               goto err_free_merge_table;
+
        get_random_bytes(&priv->mask_id_seed, sizeof(priv->mask_id_seed));
 
        /* Init ring buffer and unallocated mask_ids. */
@@ -523,7 +535,7 @@ int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
                kmalloc_array(NFP_FLOWER_MASK_ENTRY_RS,
                              NFP_FLOWER_MASK_ELEMENT_RS, GFP_KERNEL);
        if (!priv->mask_ids.mask_id_free_list.buf)
-               goto err_free_merge_table;
+               goto err_free_ct_zone_table;
 
        priv->mask_ids.init_unallocated = NFP_FLOWER_MASK_ENTRY_RS - 1;
 
@@ -560,6 +572,8 @@ err_free_last_used:
        kfree(priv->mask_ids.last_used);
 err_free_mask_id:
        kfree(priv->mask_ids.mask_id_free_list.buf);
+err_free_ct_zone_table:
+       rhashtable_destroy(&priv->ct_zone_table);
 err_free_merge_table:
        rhashtable_destroy(&priv->merge_table);
 err_free_stats_ctx_table:
@@ -569,6 +583,10 @@ err_free_flow_table:
        return -ENOMEM;
 }
 
+static void nfp_free_zone_table_entry(void *ptr, void *arg)
+{
+}
+
 void nfp_flower_metadata_cleanup(struct nfp_app *app)
 {
        struct nfp_flower_priv *priv = app->priv;
@@ -582,6 +600,8 @@ void nfp_flower_metadata_cleanup(struct nfp_app *app)
                                    nfp_check_rhashtable_empty, NULL);
        rhashtable_free_and_destroy(&priv->merge_table,
                                    nfp_check_rhashtable_empty, NULL);
+       rhashtable_free_and_destroy(&priv->ct_zone_table,
+                                   nfp_free_zone_table_entry, NULL);
        kvfree(priv->stats);
        kfree(priv->mask_ids.mask_id_free_list.buf);
        kfree(priv->mask_ids.last_used);