• Vladimir Oltean's avatar
    net: dsa: replay master state events in dsa_tree_{setup,teardown}_master · e83d5653
    Vladimir Oltean authored
    In order for switch driver to be able to make simple and reliable use of
    the master tracking operations, they must also be notified of the
    initial state of the DSA master, not just of the changes. This is
    because they might enable certain features only during the time when
    they know that the DSA master is up and running.
    
    Therefore, this change explicitly checks the state of the DSA master
    under the same rtnl_mutex as we were holding during the
    dsa_master_setup() and dsa_master_teardown() call. The idea being that
    if the DSA master became operational in between the moment in which it
    became a DSA master (dsa_master_setup set dev->dsa_ptr) and the moment
    when we checked for the master being up, there is a chance that we
    would emit a ->master_state_change() call with no actual state change.
    We need to avoid that by serializing the concurrent netdevice event with
    us. If the netdevice event started before, we force it to finish before
    we begin, because we take rtnl_lock before making netdev_uses_dsa()
    return true. So we also handle that early event and do nothing on it.
    Similarly, if the dev_open() attempt is concurrent with us, it will
    attempt to take the rtnl_mutex, but we're holding it. We'll see that
    the master flag IFF_UP isn't set, then when we release the rtnl_mutex
    we'll process the NETDEV_UP notifier.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e83d5653
dsa2.c 41 KB