nfp: flower-ct: add ct zone table
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>
This commit is contained in:
committed by
David S. Miller
parent
c8b034fbeb
commit
e236e4849b
@@ -6,6 +6,23 @@
|
|||||||
|
|
||||||
#include "main.h"
|
#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_pre_ct_flow(struct flow_cls_offload *flow);
|
||||||
bool is_post_ct_flow(struct flow_cls_offload *flow);
|
bool is_post_ct_flow(struct flow_cls_offload *flow);
|
||||||
|
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ struct nfp_fl_internal_ports {
|
|||||||
* @qos_stats_lock: Lock on qos stats updates
|
* @qos_stats_lock: Lock on qos stats updates
|
||||||
* @pre_tun_rule_cnt: Number of pre-tunnel rules offloaded
|
* @pre_tun_rule_cnt: Number of pre-tunnel rules offloaded
|
||||||
* @merge_table: Hash table to store merged flows
|
* @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_flower_priv {
|
||||||
struct nfp_app *app;
|
struct nfp_app *app;
|
||||||
@@ -227,6 +228,7 @@ struct nfp_flower_priv {
|
|||||||
spinlock_t qos_stats_lock; /* Protect the qos stats */
|
spinlock_t qos_stats_lock; /* Protect the qos stats */
|
||||||
int pre_tun_rule_cnt;
|
int pre_tun_rule_cnt;
|
||||||
struct rhashtable merge_table;
|
struct rhashtable merge_table;
|
||||||
|
struct rhashtable ct_zone_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <net/pkt_cls.h>
|
#include <net/pkt_cls.h>
|
||||||
|
|
||||||
#include "cmsg.h"
|
#include "cmsg.h"
|
||||||
|
#include "conntrack.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "../nfp_app.h"
|
#include "../nfp_app.h"
|
||||||
|
|
||||||
@@ -496,6 +497,13 @@ const struct rhashtable_params merge_table_params = {
|
|||||||
.key_len = sizeof(u64),
|
.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,
|
int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
|
||||||
unsigned int host_num_mems)
|
unsigned int host_num_mems)
|
||||||
{
|
{
|
||||||
@@ -516,6 +524,10 @@ int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_free_stats_ctx_table;
|
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));
|
get_random_bytes(&priv->mask_id_seed, sizeof(priv->mask_id_seed));
|
||||||
|
|
||||||
/* Init ring buffer and unallocated mask_ids. */
|
/* 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,
|
kmalloc_array(NFP_FLOWER_MASK_ENTRY_RS,
|
||||||
NFP_FLOWER_MASK_ELEMENT_RS, GFP_KERNEL);
|
NFP_FLOWER_MASK_ELEMENT_RS, GFP_KERNEL);
|
||||||
if (!priv->mask_ids.mask_id_free_list.buf)
|
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;
|
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);
|
kfree(priv->mask_ids.last_used);
|
||||||
err_free_mask_id:
|
err_free_mask_id:
|
||||||
kfree(priv->mask_ids.mask_id_free_list.buf);
|
kfree(priv->mask_ids.mask_id_free_list.buf);
|
||||||
|
err_free_ct_zone_table:
|
||||||
|
rhashtable_destroy(&priv->ct_zone_table);
|
||||||
err_free_merge_table:
|
err_free_merge_table:
|
||||||
rhashtable_destroy(&priv->merge_table);
|
rhashtable_destroy(&priv->merge_table);
|
||||||
err_free_stats_ctx_table:
|
err_free_stats_ctx_table:
|
||||||
@@ -569,6 +583,10 @@ err_free_flow_table:
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nfp_free_zone_table_entry(void *ptr, void *arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void nfp_flower_metadata_cleanup(struct nfp_app *app)
|
void nfp_flower_metadata_cleanup(struct nfp_app *app)
|
||||||
{
|
{
|
||||||
struct nfp_flower_priv *priv = app->priv;
|
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);
|
nfp_check_rhashtable_empty, NULL);
|
||||||
rhashtable_free_and_destroy(&priv->merge_table,
|
rhashtable_free_and_destroy(&priv->merge_table,
|
||||||
nfp_check_rhashtable_empty, NULL);
|
nfp_check_rhashtable_empty, NULL);
|
||||||
|
rhashtable_free_and_destroy(&priv->ct_zone_table,
|
||||||
|
nfp_free_zone_table_entry, NULL);
|
||||||
kvfree(priv->stats);
|
kvfree(priv->stats);
|
||||||
kfree(priv->mask_ids.mask_id_free_list.buf);
|
kfree(priv->mask_ids.mask_id_free_list.buf);
|
||||||
kfree(priv->mask_ids.last_used);
|
kfree(priv->mask_ids.last_used);
|
||||||
|
|||||||
Reference in New Issue
Block a user