net: bridge: br_switchdev: Tolerate -EOPNOTSUPP when replaying MDB

JIRA: https://issues.redhat.com/browse/RHEL-862

commit 989280d6ea70b2d91b8b0e20ac11a6529a37ac08
Author: Petr Machata <petrm@nvidia.com>
Date:   Wed Jul 19 13:01:16 2023 +0200

    net: bridge: br_switchdev: Tolerate -EOPNOTSUPP when replaying MDB

    There are two kinds of MDB entries to be replayed: port MDB entries, and
    host MDB entries. They are both replayed by br_switchdev_mdb_replay(). If
    the driver supports one kind, but lacks the other, the first -EOPNOTSUPP
    returned terminates the whole replay, including any further still-supported
    objects in the list.

    For this to cause issues, there must be MDB entries for both the host and
    the port being replayed. In that case, if the driver bails out from
    handling the host entry, the port entries are never replayed. However, the
    replay is currently only done when a switchdev port joins a bridge. There
    would be no port memberships at that point. Thus despite being erroneous,
    the code does not cause observable bugs.

    This is not an issue with other object kinds either, because there, each
    function replays one object kind. If a driver does not support that kind,
    it makes sense to bail out early. -EOPNOTSUPP is then ignored in
    nbp_switchdev_sync_objs().

    For MDB, suppress the -EOPNOTSUPP error code in br_switchdev_mdb_replay()
    already, so that the whole list gets replayed.

    The reason we need this patch is that a future patch will introduce a
    replay that should be used when a front-panel port netdevice is enslaved to
    a bridge lower, in particular a LAG. The LAG netdevice can already have
    both host and port MDB entries. The port entries need to be replayed so
    that they are offloaded on the port that joins the LAG.

    Cc: Jiri Pirko <jiri@resnulli.us>
    Cc: Ivan Vecera <ivecera@redhat.com>
    Cc: Roopa Prabhu <roopa@nvidia.com>
    Cc: Nikolay Aleksandrov <razor@blackwall.org>
    Cc: bridge@lists.linux-foundation.org
    Signed-off-by: Petr Machata <petrm@nvidia.com>
    Reviewed-by: Danielle Ratson <danieller@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
This commit is contained in:
Ivan Vecera 2023-12-05 15:29:48 +01:00
parent 9136171ac4
commit a311f72e10
1 changed files with 5 additions and 1 deletions

View File

@ -727,6 +727,8 @@ br_switchdev_mdb_replay(struct net_device *br_dev, struct net_device *dev,
err = br_switchdev_mdb_replay_one(nb, dev,
SWITCHDEV_OBJ_PORT_MDB(obj),
action, ctx, extack);
if (err == -EOPNOTSUPP)
err = 0;
if (err)
goto out_free_mdb;
}
@ -759,8 +761,10 @@ static int nbp_switchdev_sync_objs(struct net_bridge_port *p, const void *ctx,
err = br_switchdev_mdb_replay(br_dev, dev, ctx, true, blocking_nb,
extack);
if (err && err != -EOPNOTSUPP)
if (err) {
/* -EOPNOTSUPP not propagated from MDB replay. */
return err;
}
err = br_switchdev_fdb_replay(br_dev, ctx, true, atomic_nb);
if (err && err != -EOPNOTSUPP)