mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
net/mlx5e: Allow set_rx_mode on uplink representor
set_rx_mode handler was skipped on uplink representor, since uplink relies on FDB to forward all traffic to it by default, which works perfectly on a single PF per physical port configuration, as explicit mac request isn't required, but In case of multi-host and DPU environments, uplink can only use own mac address, as set_rx_mode wasn't honored in uplink rep. Since MPFs (Multi PF switch) requires PFs to request explicit mac forwarding, this patch enables set_rx_mode on uplink representor to allow PF mac programming into MPFs table in switchdev mode, allowing use-cases such as arbitrary mac address forwarding via linux bridge. Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Reviewed-by: Mark Bloch <mbloch@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/20260319005456.82745-1-saeed@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
2e69e55897
commit
609e79253a
@@ -822,8 +822,14 @@ static void mlx5e_destroy_promisc_table(struct mlx5e_flow_steering *fs)
|
||||
void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5e_l2_table *ea = &fs->l2;
|
||||
|
||||
if (mlx5e_is_uplink_rep(priv)) {
|
||||
mlx5e_handle_netdev_addr(fs, netdev);
|
||||
goto update_vport_context;
|
||||
}
|
||||
|
||||
bool rx_mode_enable = fs->state_destroy;
|
||||
bool promisc_enabled = rx_mode_enable && (netdev->flags & IFF_PROMISC);
|
||||
bool allmulti_enabled = rx_mode_enable && (netdev->flags & IFF_ALLMULTI);
|
||||
@@ -863,6 +869,7 @@ void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs,
|
||||
ea->allmulti_enabled = allmulti_enabled;
|
||||
ea->broadcast_enabled = broadcast_enabled;
|
||||
|
||||
update_vport_context:
|
||||
mlx5e_vport_context_update(fs, netdev);
|
||||
}
|
||||
|
||||
@@ -983,6 +990,9 @@ static int mlx5e_add_l2_flow_rule(struct mlx5e_flow_steering *fs,
|
||||
u8 *mc_dmac;
|
||||
u8 *mv_dmac;
|
||||
|
||||
if (!ft)
|
||||
return -EINVAL;
|
||||
|
||||
spec = kvzalloc_obj(*spec);
|
||||
if (!spec)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -4102,9 +4102,6 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
||||
|
||||
static void mlx5e_nic_set_rx_mode(struct mlx5e_priv *priv)
|
||||
{
|
||||
if (mlx5e_is_uplink_rep(priv))
|
||||
return; /* no rx mode for uplink rep */
|
||||
|
||||
queue_work(priv->wq, &priv->set_rx_mode_work);
|
||||
}
|
||||
|
||||
|
||||
@@ -1369,6 +1369,8 @@ static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
|
||||
netdev_unlock(priv->netdev);
|
||||
rtnl_unlock();
|
||||
|
||||
/* clean-up uplink's mpfs mac table */
|
||||
queue_work(priv->wq, &priv->set_rx_mode_work);
|
||||
mlx5e_rep_bridge_cleanup(priv);
|
||||
mlx5e_dcbnl_delete_app(priv);
|
||||
mlx5_notifier_unregister(mdev, &priv->events_nb);
|
||||
|
||||
Reference in New Issue
Block a user