mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
tcp_send_active_reset() can be called from contexts where gfp_any()
(in tcp_disconnect()) or sk->sk_allocation (in __tcp_close() and
mptcp_do_fastclose()) evaluates to GFP_KERNEL, which includes
__GFP_FS and __GFP_DIRECT_RECLAIM.
Allocating with GFP_KERNEL while holding the socket lock (sk_lock) creates
a lockdep dependency:
sk_lock -> fs_reclaim
This causes false-positive lockdep circular locking warnings with storage
subsystems (such as nvme-tcp) that acquire socket locks in block I/O paths
and invoke tcp_disconnect() or close sockets upon teardown:
set->srcu -> sk_lock -> fs_reclaim -> elevator_lock -> set->srcu
Active resets are small RST packet headers that should never
enter direct reclaim or block while holding socket locks.
Use sk_gfp_mask(sk, GFP_ATOMIC | __GFP_NOWARN) inside tcp_send_active_reset()
and remove its priority argument. This preserves __GFP_MEMALLOC access
for SOCK_MEMALLOC sockets, suppresses allocation failure warnings,
and aligns with other control packet allocations (e.g. tcp_send_fin(),
__tcp_send_ack(), tcp_xmit_probe_skb()).
Fixes:
|
||
|---|---|---|
| .. | ||
| bpf.c | ||
| crypto_test.c | ||
| crypto.c | ||
| ctrl.c | ||
| diag.c | ||
| fastopen.c | ||
| Kconfig | ||
| Makefile | ||
| mib.c | ||
| mib.h | ||
| mptcp_diag.c | ||
| mptcp_pm_gen.c | ||
| mptcp_pm_gen.h | ||
| options.c | ||
| pm_kernel.c | ||
| pm_netlink.c | ||
| pm_userspace.c | ||
| pm.c | ||
| protocol.c | ||
| protocol.h | ||
| sched.c | ||
| sockopt.c | ||
| subflow.c | ||
| syncookies.c | ||
| token_test.c | ||
| token.c | ||