Skip to content

Commit 65f586c

Browse files
Lama KayalSaeed Mahameed
authored andcommitted
net/mlx5e: Convert mlx5e_tc_table member of mlx5e_flow_steering to pointer
Make fs.tc be a pointer and allocate it dynamically. Add mlx5e_priv pointer to mlx5e_tc_table, and thus get a work-around to accessing priv via tc when handling tc events inside mlx5e_tc_netdev_event. Signed-off-by: Lama Kayal <[email protected]> Reviewed-by: Tariq Toukan <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 7d1a5ce commit 65f586c

File tree

4 files changed

+43
-34
lines changed

4 files changed

+43
-34
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct mlx5e_tc_table {
2020
* which is the nic tc root table.
2121
*/
2222
struct mutex t_lock;
23+
struct mlx5e_priv *priv;
2324
struct mlx5_flow_table *t;
2425
struct mlx5_flow_table *miss_t;
2526
struct mlx5_fs_chains *chains;
@@ -169,7 +170,7 @@ struct mlx5e_flow_steering {
169170
#ifdef CONFIG_MLX5_EN_RXNFC
170171
struct mlx5e_ethtool_steering ethtool;
171172
#endif
172-
struct mlx5e_tc_table tc;
173+
struct mlx5e_tc_table *tc;
173174
struct mlx5e_promisc_table promisc;
174175
struct mlx5e_vlan_table *vlan;
175176
struct mlx5e_l2_table l2;

drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#define MLX5E_TC_MAX_SPLITS 1
1313

14-
#define mlx5e_nic_chains(priv) ((priv)->fs.tc.chains)
14+
#define mlx5e_nic_chains(priv) ((priv)->fs.tc->chains)
1515

1616
enum {
1717
MLX5E_TC_FLOW_FLAG_INGRESS = MLX5E_TC_FLAG_INGRESS_BIT,

drivers/net/ethernet/mellanox/mlx5/core/en_fs.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1346,12 +1346,21 @@ int mlx5e_fs_init(struct mlx5e_priv *priv)
13461346
{
13471347
priv->fs.vlan = kvzalloc(sizeof(*priv->fs.vlan), GFP_KERNEL);
13481348
if (!priv->fs.vlan)
1349-
return -ENOMEM;
1349+
goto err;
1350+
priv->fs.tc = kvzalloc(sizeof(*priv->fs.tc), GFP_KERNEL);
1351+
if (!priv->fs.tc)
1352+
goto err_free_vlan;
13501353
return 0;
1354+
err_free_vlan:
1355+
kvfree(priv->fs.vlan);
1356+
priv->fs.vlan = NULL;
1357+
err:
1358+
return -ENOMEM;
13511359
}
13521360

13531361
void mlx5e_fs_cleanup(struct mlx5e_priv *priv)
13541362
{
1363+
kvfree(priv->fs.tc);
13551364
kvfree(priv->fs.vlan);
13561365
priv->fs.vlan = NULL;
13571366
}

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ get_ct_priv(struct mlx5e_priv *priv)
280280
return uplink_priv->ct_priv;
281281
}
282282

283-
return priv->fs.tc.ct;
283+
return priv->fs.tc->ct;
284284
}
285285

286286
static struct mlx5e_tc_psample *
@@ -314,7 +314,7 @@ get_post_action(struct mlx5e_priv *priv)
314314
return uplink_priv->post_act;
315315
}
316316

317-
return priv->fs.tc.post_act;
317+
return priv->fs.tc->post_act;
318318
}
319319

320320
struct mlx5_flow_handle *
@@ -569,7 +569,7 @@ get_mod_hdr_table(struct mlx5e_priv *priv, struct mlx5e_tc_flow *flow)
569569

570570
return mlx5e_get_flow_namespace(flow) == MLX5_FLOW_NAMESPACE_FDB ?
571571
&esw->offloads.mod_hdr :
572-
&priv->fs.tc.mod_hdr;
572+
&priv->fs.tc->mod_hdr;
573573
}
574574

575575
static int mlx5e_attach_mod_hdr(struct mlx5e_priv *priv,
@@ -877,7 +877,7 @@ static struct mlx5e_hairpin_entry *mlx5e_hairpin_get(struct mlx5e_priv *priv,
877877
struct mlx5e_hairpin_entry *hpe;
878878
u32 hash_key = hash_hairpin_info(peer_vhca_id, prio);
879879

880-
hash_for_each_possible(priv->fs.tc.hairpin_tbl, hpe,
880+
hash_for_each_possible(priv->fs.tc->hairpin_tbl, hpe,
881881
hairpin_hlist, hash_key) {
882882
if (hpe->peer_vhca_id == peer_vhca_id && hpe->prio == prio) {
883883
refcount_inc(&hpe->refcnt);
@@ -892,10 +892,10 @@ static void mlx5e_hairpin_put(struct mlx5e_priv *priv,
892892
struct mlx5e_hairpin_entry *hpe)
893893
{
894894
/* no more hairpin flows for us, release the hairpin pair */
895-
if (!refcount_dec_and_mutex_lock(&hpe->refcnt, &priv->fs.tc.hairpin_tbl_lock))
895+
if (!refcount_dec_and_mutex_lock(&hpe->refcnt, &priv->fs.tc->hairpin_tbl_lock))
896896
return;
897897
hash_del(&hpe->hairpin_hlist);
898-
mutex_unlock(&priv->fs.tc.hairpin_tbl_lock);
898+
mutex_unlock(&priv->fs.tc->hairpin_tbl_lock);
899899

900900
if (!IS_ERR_OR_NULL(hpe->hp)) {
901901
netdev_dbg(priv->netdev, "del hairpin: peer %s\n",
@@ -979,10 +979,10 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
979979
if (err)
980980
return err;
981981

982-
mutex_lock(&priv->fs.tc.hairpin_tbl_lock);
982+
mutex_lock(&priv->fs.tc->hairpin_tbl_lock);
983983
hpe = mlx5e_hairpin_get(priv, peer_id, match_prio);
984984
if (hpe) {
985-
mutex_unlock(&priv->fs.tc.hairpin_tbl_lock);
985+
mutex_unlock(&priv->fs.tc->hairpin_tbl_lock);
986986
wait_for_completion(&hpe->res_ready);
987987

988988
if (IS_ERR(hpe->hp)) {
@@ -994,7 +994,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
994994

995995
hpe = kzalloc(sizeof(*hpe), GFP_KERNEL);
996996
if (!hpe) {
997-
mutex_unlock(&priv->fs.tc.hairpin_tbl_lock);
997+
mutex_unlock(&priv->fs.tc->hairpin_tbl_lock);
998998
return -ENOMEM;
999999
}
10001000

@@ -1006,9 +1006,9 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
10061006
refcount_set(&hpe->refcnt, 1);
10071007
init_completion(&hpe->res_ready);
10081008

1009-
hash_add(priv->fs.tc.hairpin_tbl, &hpe->hairpin_hlist,
1009+
hash_add(priv->fs.tc->hairpin_tbl, &hpe->hairpin_hlist,
10101010
hash_hairpin_info(peer_id, match_prio));
1011-
mutex_unlock(&priv->fs.tc.hairpin_tbl_lock);
1011+
mutex_unlock(&priv->fs.tc->hairpin_tbl_lock);
10121012

10131013
params.log_data_size = 16;
10141014
params.log_data_size = min_t(u8, params.log_data_size,
@@ -1086,7 +1086,7 @@ mlx5e_add_offloaded_nic_rule(struct mlx5e_priv *priv,
10861086
struct mlx5_flow_context *flow_context = &spec->flow_context;
10871087
struct mlx5_fs_chains *nic_chains = mlx5e_nic_chains(priv);
10881088
struct mlx5_nic_flow_attr *nic_attr = attr->nic_attr;
1089-
struct mlx5e_tc_table *tc = &priv->fs.tc;
1089+
struct mlx5e_tc_table *tc = priv->fs.tc;
10901090
struct mlx5_flow_destination dest[2] = {};
10911091
struct mlx5_flow_act flow_act = {
10921092
.action = attr->action,
@@ -1148,7 +1148,7 @@ mlx5e_add_offloaded_nic_rule(struct mlx5e_priv *priv,
11481148
mutex_unlock(&tc->t_lock);
11491149
netdev_err(priv->netdev,
11501150
"Failed to create tc offload table\n");
1151-
rule = ERR_CAST(priv->fs.tc.t);
1151+
rule = ERR_CAST(priv->fs.tc->t);
11521152
goto err_ft_get;
11531153
}
11541154
}
@@ -1267,7 +1267,7 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
12671267
struct mlx5e_tc_flow *flow)
12681268
{
12691269
struct mlx5_flow_attr *attr = flow->attr;
1270-
struct mlx5e_tc_table *tc = &priv->fs.tc;
1270+
struct mlx5e_tc_table *tc = priv->fs.tc;
12711271

12721272
flow_flag_clear(flow, OFFLOADED);
12731273

@@ -1279,13 +1279,13 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
12791279
/* Remove root table if no rules are left to avoid
12801280
* extra steering hops.
12811281
*/
1282-
mutex_lock(&priv->fs.tc.t_lock);
1282+
mutex_lock(&priv->fs.tc->t_lock);
12831283
if (!mlx5e_tc_num_filters(priv, MLX5_TC_FLAG(NIC_OFFLOAD)) &&
12841284
!IS_ERR_OR_NULL(tc->t)) {
12851285
mlx5_chains_put_table(mlx5e_nic_chains(priv), 0, 1, MLX5E_TC_FT_LEVEL);
1286-
priv->fs.tc.t = NULL;
1286+
priv->fs.tc->t = NULL;
12871287
}
1288-
mutex_unlock(&priv->fs.tc.t_lock);
1288+
mutex_unlock(&priv->fs.tc->t_lock);
12891289

12901290
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
12911291
mlx5e_detach_mod_hdr(priv, flow);
@@ -4021,7 +4021,7 @@ static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv,
40214021
rpriv = priv->ppriv;
40224022
return &rpriv->tc_ht;
40234023
} else /* NIC offload */
4024-
return &priv->fs.tc.ht;
4024+
return &priv->fs.tc->ht;
40254025
}
40264026

40274027
static bool is_peer_flow_needed(struct mlx5e_tc_flow *flow)
@@ -4740,11 +4740,11 @@ static void mlx5e_tc_hairpin_update_dead_peer(struct mlx5e_priv *priv,
47404740

47414741
peer_vhca_id = MLX5_CAP_GEN(peer_mdev, vhca_id);
47424742

4743-
mutex_lock(&priv->fs.tc.hairpin_tbl_lock);
4744-
hash_for_each(priv->fs.tc.hairpin_tbl, bkt, hpe, hairpin_hlist)
4743+
mutex_lock(&priv->fs.tc->hairpin_tbl_lock);
4744+
hash_for_each(priv->fs.tc->hairpin_tbl, bkt, hpe, hairpin_hlist)
47454745
if (refcount_inc_not_zero(&hpe->refcnt))
47464746
list_add(&hpe->dead_peer_wait_list, &init_wait_list);
4747-
mutex_unlock(&priv->fs.tc.hairpin_tbl_lock);
4747+
mutex_unlock(&priv->fs.tc->hairpin_tbl_lock);
47484748

47494749
list_for_each_entry_safe(hpe, tmp, &init_wait_list, dead_peer_wait_list) {
47504750
wait_for_completion(&hpe->res_ready);
@@ -4759,7 +4759,6 @@ static int mlx5e_tc_netdev_event(struct notifier_block *this,
47594759
unsigned long event, void *ptr)
47604760
{
47614761
struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
4762-
struct mlx5e_flow_steering *fs;
47634762
struct mlx5e_priv *peer_priv;
47644763
struct mlx5e_tc_table *tc;
47654764
struct mlx5e_priv *priv;
@@ -4770,8 +4769,7 @@ static int mlx5e_tc_netdev_event(struct notifier_block *this,
47704769
return NOTIFY_DONE;
47714770

47724771
tc = container_of(this, struct mlx5e_tc_table, netdevice_nb);
4773-
fs = container_of(tc, struct mlx5e_flow_steering, tc);
4774-
priv = container_of(fs, struct mlx5e_priv, fs);
4772+
priv = tc->priv;
47754773
peer_priv = netdev_priv(ndev);
47764774
if (priv == peer_priv ||
47774775
!(priv->netdev->features & NETIF_F_HW_TC))
@@ -4800,7 +4798,7 @@ static int mlx5e_tc_nic_get_ft_size(struct mlx5_core_dev *dev)
48004798

48014799
static int mlx5e_tc_nic_create_miss_table(struct mlx5e_priv *priv)
48024800
{
4803-
struct mlx5_flow_table **ft = &priv->fs.tc.miss_t;
4801+
struct mlx5_flow_table **ft = &priv->fs.tc->miss_t;
48044802
struct mlx5_flow_table_attr ft_attr = {};
48054803
struct mlx5_flow_namespace *ns;
48064804
int err = 0;
@@ -4822,12 +4820,12 @@ static int mlx5e_tc_nic_create_miss_table(struct mlx5e_priv *priv)
48224820

48234821
static void mlx5e_tc_nic_destroy_miss_table(struct mlx5e_priv *priv)
48244822
{
4825-
mlx5_destroy_flow_table(priv->fs.tc.miss_t);
4823+
mlx5_destroy_flow_table(priv->fs.tc->miss_t);
48264824
}
48274825

48284826
int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
48294827
{
4830-
struct mlx5e_tc_table *tc = &priv->fs.tc;
4828+
struct mlx5e_tc_table *tc = priv->fs.tc;
48314829
struct mlx5_core_dev *dev = priv->mdev;
48324830
struct mapping_ctx *chains_mapping;
48334831
struct mlx5_chains_attr attr = {};
@@ -4838,6 +4836,7 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
48384836
mutex_init(&tc->t_lock);
48394837
mutex_init(&tc->hairpin_tbl_lock);
48404838
hash_init(tc->hairpin_tbl);
4839+
tc->priv = priv;
48414840

48424841
err = rhashtable_init(&tc->ht, &tc_ht_params);
48434842
if (err)
@@ -4867,7 +4866,7 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
48674866
attr.ns = MLX5_FLOW_NAMESPACE_KERNEL;
48684867
attr.max_ft_sz = mlx5e_tc_nic_get_ft_size(dev);
48694868
attr.max_grp_num = MLX5E_TC_TABLE_NUM_GROUPS;
4870-
attr.default_ft = priv->fs.tc.miss_t;
4869+
attr.default_ft = priv->fs.tc->miss_t;
48714870
attr.mapping = chains_mapping;
48724871

48734872
tc->chains = mlx5_chains_create(dev, &attr);
@@ -4877,7 +4876,7 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
48774876
}
48784877

48794878
tc->post_act = mlx5e_tc_post_act_init(priv, tc->chains, MLX5_FLOW_NAMESPACE_KERNEL);
4880-
tc->ct = mlx5_tc_ct_init(priv, tc->chains, &priv->fs.tc.mod_hdr,
4879+
tc->ct = mlx5_tc_ct_init(priv, tc->chains, &tc->mod_hdr,
48814880
MLX5_FLOW_NAMESPACE_KERNEL, tc->post_act);
48824881

48834882
tc->netdevice_nb.notifier_call = mlx5e_tc_netdev_event;
@@ -4916,7 +4915,7 @@ static void _mlx5e_tc_del_flow(void *ptr, void *arg)
49164915

49174916
void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv)
49184917
{
4919-
struct mlx5e_tc_table *tc = &priv->fs.tc;
4918+
struct mlx5e_tc_table *tc = priv->fs.tc;
49204919

49214920
if (tc->netdevice_nb.notifier_call)
49224921
unregister_netdevice_notifier_dev_net(priv->netdev,
@@ -5121,7 +5120,7 @@ bool mlx5e_tc_update_skb(struct mlx5_cqe64 *cqe,
51215120
#if IS_ENABLED(CONFIG_NET_TC_SKB_EXT)
51225121
u32 chain = 0, chain_tag, reg_b, zone_restore_id;
51235122
struct mlx5e_priv *priv = netdev_priv(skb->dev);
5124-
struct mlx5e_tc_table *tc = &priv->fs.tc;
5123+
struct mlx5e_tc_table *tc = priv->fs.tc;
51255124
struct mlx5_mapped_obj mapped_obj;
51265125
struct tc_skb_ext *tc_skb_ext;
51275126
int err;

0 commit comments

Comments
 (0)