Netdev List
 help / color / mirror / Atom feed
* [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated()
@ 2026-08-22  5:26 Allison Henderson
  2026-08-24 16:55 ` Simon Horman
  2026-08-24 19:10 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Allison Henderson @ 2026-08-22  5:26 UTC (permalink / raw)
  To: netdev, linux-rdma, pabeni, edumazet, kuba, horms
  Cc: achender, jhubbard, woni9911, michal.kubiak, leon

rds_cong_map_updated() runs after a peer's congestion map has been
rewritten (by rds_tcp_cong_recv() and rds_ib_cong_recv(), or the
clear-all in the loopback and IB send-completion paths).  It bumps
rds_cong_generation and then checks waitqueue_active() on
map->m_waitq and on rds_poll_waitq to decide whether anyone needs
waking.  atomic_inc() carries no ordering and waitqueue_active() is a
plain load, so nothing orders the map and generation stores before
the wait queue reads.  The waiters do the mirror image: rds_cong_wait()
adds itself to m_waitq and then tests the port bit, and rds_poll()
registers on rds_poll_waitq and then reads the generation.  That is
the store-buffering pattern described above waitqueue_active() in
include/linux/wait.h - the updater can observe an empty wait queue
while the waiter still observes the port as congested, and no wake-up
is issued.

rds_cong_wait() is an interruptible sleep with no timeout, so a
sender blocked on a congested port stays blocked until the next
congestion update from that peer arrives or a signal is delivered.
A poll() waiter misses the map-updated notification the same way.

Use wq_has_sleeper(), which is waitqueue_active() preceded by the
required full barrier, as rds_tcp_state_change() already does for
the same pattern.

Fixes: 922cb17a5c81 ("RDS: Congestion-handling code")
Assisted-by: Claude-Code:claude-fable-5
Signed-off-by: Allison Henderson <achender@kernel.org>
---
Raised during review of "net/rds: own the fastpath locks across
connection teardown", whose first patch fixes the same pattern in
release_in_xmit():
https://lore.kernel.org/netdev/20260820133832.5384be37@kernel.org/
This patch is independent of that set and applies on its own.

 net/rds/cong.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/rds/cong.c b/net/rds/cong.c
index 3133b91f9e69..f7634ce3ffc1 100644
--- a/net/rds/cong.c
+++ b/net/rds/cong.c
@@ -256,9 +256,9 @@ void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask)
 	  map, &map->m_addr);
 	rds_stats_inc(s_cong_update_received);
 	atomic_inc(&rds_cong_generation);
-	if (waitqueue_active(&map->m_waitq))
+	if (wq_has_sleeper(&map->m_waitq))
 		wake_up(&map->m_waitq);
-	if (waitqueue_active(&rds_poll_waitq))
+	if (wq_has_sleeper(&rds_poll_waitq))
 		wake_up_all(&rds_poll_waitq);
 
 	if (portmask && !list_empty(&rds_cong_monitor)) {

base-commit: 4e15e89faac9f308baeb01f46c13a051814d2449
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated()
  2026-08-22  5:26 [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated() Allison Henderson
@ 2026-08-24 16:55 ` Simon Horman
  2026-08-24 19:10 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Simon Horman @ 2026-08-24 16:55 UTC (permalink / raw)
  To: Allison Henderson
  Cc: netdev, linux-rdma, pabeni, edumazet, kuba, jhubbard, woni9911,
	michal.kubiak, leon

On Fri, Aug 21, 2026 at 10:26:47PM -0700, Allison Henderson wrote:
> rds_cong_map_updated() runs after a peer's congestion map has been
> rewritten (by rds_tcp_cong_recv() and rds_ib_cong_recv(), or the
> clear-all in the loopback and IB send-completion paths).  It bumps
> rds_cong_generation and then checks waitqueue_active() on
> map->m_waitq and on rds_poll_waitq to decide whether anyone needs
> waking.  atomic_inc() carries no ordering and waitqueue_active() is a
> plain load, so nothing orders the map and generation stores before
> the wait queue reads.  The waiters do the mirror image: rds_cong_wait()
> adds itself to m_waitq and then tests the port bit, and rds_poll()
> registers on rds_poll_waitq and then reads the generation.  That is
> the store-buffering pattern described above waitqueue_active() in
> include/linux/wait.h - the updater can observe an empty wait queue
> while the waiter still observes the port as congested, and no wake-up
> is issued.
> 
> rds_cong_wait() is an interruptible sleep with no timeout, so a
> sender blocked on a congested port stays blocked until the next
> congestion update from that peer arrives or a signal is delivered.
> A poll() waiter misses the map-updated notification the same way.
> 
> Use wq_has_sleeper(), which is waitqueue_active() preceded by the
> required full barrier, as rds_tcp_state_change() already does for
> the same pattern.
> 
> Fixes: 922cb17a5c81 ("RDS: Congestion-handling code")
> Assisted-by: Claude-Code:claude-fable-5
> Signed-off-by: Allison Henderson <achender@kernel.org>
> ---
> Raised during review of "net/rds: own the fastpath locks across
> connection teardown", whose first patch fixes the same pattern in
> release_in_xmit():
> https://lore.kernel.org/netdev/20260820133832.5384be37@kernel.org/
> This patch is independent of that set and applies on its own.

Reviewed-by: Simon Horman <horms@kernel.org>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated()
  2026-08-22  5:26 [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated() Allison Henderson
  2026-08-24 16:55 ` Simon Horman
@ 2026-08-24 19:10 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-08-24 19:10 UTC (permalink / raw)
  To: Allison Henderson
  Cc: netdev, linux-rdma, pabeni, edumazet, kuba, horms, jhubbard,
	woni9911, michal.kubiak, leon

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Fri, 21 Aug 2026 22:26:47 -0700 you wrote:
> rds_cong_map_updated() runs after a peer's congestion map has been
> rewritten (by rds_tcp_cong_recv() and rds_ib_cong_recv(), or the
> clear-all in the loopback and IB send-completion paths).  It bumps
> rds_cong_generation and then checks waitqueue_active() on
> map->m_waitq and on rds_poll_waitq to decide whether anyone needs
> waking.  atomic_inc() carries no ordering and waitqueue_active() is a
> plain load, so nothing orders the map and generation stores before
> the wait queue reads.  The waiters do the mirror image: rds_cong_wait()
> adds itself to m_waitq and then tests the port bit, and rds_poll()
> registers on rds_poll_waitq and then reads the generation.  That is
> the store-buffering pattern described above waitqueue_active() in
> include/linux/wait.h - the updater can observe an empty wait queue
> while the waiter still observes the port as congested, and no wake-up
> is issued.
> 
> [...]

Here is the summary with links:
  - [net] net/rds: use wq_has_sleeper() in rds_cong_map_updated()
    https://git.kernel.org/netdev/net/c/d4f484661961

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-08-24 19:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-22  5:26 [PATCH net] net/rds: use wq_has_sleeper() in rds_cong_map_updated() Allison Henderson
2026-08-24 16:55 ` Simon Horman
2026-08-24 19:10 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox