* [PATCH net] rxrpc: Fix missing locking causing hanging calls
@ 2024-11-06 13:03 David Howells
2024-11-06 16:54 ` David Howells
2024-11-07 19:40 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 3+ messages in thread
From: David Howells @ 2024-11-06 13:03 UTC (permalink / raw)
To: netdev
Cc: dhowells, Marc Dionne, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman, linux-afs,
linux-kernel
If a call gets aborted (e.g. because kafs saw a signal) between it being
queued for connection and the I/O thread picking up the call, the abort
will be prioritised over the connection and it will be removed from
local->new_client_calls by rxrpc_disconnect_client_call() without a lock
being held. This may cause other calls on the list to disappear if a race
occurs.
Fix this by taking the client_call_lock when removing a call from whatever
list its ->wait_link happens to be on.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: "David S. Miller" <davem@davemloft.net>
cc: Eric Dumazet <edumazet@google.com>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
cc: netdev@vger.kernel.org
---
include/trace/events/rxrpc.h | 1 +
net/rxrpc/conn_client.c | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
index c2f087e90fbe..d03e0bd8c028 100644
--- a/include/trace/events/rxrpc.h
+++ b/include/trace/events/rxrpc.h
@@ -287,6 +287,7 @@
EM(rxrpc_call_see_input, "SEE input ") \
EM(rxrpc_call_see_release, "SEE release ") \
EM(rxrpc_call_see_userid_exists, "SEE u-exists") \
+ EM(rxrpc_call_see_waiting_call, "SEE q-conn ") \
E_(rxrpc_call_see_zap, "SEE zap ")
#define rxrpc_txqueue_traces \
diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c
index d25bf1cf3670..bb11e8289d6d 100644
--- a/net/rxrpc/conn_client.c
+++ b/net/rxrpc/conn_client.c
@@ -516,6 +516,7 @@ void rxrpc_connect_client_calls(struct rxrpc_local *local)
spin_lock(&local->client_call_lock);
list_move_tail(&call->wait_link, &bundle->waiting_calls);
+ rxrpc_see_call(call, rxrpc_call_see_waiting_call);
spin_unlock(&local->client_call_lock);
if (rxrpc_bundle_has_space(bundle))
@@ -586,7 +587,10 @@ void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call
_debug("call is waiting");
ASSERTCMP(call->call_id, ==, 0);
ASSERT(!test_bit(RXRPC_CALL_EXPOSED, &call->flags));
+ /* May still be on ->new_client_calls. */
+ spin_lock(&local->client_call_lock);
list_del_init(&call->wait_link);
+ spin_unlock(&local->client_call_lock);
return;
}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH net] rxrpc: Fix missing locking causing hanging calls
2024-11-06 13:03 [PATCH net] rxrpc: Fix missing locking causing hanging calls David Howells
@ 2024-11-06 16:54 ` David Howells
2024-11-07 19:40 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: David Howells @ 2024-11-06 16:54 UTC (permalink / raw)
To: netdev
Cc: dhowells, Marc Dionne, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman, linux-afs,
linux-kernel
Fixes: 9d35d880e0e4 ("rxrpc: Move client call connection to the I/O thread")
Reported-by: Marc Dionne <marc.dionne@auristor.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net] rxrpc: Fix missing locking causing hanging calls
2024-11-06 13:03 [PATCH net] rxrpc: Fix missing locking causing hanging calls David Howells
2024-11-06 16:54 ` David Howells
@ 2024-11-07 19:40 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-11-07 19:40 UTC (permalink / raw)
To: David Howells
Cc: netdev, marc.dionne, davem, edumazet, kuba, pabeni, horms,
linux-afs, linux-kernel
Hello:
This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 06 Nov 2024 13:03:22 +0000 you wrote:
> If a call gets aborted (e.g. because kafs saw a signal) between it being
> queued for connection and the I/O thread picking up the call, the abort
> will be prioritised over the connection and it will be removed from
> local->new_client_calls by rxrpc_disconnect_client_call() without a lock
> being held. This may cause other calls on the list to disappear if a race
> occurs.
>
> [...]
Here is the summary with links:
- [net] rxrpc: Fix missing locking causing hanging calls
https://git.kernel.org/netdev/net/c/fc9de52de38f
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:[~2024-11-07 19:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-06 13:03 [PATCH net] rxrpc: Fix missing locking causing hanging calls David Howells
2024-11-06 16:54 ` David Howells
2024-11-07 19:40 ` 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;
as well as URLs for NNTP newsgroup(s).