• Vladimir Oltean's avatar
    net: dsa: keep the bridge_dev and bridge_num as part of the same structure · d3eed0e5
    Vladimir Oltean authored
    The main desire behind this is to provide coherent bridge information to
    the fast path without locking.
    
    For example, right now we set dp->bridge_dev and dp->bridge_num from
    separate code paths, it is theoretically possible for a packet
    transmission to read these two port properties consecutively and find a
    bridge number which does not correspond with the bridge device.
    
    Another desire is to start passing more complex bridge information to
    dsa_switch_ops functions. For example, with FDB isolation, it is
    expected that drivers will need to be passed the bridge which requested
    an FDB/MDB entry to be offloaded, and along with that bridge_dev, the
    associated bridge_num should be passed too, in case the driver might
    want to implement an isolation scheme based on that number.
    
    We already pass the {bridge_dev, bridge_num} pair to the TX forwarding
    offload switch API, however we'd like to remove that and squash it into
    the basic bridge join/leave API. So that means we need to pass this
    pair to the bridge join/leave API.
    
    During dsa_port_bridge_leave, first we unset dp->bridge_dev, then we
    call the driver's .port_bridge_leave with what used to be our
    dp->bridge_dev, but provided as an argument.
    
    When bridge_dev and bridge_num get folded into a single structure, we
    need to preserve this behavior in dsa_port_bridge_leave: we need a copy
    of what used to be in dp->bridge.
    
    Switch drivers check bridge membership by comparing dp->bridge_dev with
    the provided bridge_dev, but now, if we provide the struct dsa_bridge as
    a pointer, they cannot keep comparing dp->bridge to the provided
    pointer, since this only points to an on-stack copy. To make this
    obvious and prevent driver writers from forgetting and doing stupid
    things, in this new API, the struct dsa_bridge is provided as a full
    structure (not very large, contains an int and a pointer) instead of a
    pointer. An explicit comparison function needs to be used to determine
    bridge membership: dsa_port_offloads_bridge().
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarAlvin Šipraga <alsi@bang-olufsen.dk>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d3eed0e5
slave.c 65.6 KB