mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
Use of percpu_counter structure to track count of orphaned
sockets is causing problems on modern hosts with 256 cpus
or more.
Stefan Bach reported a serious spinlock contention in real workloads,
that I was able to reproduce with a netfilter rule dropping
incoming FIN packets.
53.56% server [kernel.kallsyms] [k] queued_spin_lock_slowpath
|
---queued_spin_lock_slowpath
|
--53.51%--_raw_spin_lock_irqsave
|
--53.51%--__percpu_counter_sum
tcp_check_oom
|
|--39.03%--__tcp_close
| tcp_close
| inet_release
| inet6_release
| sock_close
| __fput
| ____fput
| task_work_run
| exit_to_usermode_loop
| do_syscall_64
| entry_SYSCALL_64_after_hwframe
| __GI___libc_close
|
--14.48%--tcp_out_of_resources
tcp_write_timeout
tcp_retransmit_timer
tcp_write_timer_handler
tcp_write_timer
call_timer_fn
expire_timers
__run_timers
run_timer_softirq
__softirqentry_text_start
As explained in commit
|
||
|---|---|---|
| .. | ||
| ccids | ||
| ackvec.c | ||
| ackvec.h | ||
| ccid.c | ||
| ccid.h | ||
| dccp.h | ||
| diag.c | ||
| feat.c | ||
| feat.h | ||
| input.c | ||
| ipv4.c | ||
| ipv6.c | ||
| ipv6.h | ||
| Kconfig | ||
| Makefile | ||
| minisocks.c | ||
| options.c | ||
| output.c | ||
| proto.c | ||
| qpolicy.c | ||
| sysctl.c | ||
| timer.c | ||
| trace.h | ||