• Vladimir Oltean's avatar
    net: dpaa2-eth: serialize changes to priv->mac with a mutex · 2291982e
    Vladimir Oltean authored
    The dpaa2 architecture permits dynamic connections between objects on
    the fsl-mc bus, specifically between a DPNI object (represented by a
    struct net_device) and a DPMAC object (represented by a struct phylink).
    
    The DPNI driver is notified when those connections are created/broken
    through the dpni_irq0_handler_thread() method. To ensure that ethtool
    operations, as well as netdev up/down operations serialize with the
    connection/disconnection of the DPNI with a DPMAC,
    dpni_irq0_handler_thread() takes the rtnl_lock() to block those other
    operations from taking place.
    
    There is code called by dpaa2_mac_connect() which wants to acquire the
    rtnl_mutex once again, see phylink_create() -> phylink_register_sfp() ->
    sfp_bus_add_upstream() -> rtnl_lock(). So the strategy doesn't quite
    work out, even though it's fairly simple.
    
    Create a different strategy, where all code paths in the dpaa2-eth
    driver access priv->mac only while they are holding priv->mac_lock.
    The phylink instance is not created or connected to the PHY under the
    priv->mac_lock, but only assigned to priv->mac then. This will eliminate
    the reliance on the rtnl_mutex.
    
    Add lockdep annotations and put comments where holding the lock is not
    necessary, and priv->mac can be dereferenced freely.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
    Tested-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    2291982e
dpaa2-eth.h 23.6 KB