mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 15:10:38 +00:00
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 <ozsh@mellanox.com> Reviewed-by: Eli Britstein <elibr@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
d11afc2600
commit
ef381359e3
@ -561,7 +561,27 @@ mlx5e_rep_indr_offload(struct net_device *netdev,
|
||||
struct tc_cls_flower_offload *flower,
|
||||
struct mlx5e_rep_indr_block_priv *indr_priv)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
int err = 0;
|
||||
struct mlx5e_priv *priv = netdev_priv(indr_priv->rpriv->netdev);
|
||||
|
||||
switch (flower->command) {
|
||||
case TC_CLSFLOWER_REPLACE:
|
||||
err = mlx5e_configure_flower(netdev, priv,
|
||||
flower, MLX5E_TC_EGRESS);
|
||||
break;
|
||||
case TC_CLSFLOWER_DESTROY:
|
||||
err = mlx5e_delete_flower(netdev, priv,
|
||||
flower, MLX5E_TC_EGRESS);
|
||||
break;
|
||||
case TC_CLSFLOWER_STATS:
|
||||
err = mlx5e_stats_flower(netdev, priv,
|
||||
flower, MLX5E_TC_EGRESS);
|
||||
break;
|
||||
default:
|
||||
err = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
static int mlx5e_rep_setup_tc_cb_egdev(enum tc_setup_type type, void *type_data,
|
||||
void *cb_priv)
|
||||
{
|
||||
struct mlx5e_priv *priv = cb_priv;
|
||||
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSFLOWER:
|
||||
return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_EGRESS);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int mlx5e_rep_setup_tc_cb(enum tc_setup_type type, void *type_data,
|
||||
void *cb_priv)
|
||||
{
|
||||
@ -1516,24 +1523,16 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
|
||||
|
||||
uplink_rpriv = mlx5_eswitch_get_uplink_priv(dev->priv.eswitch, REP_ETH);
|
||||
upriv = netdev_priv(uplink_rpriv->netdev);
|
||||
err = tc_setup_cb_egdev_register(netdev, mlx5e_rep_setup_tc_cb_egdev,
|
||||
upriv);
|
||||
if (err)
|
||||
goto err_neigh_cleanup;
|
||||
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
pr_warn("Failed to register representor netdev for vport %d\n",
|
||||
rep->vport);
|
||||
goto err_egdev_cleanup;
|
||||
goto err_neigh_cleanup;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_egdev_cleanup:
|
||||
tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
|
||||
upriv);
|
||||
|
||||
err_neigh_cleanup:
|
||||
mlx5e_rep_neigh_cleanup(rpriv);
|
||||
|
||||
@ -1560,8 +1559,6 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
|
||||
uplink_rpriv = mlx5_eswitch_get_uplink_priv(priv->mdev->priv.eswitch,
|
||||
REP_ETH);
|
||||
upriv = netdev_priv(uplink_rpriv->netdev);
|
||||
tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
|
||||
upriv);
|
||||
mlx5e_rep_neigh_cleanup(rpriv);
|
||||
mlx5e_detach_netdev(priv);
|
||||
mlx5e_destroy_netdev(priv);
|
||||
|
@ -2906,6 +2906,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
||||
struct net_device *out_dev;
|
||||
|
||||
out_dev = tcf_mirred_dev(a);
|
||||
if (!out_dev) {
|
||||
/* out_dev is NULL when filters with
|
||||
* non-existing mirred device are replayed to
|
||||
* the driver.
|
||||
*/
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (attr->out_count >= MLX5_MAX_FLOW_FWD_VPORTS) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
@ -2932,6 +2939,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
||||
MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
|
||||
MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||
/* attr->out_rep is resolved when we handle encap */
|
||||
} else if (parse_attr->filter_dev != priv->netdev) {
|
||||
/* All mlx5 devices are called to configure
|
||||
* high level device filters. Therefore, the
|
||||
* *attempt* to install a filter on invalid
|
||||
* eswitch should not trigger an explicit error
|
||||
*/
|
||||
return -EINVAL;
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"devices are not on same switch HW, can't offload forwarding");
|
||||
|
Loading…
x
Reference in New Issue
Block a user