lkml.org 
[lkml]   [2018]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 051/118] mlxsw: spectrum: Relax sanity checks during enslavement
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ido Schimmel <idosch@mellanox.com>


    [ Upstream commit 90045fc9c78855bdc625a0ab185d97b72a937613 ]

    Since commit 25cc72a33835 ("mlxsw: spectrum: Forbid linking to devices that
    have uppers") the driver forbids enslavement to netdevs that already
    have uppers of their own, as this can result in various ordering
    problems.

    This requirement proved to be too strict for some users who need to be
    able to enslave ports to a bridge that already has uppers. In this case,
    we can allow the enslavement if the bridge is already known to us, as
    any configuration performed on top of the bridge was already reflected
    to the device.

    Fixes: 25cc72a33835 ("mlxsw: spectrum: Forbid linking to devices that have uppers")
    Signed-off-by: Ido Schimmel <idosch@mellanox.com>
    Reported-by: Alexander Petrovskiy <alexpe@mellanox.com>
    Tested-by: Alexander Petrovskiy <alexpe@mellanox.com>
    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 11 +++++++++--
    drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 2 ++
    drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | 6 ++++++
    3 files changed, 17 insertions(+), 2 deletions(-)

    --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
    +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
    @@ -4235,7 +4235,10 @@ static int mlxsw_sp_netdevice_port_upper
    return -EINVAL;
    if (!info->linking)
    break;
    - if (netdev_has_any_upper_dev(upper_dev))
    + if (netdev_has_any_upper_dev(upper_dev) &&
    + (!netif_is_bridge_master(upper_dev) ||
    + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
    + upper_dev)))
    return -EINVAL;
    if (netif_is_lag_master(upper_dev) &&
    !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev,
    @@ -4347,6 +4350,7 @@ static int mlxsw_sp_netdevice_port_vlan_
    u16 vid)
    {
    struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
    + struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
    struct netdev_notifier_changeupper_info *info = ptr;
    struct net_device *upper_dev;
    int err = 0;
    @@ -4358,7 +4362,10 @@ static int mlxsw_sp_netdevice_port_vlan_
    return -EINVAL;
    if (!info->linking)
    break;
    - if (netdev_has_any_upper_dev(upper_dev))
    + if (netdev_has_any_upper_dev(upper_dev) &&
    + (!netif_is_bridge_master(upper_dev) ||
    + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
    + upper_dev)))
    return -EINVAL;
    break;
    case NETDEV_CHANGEUPPER:
    --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
    +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
    @@ -326,6 +326,8 @@ int mlxsw_sp_port_bridge_join(struct mlx
    void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
    struct net_device *brport_dev,
    struct net_device *br_dev);
    +bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
    + const struct net_device *br_dev);

    /* spectrum.c */
    int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
    --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
    +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
    @@ -134,6 +134,12 @@ mlxsw_sp_bridge_device_find(const struct
    return NULL;
    }

    +bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
    + const struct net_device *br_dev)
    +{
    + return !!mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
    +}
    +
    static struct mlxsw_sp_bridge_device *
    mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge *bridge,
    struct net_device *br_dev)

    \
     
     \ /
      Last update: 2018-01-15 14:07    [W:4.263 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site