[PATCH v1 net 02/15] net: Fix data-races around weight_p and dev_weight_[rt]x_bias.
From: Kuniyuki Iwashima
Date: Tue Aug 16 2022 - 04:03:59 EST
While reading weight_p and dev_weight_[rt]x_bias, they can be changed
concurrently. Thus, we need to add READ_ONCE() to their readers.
Fixes: 3d48b53fb2ae ("net: dev_weight: TX/RX orthogonality")
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Kuniyuki Iwashima <kuniyu@xxxxxxxxxx>
---
CC: Matthias Tafelmeier <matthias.tafelmeier@xxxxxxx>
---
net/core/dev.c | 2 +-
net/core/sysctl_net_core.c | 6 ++++--
net/sched/sch_generic.c | 2 +-
3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 716df64fcfa5..b5b92dcd5eea 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5918,7 +5918,7 @@ static int process_backlog(struct napi_struct *napi, int quota)
net_rps_action_and_irq_enable(sd);
}
- napi->weight = dev_rx_weight;
+ napi->weight = READ_ONCE(dev_rx_weight);
while (again) {
struct sk_buff *skb;
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 71a13596ea2b..d82ba0c27175 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -240,8 +240,10 @@ static int proc_do_dev_weight(struct ctl_table *table, int write,
if (ret != 0)
return ret;
- dev_rx_weight = weight_p * dev_weight_rx_bias;
- dev_tx_weight = weight_p * dev_weight_tx_bias;
+ WRITE_ONCE(dev_rx_weight,
+ READ_ONCE(weight_p) * READ_ONCE(dev_weight_rx_bias));
+ WRITE_ONCE(dev_tx_weight,
+ READ_ONCE(weight_p) * READ_ONCE(dev_weight_tx_bias));
return ret;
}
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index d47b9689eba6..99b697ad2b98 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -409,7 +409,7 @@ static inline bool qdisc_restart(struct Qdisc *q, int *packets)
void __qdisc_run(struct Qdisc *q)
{
- int quota = dev_tx_weight;
+ int quota = READ_ONCE(dev_tx_weight);
int packets;
while (qdisc_restart(q, &packets)) {
--
2.30.2