mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
be2net: fix data race in be_get_new_eqd
In be_get_new_eqd(), statistics of pkts, protected by u64_stats_sync, are
read and accumulated in ignorance of possible u64_stats_fetch_retry()
events. Before the commit in question, these statistics were retrieved
one by one directly from queues. Fix this by reading them into temporary
variables first.
Fixes: 2094777041 ("be2net: set interrupt moderation for Skyhawk-R using EQ-DB")
Signed-off-by: David Yang <mmyangfl@gmail.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20260119153440.1440578-1-mmyangfl@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
5fbe395cd1
commit
302e5b481c
|
|
@ -2141,7 +2141,7 @@ static int be_get_new_eqd(struct be_eq_obj *eqo)
|
|||
struct be_aic_obj *aic;
|
||||
struct be_rx_obj *rxo;
|
||||
struct be_tx_obj *txo;
|
||||
u64 rx_pkts = 0, tx_pkts = 0;
|
||||
u64 rx_pkts = 0, tx_pkts = 0, pkts;
|
||||
ulong now;
|
||||
u32 pps, delta;
|
||||
int i;
|
||||
|
|
@ -2157,15 +2157,17 @@ static int be_get_new_eqd(struct be_eq_obj *eqo)
|
|||
for_all_rx_queues_on_eq(adapter, eqo, rxo, i) {
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxo->stats.sync);
|
||||
rx_pkts += rxo->stats.rx_pkts;
|
||||
pkts = rxo->stats.rx_pkts;
|
||||
} while (u64_stats_fetch_retry(&rxo->stats.sync, start));
|
||||
rx_pkts += pkts;
|
||||
}
|
||||
|
||||
for_all_tx_queues_on_eq(adapter, eqo, txo, i) {
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txo->stats.sync);
|
||||
tx_pkts += txo->stats.tx_reqs;
|
||||
pkts = txo->stats.tx_reqs;
|
||||
} while (u64_stats_fetch_retry(&txo->stats.sync, start));
|
||||
tx_pkts += pkts;
|
||||
}
|
||||
|
||||
/* Skip, if wrapped around or first calculation */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user