[PATCH net-next 08/14] rds: annotate data-races around core rds sysctls
From: Jiayuan Chen
Date: Sun Nov 08 2026 - 22:03:02 EST
reconnect_min_delay_ms, reconnect_max_delay_ms, max_unacked_packets,
max_unacked_bytes and ping_enable are read without any lock while their
sysctl handlers update them with WRITE_ONCE(). Add READ_ONCE() to the
readers.
Signed-off-by: Jiayuan Chen <jiayuan.chen@xxxxxxxxx>
---
net/rds/recv.c | 2 +-
net/rds/send.c | 8 ++++----
net/rds/threads.c | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/net/rds/recv.c b/net/rds/recv.c
index 00ab60f2d9969..daccbfc8cb8a2 100644
--- a/net/rds/recv.c
+++ b/net/rds/recv.c
@@ -370,7 +370,7 @@ void rds_recv_incoming(struct rds_connection *conn, struct in6_addr *saddr,
}
cp->cp_next_rx_seq = be64_to_cpu(inc->i_hdr.h_sequence) + 1;
- if (rds_sysctl_ping_enable && inc->i_hdr.h_dport == 0) {
+ if (READ_ONCE(rds_sysctl_ping_enable) && inc->i_hdr.h_dport == 0) {
if (inc->i_hdr.h_sport == 0) {
rdsdebug("ignore ping with 0 sport from %pI6c\n",
saddr);
diff --git a/net/rds/send.c b/net/rds/send.c
index f38967f65af18..66e75a382bcc7 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -87,8 +87,8 @@ void rds_send_path_reset(struct rds_conn_path *cp)
cp->cp_conn->c_map_queued = 0;
- cp->cp_unacked_packets = rds_sysctl_max_unacked_packets;
- cp->cp_unacked_bytes = rds_sysctl_max_unacked_bytes;
+ cp->cp_unacked_packets = READ_ONCE(rds_sysctl_max_unacked_packets);
+ cp->cp_unacked_bytes = READ_ONCE(rds_sysctl_max_unacked_bytes);
/* Mark messages as retransmissions, and move them to the send q */
spin_lock_irqsave(&cp->cp_lock, flags);
@@ -380,9 +380,9 @@ int rds_send_xmit(struct rds_conn_path *cp)
set_bit(RDS_MSG_ACK_REQUIRED, &rm->m_flags);
cp->cp_unacked_packets =
- rds_sysctl_max_unacked_packets;
+ READ_ONCE(rds_sysctl_max_unacked_packets);
cp->cp_unacked_bytes =
- rds_sysctl_max_unacked_bytes;
+ READ_ONCE(rds_sysctl_max_unacked_bytes);
rds_stats_inc(s_send_ack_required);
} else {
cp->cp_unacked_bytes -= len;
diff --git a/net/rds/threads.c b/net/rds/threads.c
index 639302bab51ef..115fcff0a5b13 100644
--- a/net/rds/threads.c
+++ b/net/rds/threads.c
@@ -137,7 +137,7 @@ void rds_queue_reconnect(struct rds_conn_path *cp)
set_bit(RDS_RECONNECT_PENDING, &cp->cp_flags);
if (cp->cp_reconnect_jiffies == 0) {
- cp->cp_reconnect_jiffies = rds_sysctl_reconnect_min_jiffies;
+ cp->cp_reconnect_jiffies = READ_ONCE(rds_sysctl_reconnect_min_jiffies);
rcu_read_lock();
if (!rds_destroy_pending(cp->cp_conn))
queue_delayed_work(cp->cp_wq, &cp->cp_conn_w, 0);
@@ -156,7 +156,7 @@ void rds_queue_reconnect(struct rds_conn_path *cp)
rcu_read_unlock();
cp->cp_reconnect_jiffies = min(cp->cp_reconnect_jiffies * 2,
- rds_sysctl_reconnect_max_jiffies);
+ READ_ONCE(rds_sysctl_reconnect_max_jiffies));
}
void rds_connect_worker(struct work_struct *work)
--
2.43.0