Skip to content

Commit ef38135

Browse files
ozshlomoSaeed Mahameed
authored andcommitted
net/mlx5e: Replace egdev with indirect block notifications
Use TC indirect block notifications to offload filters that are configured on higher level device interfaces (e.g. tunnel devices). This mechanism replaces the current egdev implementation. Signed-off-by: Oz Shlomo <[email protected]> Reviewed-by: Eli Britstein <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent d11afc2 commit ef38135

File tree

2 files changed

+36
-25
lines changed

2 files changed

+36
-25
lines changed

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

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,27 @@ mlx5e_rep_indr_offload(struct net_device *netdev,
561561
struct tc_cls_flower_offload *flower,
562562
struct mlx5e_rep_indr_block_priv *indr_priv)
563563
{
564-
return -EOPNOTSUPP;
564+
int err = 0;
565+
struct mlx5e_priv *priv = netdev_priv(indr_priv->rpriv->netdev);
566+
567+
switch (flower->command) {
568+
case TC_CLSFLOWER_REPLACE:
569+
err = mlx5e_configure_flower(netdev, priv,
570+
flower, MLX5E_TC_EGRESS);
571+
break;
572+
case TC_CLSFLOWER_DESTROY:
573+
err = mlx5e_delete_flower(netdev, priv,
574+
flower, MLX5E_TC_EGRESS);
575+
break;
576+
case TC_CLSFLOWER_STATS:
577+
err = mlx5e_stats_flower(netdev, priv,
578+
flower, MLX5E_TC_EGRESS);
579+
break;
580+
default:
581+
err = -EOPNOTSUPP;
582+
}
583+
584+
return err;
565585
}
566586

567587
static int mlx5e_rep_indr_setup_block_cb(enum tc_setup_type type,
@@ -1020,19 +1040,6 @@ mlx5e_rep_setup_tc_cls_flower(struct mlx5e_priv *priv,
10201040
}
10211041
}
10221042

1023-
static int mlx5e_rep_setup_tc_cb_egdev(enum tc_setup_type type, void *type_data,
1024-
void *cb_priv)
1025-
{
1026-
struct mlx5e_priv *priv = cb_priv;
1027-
1028-
switch (type) {
1029-
case TC_SETUP_CLSFLOWER:
1030-
return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_EGRESS);
1031-
default:
1032-
return -EOPNOTSUPP;
1033-
}
1034-
}
1035-
10361043
static int mlx5e_rep_setup_tc_cb(enum tc_setup_type type, void *type_data,
10371044
void *cb_priv)
10381045
{
@@ -1516,24 +1523,16 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
15161523

15171524
uplink_rpriv = mlx5_eswitch_get_uplink_priv(dev->priv.eswitch, REP_ETH);
15181525
upriv = netdev_priv(uplink_rpriv->netdev);
1519-
err = tc_setup_cb_egdev_register(netdev, mlx5e_rep_setup_tc_cb_egdev,
1520-
upriv);
1521-
if (err)
1522-
goto err_neigh_cleanup;
15231526

15241527
err = register_netdev(netdev);
15251528
if (err) {
15261529
pr_warn("Failed to register representor netdev for vport %d\n",
15271530
rep->vport);
1528-
goto err_egdev_cleanup;
1531+
goto err_neigh_cleanup;
15291532
}
15301533

15311534
return 0;
15321535

1533-
err_egdev_cleanup:
1534-
tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
1535-
upriv);
1536-
15371536
err_neigh_cleanup:
15381537
mlx5e_rep_neigh_cleanup(rpriv);
15391538

@@ -1560,8 +1559,6 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
15601559
uplink_rpriv = mlx5_eswitch_get_uplink_priv(priv->mdev->priv.eswitch,
15611560
REP_ETH);
15621561
upriv = netdev_priv(uplink_rpriv->netdev);
1563-
tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
1564-
upriv);
15651562
mlx5e_rep_neigh_cleanup(rpriv);
15661563
mlx5e_detach_netdev(priv);
15671564
mlx5e_destroy_netdev(priv);

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2906,6 +2906,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
29062906
struct net_device *out_dev;
29072907

29082908
out_dev = tcf_mirred_dev(a);
2909+
if (!out_dev) {
2910+
/* out_dev is NULL when filters with
2911+
* non-existing mirred device are replayed to
2912+
* the driver.
2913+
*/
2914+
return -EINVAL;
2915+
}
29092916

29102917
if (attr->out_count >= MLX5_MAX_FLOW_FWD_VPORTS) {
29112918
NL_SET_ERR_MSG_MOD(extack,
@@ -2932,6 +2939,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
29322939
MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
29332940
MLX5_FLOW_CONTEXT_ACTION_COUNT;
29342941
/* attr->out_rep is resolved when we handle encap */
2942+
} else if (parse_attr->filter_dev != priv->netdev) {
2943+
/* All mlx5 devices are called to configure
2944+
* high level device filters. Therefore, the
2945+
* *attempt* to install a filter on invalid
2946+
* eswitch should not trigger an explicit error
2947+
*/
2948+
return -EINVAL;
29352949
} else {
29362950
NL_SET_ERR_MSG_MOD(extack,
29372951
"devices are not on same switch HW, can't offload forwarding");

0 commit comments

Comments
 (0)