• Vladimir Oltean's avatar
    net: dsa: sja1105: serialize access to the dynamic config interface · eb016afd
    Vladimir Oltean authored
    The sja1105 hardware seems as concurrent as can be, but when we create a
    background script that adds/removes a rain of FDB entries without the
    rtnl_mutex taken, then in parallel we do another operation like run
    'bridge fdb show', we can notice these errors popping up:
    
    sja1105 spi2.0: port 2 failed to read back entry for 00:01:02:03:00:40 vid 0: -ENOENT
    sja1105 spi2.0: port 2 failed to add 00:01:02:03:00:40 vid 0 to fdb: -2
    sja1105 spi2.0: port 2 failed to read back entry for 00:01:02:03:00:46 vid 0: -ENOENT
    sja1105 spi2.0: port 2 failed to add 00:01:02:03:00:46 vid 0 to fdb: -2
    
    Luckily what is going on does not require a major rework in the driver.
    The sja1105_dynamic_config_read() function sends multiple SPI buffers to
    the peripheral until the operation completes. We should not do anything
    until the hardware clears the VALID bit.
    
    But since there is no locking (i.e. right now we are implicitly
    serialized by the rtnl_mutex, but if we remove that), it might be
    possible that the process which performs the dynamic config read is
    preempted and another one performs a dynamic config write.
    
    What will happen in that case is that sja1105_dynamic_config_read(),
    when it resumes, expects to see VALIDENT set for the entry it reads
    back. But it won't.
    
    This can be corrected by introducing a mutex for serializing SPI
    accesses to the dynamic config interface which should be atomic with
    respect to each other.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    eb016afd
sja1105_main.c 97.5 KB