• Vladimir Oltean's avatar
    net: mscc: ocelot: remove struct ocelot_mm_state :: lock · 3ff468ef
    Vladimir Oltean authored
    Unfortunately, the workarounds for the hardware bugs make it pointless
    to keep fine-grained locking for the MAC Merge state of each port.
    
    Our vsc9959_cut_through_fwd() implementation requires
    ocelot->fwd_domain_lock to be held, in order to serialize with changes
    to the bridging domains and to port speed changes (which affect which
    ports can be cut-through). Simultaneously, the traffic classes which can
    be cut-through cannot be preemptible at the same time, and this will
    depend on the MAC Merge layer state (which changes from threaded
    interrupt context).
    
    Since vsc9959_cut_through_fwd() would have to hold the mm->lock of all
    ports for a correct and race-free implementation with respect to
    ocelot_mm_irq(), in practice it means that any time a port's mm->lock is
    held, it would potentially block holders of ocelot->fwd_domain_lock.
    
    In the interest of simple locking rules, make all MAC Merge layer state
    changes (and preemptible traffic class changes) be serialized by the
    ocelot->fwd_domain_lock.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    3ff468ef
ocelot.h 35.7 KB