<!DOCTYPE html>
<!-- BaNnErBlUrFlE-BoDy-start -->
<!-- Preheader Text : BEGIN -->
<div style="display:none !important;display:none;visibility:hidden;mso-hide:all;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;opacity:0;overflow:hidden;">
On 2/23/26 11: 19 PM, Allison Henderson wrote: > From: Gerd Rausch <gerd. rausch@ oracle. com> > > Delegate fan-out to a background worker in order to allow > kernel_getpeername() to acquire a lock on the socket. > > This</div>
<!-- Preheader Text : END -->
<!-- Email Banner : BEGIN -->
<div style="display:none !important;display:none;visibility:hidden;mso-hide:all;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;opacity:0;overflow:hidden;"></div>
<!-- Email Banner : END -->
<!-- BaNnErBlUrFlE-BoDy-end -->
<html>
<head><!-- BaNnErBlUrFlE-HeAdEr-start -->
<style>
#pfptBanner6mcgr8f { all: revert !important; display: block !important;
visibility: visible !important; opacity: 1 !important;
background-color: #60beeb !important;
max-width: none !important; max-height: none !important }
.pfptPrimaryButton6mcgr8f:hover, .pfptPrimaryButton6mcgr8f:focus {
background-color: #77a8c4 !important; }
.pfptPrimaryButton6mcgr8f:active {
background-color: #8193a0 !important; }
html:root, html:root>body { all: revert !important; display: block !important;
visibility: visible !important; opacity: 1 !important; }
</style>
<!-- BaNnErBlUrFlE-HeAdEr-end -->
</head><body><pre style="font-family: sans-serif; font-size: 100%; white-space: pre-wrap; word-wrap: break-word">On 2/23/26 11:19 PM, Allison Henderson wrote:
> From: Gerd Rausch <gerd.rausch@oracle.com>
>
> Delegate fan-out to a background worker in order to allow
> kernel_getpeername() to acquire a lock on the socket.
>
> This has become necessary since the introduction of
> commit "9dfc685e0262d ("inet: remove races in inet{6}_getname()")
>
> The socket is already locked in the context that
> "kernel_getpeername" used to get called by either
> rds_tcp_recv_path" or "tcp_v{4,6}_rcv",
> and therefore causing a deadlock.
>
> Luckily, the fan-out need not happen in-context nor fast,
> so we can easily just do the same in a background worker.
>
> Also, while we're doing this, we get rid of the unused
> struct members "t_conn_w", "t_send_w", "t_down_w" & "t_recv_w".
>
> The fan-out work and the shutdown worker (cp_down_w) are both
> queued on the same ordered workqueue (cp0->cp_wq), so they
> cannot execute concurrently. We only need cancel_work_sync()
> in rds_tcp_conn_free() and rds_tcp_conn_path_connect() because
> those run from outside the ordered workqueue.
>
> Signed-off-by: Gerd Rausch <gerd.rausch@oracle.com>
> Signed-off-by: Allison Henderson <achender@kernel.org>
> ---
> net/rds/tcp.c | 3 +++
> net/rds/tcp.h | 7 ++----
> net/rds/tcp_connect.c | 2 ++
> net/rds/tcp_listen.c | 54 +++++++++++++++++++++++++++++++------------
> 4 files changed, 46 insertions(+), 20 deletions(-)
>
Isn't this change kind of dangerous since 021fd0f87004 ("net/rds: fix
recursive lock in rds_tcp_conn_slots_available") [1]?. Why is
kernel_getpeername() needed as only the peer source port is required for
the operation?
Thanks,
Fernando.
</pre></body></html>