]> www.infradead.org Git - users/hch/misc.git/commitdiff
mlxsw: spectrum_switchdev: Add an internal API for VXLAN leave
authorAmit Cohen <amcohen@nvidia.com>
Mon, 17 Mar 2025 17:37:28 +0000 (18:37 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 22:09:31 +0000 (15:09 -0700)
There is asymmetry in how the VXLAN join and leave functions are used.
The join function (mlxsw_sp_bridge_vxlan_join()) is only called in
response to netdev events (e.g., VXLAN device joining a bridge), but the
leave function is also called in response to switchdev events (e.g.,
VLAN configuration on top of the VXLAN device) in order to invalidate
VNI to FID mappings.

This asymmetry will cause problems when the functions will be later
extended to mark VXLAN bridge ports as offloaded or not.

Therefore, create an internal function (__mlxsw_sp_bridge_vxlan_leave())
that is used to invalidate VNI to FID mappings and call it from
mlxsw_sp_bridge_vxlan_leave() which will only be invoked in response to
netdev events, like mlxsw_sp_bridge_vxlan_join().

No functional changes intended.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/f3a32bd2d87a0b7ac4d2bb98a427dc6d95a01cd0.1742224300.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

index 6397ff0dc951cddb86272027a1bd33c0d123e980..c95ef79eaf3d65b3d8ccb00a13b533e74be776b0 100644 (file)
@@ -2944,8 +2944,8 @@ int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
                                              extack);
 }
 
-void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
-                                const struct net_device *vxlan_dev)
+static void __mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
+                                         const struct net_device *vxlan_dev)
 {
        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
        struct mlxsw_sp_fid *fid;
@@ -2963,6 +2963,12 @@ void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
        mlxsw_sp_fid_put(fid);
 }
 
+void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
+                                const struct net_device *vxlan_dev)
+{
+       __mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
+}
+
 static void
 mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr *vxlan_addr,
                                      enum mlxsw_sp_l3proto *proto,
@@ -3867,7 +3873,7 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
                        mlxsw_sp_fid_put(fid);
                        return -EINVAL;
                }
-               mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
+               __mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
                mlxsw_sp_fid_put(fid);
                return 0;
        }
@@ -3883,7 +3889,7 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
        /* Fourth case: Thew new VLAN is PVID, which means the VLAN currently
         * mapped to the VNI should be unmapped
         */
-       mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
+       __mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
        mlxsw_sp_fid_put(fid);
 
        /* Fifth case: The new VLAN is also egress untagged, which means the
@@ -3923,7 +3929,7 @@ mlxsw_sp_switchdev_vxlan_vlan_del(struct mlxsw_sp *mlxsw_sp,
        if (mlxsw_sp_fid_8021q_vid(fid) != vid)
                goto out;
 
-       mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
+       __mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
 
 out:
        mlxsw_sp_fid_put(fid);