net: Use u64_stats_fetch_begin_irq() for stats fetch.

Bugzilla: https://bugzilla.redhat.com/2136122

Conflicts: removed all chunks not related to wireless

commit 278d3ba61563ceed3cb248383ced19e14ec7bc1f
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date:   Thu Aug 25 13:36:45 2022 +0200

    net: Use u64_stats_fetch_begin_irq() for stats fetch.
    
    On 32bit-UP u64_stats_fetch_begin() disables only preemption. If the
    reader is in preemptible context and the writer side
    (u64_stats_update_begin*()) runs in an interrupt context (IRQ or
    softirq) then the writer can update the stats during the read operation.
    This update remains undetected.
    
    Use u64_stats_fetch_begin_irq() to ensure the stats fetch on 32bit-UP
    are not interrupted by a writer. 32bit-SMP remains unaffected by this
    change.
    
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Catherine Sullivan <csully@google.com>
    Cc: David Awogbemila <awogbemila@google.com>
    Cc: Dimitris Michailidis <dmichail@fungible.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Hans Ulli Kroll <ulli.kroll@googlemail.com>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Jeroen de Borst <jeroendb@google.com>
    Cc: Johannes Berg <johannes@sipsolutions.net>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Paolo Abeni <pabeni@redhat.com>
    Cc: Simon Horman <simon.horman@corigine.com>
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-wireless@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Cc: oss-drivers@corigine.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Reviewed-by: Simon Horman <simon.horman@corigine.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Íñigo Huguet <ihuguet@redhat.com>
This commit is contained in:
Íñigo Huguet 2022-11-28 12:57:52 +01:00
parent 24e7010acc
commit c2d826628b
1 changed files with 4 additions and 4 deletions

View File

@ -2316,9 +2316,9 @@ static inline u64 sta_get_tidstats_msdu(struct ieee80211_sta_rx_stats *rxstats,
u64 value;
do {
start = u64_stats_fetch_begin(&rxstats->syncp);
start = u64_stats_fetch_begin_irq(&rxstats->syncp);
value = rxstats->msdu[tid];
} while (u64_stats_fetch_retry(&rxstats->syncp, start));
} while (u64_stats_fetch_retry_irq(&rxstats->syncp, start));
return value;
}
@ -2384,9 +2384,9 @@ static inline u64 sta_get_stats_bytes(struct ieee80211_sta_rx_stats *rxstats)
u64 value;
do {
start = u64_stats_fetch_begin(&rxstats->syncp);
start = u64_stats_fetch_begin_irq(&rxstats->syncp);
value = rxstats->bytes;
} while (u64_stats_fetch_retry(&rxstats->syncp, start));
} while (u64_stats_fetch_retry_irq(&rxstats->syncp, start));
return value;
}