• Vladimir Oltean's avatar
    net: dsa: remove the transactional logic from VLAN objects · 1958d581
    Vladimir Oltean authored
    It should be the driver's business to logically separate its VLAN
    offloading into a preparation and a commit phase, and some drivers don't
    need / can't do this.
    
    So remove the transactional shim from DSA and let drivers propagate
    errors directly from the .port_vlan_add callback.
    
    It would appear that the code has worse error handling now than it had
    before. DSA is the only in-kernel user of switchdev that offloads one
    switchdev object to more than one port: for every VLAN object offloaded
    to a user port, that VLAN is also offloaded to the CPU port. So the
    "prepare for user port -> check for errors -> prepare for CPU port ->
    check for errors -> commit for user port -> commit for CPU port"
    sequence appears to make more sense than the one we are using now:
    "offload to user port -> check for errors -> offload to CPU port ->
    check for errors", but it is really a compromise. In the new way, we can
    catch errors from the commit phase that we previously had to ignore.
    But we have our hands tied and cannot do any rollback now: if we add a
    VLAN on the CPU port and it fails, we can't do the rollback by simply
    deleting it from the user port, because the switchdev API is not so nice
    with us: it could have simply been there already, even with the same
    flags. So we don't even attempt to rollback anything on addition error,
    just leave whatever VLANs managed to get offloaded right where they are.
    This should not be a problem at all in practice.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Acked-by: default avatarJiri Pirko <jiri@nvidia.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    1958d581
ksz_common.h 8.86 KB