Commit acff797c authored by Maor Gottlieb's avatar Maor Gottlieb Committed by David S. Miller

net/mlx5e: Refactor mlx5e flow steering structs

Slightly refactor and re-order the flow steering structs,
tables and data-bases for better self-containment and
flexibility to add more future steering phases
(tables/rules/data bases) e.g: aRFS.

Changes:
1. Move the vlan DB and address DB into their table structs.
2. Rename steering table structs to unique format: mlx5e_*_table,
e.g: mlx5e_vlan_table.
Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 13de6c10
...@@ -388,6 +388,17 @@ enum mlx5e_traffic_types { ...@@ -388,6 +388,17 @@ enum mlx5e_traffic_types {
MLX5E_NUM_INDIR_TIRS = MLX5E_TT_ANY, MLX5E_NUM_INDIR_TIRS = MLX5E_TT_ANY,
}; };
enum {
MLX5E_STATE_ASYNC_EVENTS_ENABLE,
MLX5E_STATE_OPENED,
MLX5E_STATE_DESTROYING,
};
struct mlx5e_vxlan_db {
spinlock_t lock; /* protect vxlan table */
struct radix_tree_root tree;
};
struct mlx5e_eth_addr_info { struct mlx5e_eth_addr_info {
u8 addr[ETH_ALEN + 2]; u8 addr[ETH_ALEN + 2];
u32 tt_vec; u32 tt_vec;
...@@ -396,7 +407,14 @@ struct mlx5e_eth_addr_info { ...@@ -396,7 +407,14 @@ struct mlx5e_eth_addr_info {
#define MLX5E_ETH_ADDR_HASH_SIZE (1 << BITS_PER_BYTE) #define MLX5E_ETH_ADDR_HASH_SIZE (1 << BITS_PER_BYTE)
struct mlx5e_eth_addr_db { struct mlx5e_flow_table {
int num_groups;
struct mlx5_flow_table *t;
struct mlx5_flow_group **g;
};
struct mlx5e_main_table {
struct mlx5e_flow_table ft;
struct hlist_head netdev_uc[MLX5E_ETH_ADDR_HASH_SIZE]; struct hlist_head netdev_uc[MLX5E_ETH_ADDR_HASH_SIZE];
struct hlist_head netdev_mc[MLX5E_ETH_ADDR_HASH_SIZE]; struct hlist_head netdev_mc[MLX5E_ETH_ADDR_HASH_SIZE];
struct mlx5e_eth_addr_info broadcast; struct mlx5e_eth_addr_info broadcast;
...@@ -407,13 +425,15 @@ struct mlx5e_eth_addr_db { ...@@ -407,13 +425,15 @@ struct mlx5e_eth_addr_db {
bool promisc_enabled; bool promisc_enabled;
}; };
enum { struct mlx5e_tc_table {
MLX5E_STATE_ASYNC_EVENTS_ENABLE, struct mlx5_flow_table *t;
MLX5E_STATE_OPENED,
MLX5E_STATE_DESTROYING, struct rhashtable_params ht_params;
struct rhashtable ht;
}; };
struct mlx5e_vlan_db { struct mlx5e_vlan_table {
struct mlx5e_flow_table ft;
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
struct mlx5_flow_rule *active_vlans_rule[VLAN_N_VID]; struct mlx5_flow_rule *active_vlans_rule[VLAN_N_VID];
struct mlx5_flow_rule *untagged_rule; struct mlx5_flow_rule *untagged_rule;
...@@ -421,29 +441,11 @@ struct mlx5e_vlan_db { ...@@ -421,29 +441,11 @@ struct mlx5e_vlan_db {
bool filter_disabled; bool filter_disabled;
}; };
struct mlx5e_vxlan_db { struct mlx5e_flow_steering {
spinlock_t lock; /* protect vxlan table */ struct mlx5_flow_namespace *ns;
struct radix_tree_root tree; struct mlx5e_tc_table tc;
}; struct mlx5e_vlan_table vlan;
struct mlx5e_main_table main;
struct mlx5e_flow_table {
int num_groups;
struct mlx5_flow_table *t;
struct mlx5_flow_group **g;
};
struct mlx5e_tc_flow_table {
struct mlx5_flow_table *t;
struct rhashtable_params ht_params;
struct rhashtable ht;
};
struct mlx5e_flow_tables {
struct mlx5_flow_namespace *ns;
struct mlx5e_tc_flow_table tc;
struct mlx5e_flow_table vlan;
struct mlx5e_flow_table main;
}; };
struct mlx5e_direct_tir { struct mlx5e_direct_tir {
...@@ -451,6 +453,11 @@ struct mlx5e_direct_tir { ...@@ -451,6 +453,11 @@ struct mlx5e_direct_tir {
u32 rqtn; u32 rqtn;
}; };
enum {
MLX5E_TC_PRIO = 0,
MLX5E_NIC_PRIO
};
struct mlx5e_priv { struct mlx5e_priv {
/* priv data path fields - start */ /* priv data path fields - start */
struct mlx5e_sq **txq_to_sq_map; struct mlx5e_sq **txq_to_sq_map;
...@@ -472,9 +479,7 @@ struct mlx5e_priv { ...@@ -472,9 +479,7 @@ struct mlx5e_priv {
u32 indir_tirn[MLX5E_NUM_INDIR_TIRS]; u32 indir_tirn[MLX5E_NUM_INDIR_TIRS];
struct mlx5e_direct_tir direct_tir[MLX5E_MAX_NUM_CHANNELS]; struct mlx5e_direct_tir direct_tir[MLX5E_MAX_NUM_CHANNELS];
struct mlx5e_flow_tables fts; struct mlx5e_flow_steering fs;
struct mlx5e_eth_addr_db eth_addr;
struct mlx5e_vlan_db vlan;
struct mlx5e_vxlan_db vxlan; struct mlx5e_vxlan_db vxlan;
struct mlx5e_params params; struct mlx5e_params params;
...@@ -556,8 +561,8 @@ struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq); ...@@ -556,8 +561,8 @@ struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq);
void mlx5e_update_stats(struct mlx5e_priv *priv); void mlx5e_update_stats(struct mlx5e_priv *priv);
int mlx5e_create_flow_tables(struct mlx5e_priv *priv); int mlx5e_create_flow_steering(struct mlx5e_priv *priv);
void mlx5e_destroy_flow_tables(struct mlx5e_priv *priv); void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv);
void mlx5e_init_eth_addr(struct mlx5e_priv *priv); void mlx5e_init_eth_addr(struct mlx5e_priv *priv);
void mlx5e_set_rx_mode_work(struct work_struct *work); void mlx5e_set_rx_mode_work(struct work_struct *work);
......
...@@ -2969,9 +2969,9 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev) ...@@ -2969,9 +2969,9 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
goto err_destroy_rqts; goto err_destroy_rqts;
} }
err = mlx5e_create_flow_tables(priv); err = mlx5e_create_flow_steering(priv);
if (err) { if (err) {
mlx5_core_warn(mdev, "create flow tables failed, %d\n", err); mlx5_core_warn(mdev, "create flow steering failed, %d\n", err);
goto err_destroy_tirs; goto err_destroy_tirs;
} }
...@@ -3011,7 +3011,7 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev) ...@@ -3011,7 +3011,7 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
err_dealloc_q_counters: err_dealloc_q_counters:
mlx5e_destroy_q_counter(priv); mlx5e_destroy_q_counter(priv);
mlx5e_destroy_flow_tables(priv); mlx5e_destroy_flow_steering(priv);
err_destroy_tirs: err_destroy_tirs:
mlx5e_destroy_tirs(priv); mlx5e_destroy_tirs(priv);
...@@ -3069,7 +3069,7 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv) ...@@ -3069,7 +3069,7 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
mlx5e_tc_cleanup(priv); mlx5e_tc_cleanup(priv);
mlx5e_vxlan_cleanup(priv); mlx5e_vxlan_cleanup(priv);
mlx5e_destroy_q_counter(priv); mlx5e_destroy_q_counter(priv);
mlx5e_destroy_flow_tables(priv); mlx5e_destroy_flow_steering(priv);
mlx5e_destroy_tirs(priv); mlx5e_destroy_tirs(priv);
mlx5e_destroy_rqts(priv); mlx5e_destroy_rqts(priv);
mlx5e_close_drop_rq(priv); mlx5e_close_drop_rq(priv);
......
...@@ -46,8 +46,8 @@ struct mlx5e_tc_flow { ...@@ -46,8 +46,8 @@ struct mlx5e_tc_flow {
struct mlx5_flow_rule *rule; struct mlx5_flow_rule *rule;
}; };
#define MLX5E_TC_FLOW_TABLE_NUM_ENTRIES 1024 #define MLX5E_TC_TABLE_NUM_ENTRIES 1024
#define MLX5E_TC_FLOW_TABLE_NUM_GROUPS 4 #define MLX5E_TC_TABLE_NUM_GROUPS 4
static struct mlx5_flow_rule *mlx5e_tc_add_flow(struct mlx5e_priv *priv, static struct mlx5_flow_rule *mlx5e_tc_add_flow(struct mlx5e_priv *priv,
u32 *match_c, u32 *match_v, u32 *match_c, u32 *match_v,
...@@ -55,34 +55,35 @@ static struct mlx5_flow_rule *mlx5e_tc_add_flow(struct mlx5e_priv *priv, ...@@ -55,34 +55,35 @@ static struct mlx5_flow_rule *mlx5e_tc_add_flow(struct mlx5e_priv *priv,
{ {
struct mlx5_flow_destination dest = { struct mlx5_flow_destination dest = {
.type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE, .type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE,
{.ft = priv->fts.vlan.t}, {.ft = priv->fs.vlan.ft.t},
}; };
struct mlx5_flow_rule *rule; struct mlx5_flow_rule *rule;
bool table_created = false; bool table_created = false;
if (IS_ERR_OR_NULL(priv->fts.tc.t)) { if (IS_ERR_OR_NULL(priv->fs.tc.t)) {
priv->fts.tc.t = priv->fs.tc.t =
mlx5_create_auto_grouped_flow_table(priv->fts.ns, 0, mlx5_create_auto_grouped_flow_table(priv->fs.ns,
MLX5E_TC_FLOW_TABLE_NUM_ENTRIES, MLX5E_TC_PRIO,
MLX5E_TC_FLOW_TABLE_NUM_GROUPS, MLX5E_TC_TABLE_NUM_ENTRIES,
MLX5E_TC_TABLE_NUM_GROUPS,
0); 0);
if (IS_ERR(priv->fts.tc.t)) { if (IS_ERR(priv->fs.tc.t)) {
netdev_err(priv->netdev, netdev_err(priv->netdev,
"Failed to create tc offload table\n"); "Failed to create tc offload table\n");
return ERR_CAST(priv->fts.tc.t); return ERR_CAST(priv->fs.tc.t);
} }
table_created = true; table_created = true;
} }
rule = mlx5_add_flow_rule(priv->fts.tc.t, MLX5_MATCH_OUTER_HEADERS, rule = mlx5_add_flow_rule(priv->fs.tc.t, MLX5_MATCH_OUTER_HEADERS,
match_c, match_v, match_c, match_v,
action, flow_tag, action, flow_tag,
action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST ? &dest : NULL); action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST ? &dest : NULL);
if (IS_ERR(rule) && table_created) { if (IS_ERR(rule) && table_created) {
mlx5_destroy_flow_table(priv->fts.tc.t); mlx5_destroy_flow_table(priv->fs.tc.t);
priv->fts.tc.t = NULL; priv->fs.tc.t = NULL;
} }
return rule; return rule;
...@@ -94,8 +95,8 @@ static void mlx5e_tc_del_flow(struct mlx5e_priv *priv, ...@@ -94,8 +95,8 @@ static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
mlx5_del_flow_rule(rule); mlx5_del_flow_rule(rule);
if (!mlx5e_tc_num_filters(priv)) { if (!mlx5e_tc_num_filters(priv)) {
mlx5_destroy_flow_table(priv->fts.tc.t); mlx5_destroy_flow_table(priv->fs.tc.t);
priv->fts.tc.t = NULL; priv->fs.tc.t = NULL;
} }
} }
...@@ -311,7 +312,7 @@ static int parse_tc_actions(struct mlx5e_priv *priv, struct tcf_exts *exts, ...@@ -311,7 +312,7 @@ static int parse_tc_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol, int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
struct tc_cls_flower_offload *f) struct tc_cls_flower_offload *f)
{ {
struct mlx5e_tc_flow_table *tc = &priv->fts.tc; struct mlx5e_tc_table *tc = &priv->fs.tc;
u32 *match_c; u32 *match_c;
u32 *match_v; u32 *match_v;
int err = 0; int err = 0;
...@@ -377,7 +378,7 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv, ...@@ -377,7 +378,7 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv,
struct tc_cls_flower_offload *f) struct tc_cls_flower_offload *f)
{ {
struct mlx5e_tc_flow *flow; struct mlx5e_tc_flow *flow;
struct mlx5e_tc_flow_table *tc = &priv->fts.tc; struct mlx5e_tc_table *tc = &priv->fs.tc;
flow = rhashtable_lookup_fast(&tc->ht, &f->cookie, flow = rhashtable_lookup_fast(&tc->ht, &f->cookie,
tc->ht_params); tc->ht_params);
...@@ -402,7 +403,7 @@ static const struct rhashtable_params mlx5e_tc_flow_ht_params = { ...@@ -402,7 +403,7 @@ static const struct rhashtable_params mlx5e_tc_flow_ht_params = {
int mlx5e_tc_init(struct mlx5e_priv *priv) int mlx5e_tc_init(struct mlx5e_priv *priv)
{ {
struct mlx5e_tc_flow_table *tc = &priv->fts.tc; struct mlx5e_tc_table *tc = &priv->fs.tc;
tc->ht_params = mlx5e_tc_flow_ht_params; tc->ht_params = mlx5e_tc_flow_ht_params;
return rhashtable_init(&tc->ht, &tc->ht_params); return rhashtable_init(&tc->ht, &tc->ht_params);
...@@ -419,12 +420,12 @@ static void _mlx5e_tc_del_flow(void *ptr, void *arg) ...@@ -419,12 +420,12 @@ static void _mlx5e_tc_del_flow(void *ptr, void *arg)
void mlx5e_tc_cleanup(struct mlx5e_priv *priv) void mlx5e_tc_cleanup(struct mlx5e_priv *priv)
{ {
struct mlx5e_tc_flow_table *tc = &priv->fts.tc; struct mlx5e_tc_table *tc = &priv->fs.tc;
rhashtable_free_and_destroy(&tc->ht, _mlx5e_tc_del_flow, priv); rhashtable_free_and_destroy(&tc->ht, _mlx5e_tc_del_flow, priv);
if (!IS_ERR_OR_NULL(priv->fts.tc.t)) { if (!IS_ERR_OR_NULL(tc->t)) {
mlx5_destroy_flow_table(priv->fts.tc.t); mlx5_destroy_flow_table(tc->t);
priv->fts.tc.t = NULL; tc->t = NULL;
} }
} }
...@@ -45,7 +45,7 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv, ...@@ -45,7 +45,7 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv,
static inline int mlx5e_tc_num_filters(struct mlx5e_priv *priv) static inline int mlx5e_tc_num_filters(struct mlx5e_priv *priv)
{ {
return atomic_read(&priv->fts.tc.ht.nelems); return atomic_read(&priv->fs.tc.ht.nelems);
} }
#endif /* __MLX5_EN_TC_H__ */ #endif /* __MLX5_EN_TC_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment