• Vladimir Oltean's avatar
    net: dsa: make cross-chip notifiers more efficient for host events · 726816a1
    Vladimir Oltean authored
    To determine whether a given port should react to the port targeted by
    the notifier, dsa_port_host_vlan_match() and dsa_port_host_address_match()
    look at the positioning of the switch port currently executing the
    notifier relative to the switch port for which the notifier was emitted.
    
    To maintain stylistic compatibility with the other match functions from
    switch.c, the host address and host VLAN match functions take the
    notifier information about targeted port, switch and tree indices as
    argument. However, these functions only use that information to retrieve
    the struct dsa_port *targeted_dp, which is an invariant for the outer
    loop that calls them. So it makes more sense to calculate the targeted
    dp only once, and pass it to them as argument.
    
    But furthermore, the targeted dp is actually known at the time the call
    to dsa_port_notify() is made. It is just that we decide to only save the
    indices of the port, switch and tree in the notifier structure, just to
    retrace our steps and find the dp again using dsa_switch_find() and
    dsa_to_port().
    
    But both the above functions are relatively expensive, since they need
    to iterate through lists. It appears more straightforward to make all
    notifiers just pass the targeted dp inside their info structure, and
    have the code that needs the indices to look at info->dp->index instead
    of info->port, or info->dp->ds->index instead of info->sw_index, or
    info->dp->ds->dst->index instead of info->tree_index.
    
    For the sake of consistency, all cross-chip notifiers are converted to
    pass the "dp" directly.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    726816a1
switch.c 23.1 KB