• Sebastian Andrzej Siewior's avatar
    net: dsa: xrs700x: Use irqsave variant for u64 stats update · 3f8ae9fe
    Sebastian Andrzej Siewior authored
    xrs700x_read_port_counters() updates the stats from a worker using the
    u64_stats_update_begin() version. This is okay on 32-UP since on the
    reader side preemption is disabled.
    On 32bit-SMP the writer can be preempted by the reader at which point
    the reader will spin on the seqcount until writer continues and
    completes the update.
    
    Assigning the mib_mutex mutex to the underlying seqcount would ensure
    proper synchronisation. The API for that on the u64_stats_init() side
    isn't available. Since it is the only user, just use disable interrupts
    during the update.
    
    Use u64_stats_update_begin_irqsave() on the writer side to ensure an
    uninterrupted update.
    
    Fixes: ee00b24f ("net: dsa: add Arrow SpeedChips XRS700x driver")
    Cc: Andrew Lunn <andrew@lunn.ch>
    Cc: Florian Fainelli <f.fainelli@gmail.com>
    Cc: George McCollister <george.mccollister@gmail.com>
    Cc: Vivien Didelot <vivien.didelot@gmail.com>
    Cc: Vladimir Oltean <olteanv@gmail.com>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Acked-by: default avatarGeorge McCollister <george.mccollister@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3f8ae9fe
xrs700x.c 20.6 KB