Jason A. Donenfeld
aec35934d0
UPSTREAM: wireguard: queueing: get rid of per-peer ring buffers
...
Having two ring buffers per-peer means that every peer results in two
massive ring allocations. On an 8-core x86_64 machine, this commit
reduces the per-peer allocation from 18,688 bytes to 1,856 bytes, which
is an 90% reduction. Ninety percent! With some single-machine
deployments approaching 500,000 peers, we're talking about a reduction
from 7 gigs of memory down to 700 megs of memory.
In order to get rid of these per-peer allocations, this commit switches
to using a list-based queueing approach. Currently GSO fragments are
chained together using the skb->next pointer (the skb_list_* singly
linked list approach), so we form the per-peer queue around the unused
skb->prev pointer (which sort of makes sense because the links are
pointing backwards). Use of skb_queue_* is not possible here, because
that is based on doubly linked lists and spinlocks. Multiple cores can
write into the queue at any given time, because its writes occur in the
start_xmit path or in the udp_recv path. But reads happen in a single
workqueue item per-peer, amounting to a multi-producer, single-consumer
paradigm.
The MPSC queue is implemented locklessly and never blocks. However, it
is not linearizable (though it is serializable), with a very tight and
unlikely race on writes, which, when hit (some tiny fraction of the
0.15% of partial adds on a fully loaded 16-core x86_64 system), causes
the queue reader to terminate early. However, because every packet sent
queues up the same workqueue item after it is fully added, the worker
resumes again, and stopping early isn't actually a problem, since at
that point the packet wouldn't have yet been added to the encryption
queue. These properties allow us to avoid disabling interrupts or
spinning. The design is based on Dmitry Vyukov's algorithm [1].
Performance-wise, ordinarily list-based queues aren't preferable to
ringbuffers, because of cache misses when following pointers around.
However, we *already* have to follow the adjacent pointers when working
through fragments, so there shouldn't actually be any change there. A
potential downside is that dequeueing is a bit more complicated, but the
ptr_ring structure used prior had a spinlock when dequeueing, so all and
all the difference appears to be a wash.
Actually, from profiling, the biggest performance hit, by far, of this
commit winds up being atomic_add_unless(count, 1, max) and atomic_
dec(count), which account for the majority of CPU time, according to
perf. In that sense, the previous ring buffer was superior in that it
could check if it was full by head==tail, which the list-based approach
cannot do.
But all and all, this enables us to get massive memory savings, allowing
WireGuard to scale for real world deployments, without taking much of a
performance hit.
[1] http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
(cherry picked from commit 8b5553ace83cced775eefd0f3f18b5c6214ccf7a)
Bug: 187129171
Signed-off-by: Connor O'Brien <connoro@google.com>
Change-Id: I399dd0f0f76b9eadf5c06b7d99bfcb8fc3b7f13e
2025-09-24 12:16:38 +02:00
..
accessibility
acpi
This is the 5.4.296 stable release
2025-07-18 10:57:54 +00:00
amba
android
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
ata
ata: pata_cs5536: fix build on 32-bit UML
2025-07-17 18:24:57 +02:00
atm
atm: idt77252: Add missing dma_map_error()
2025-07-17 18:25:05 +02:00
auxdisplay
base
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
bcma
block
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
bluetooth
Merge tag 'ASB-2025-06-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-06-30 10:49:17 +03:00
bus
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
cdrom
char
Merge tag 'ASB-2025-06-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-06-30 10:49:17 +03:00
clk
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
clocksource
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
connector
counter
cpufreq
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
cpuidle
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
crypto
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
dax
dca
devfreq
dio
dma
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
dma-buf
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
edac
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
eisa
extcon
firewire
firmware
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
fpga
fpga: altera-cvp: Increase credit timeout
2025-06-04 14:32:32 +02:00
fsi
gnss
gpio
gpio: zynq: Fix wakeup source leaks on device unbind
2025-05-02 07:39:17 +02:00
gpu
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
greybus
hid
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
hsi
HSI: ssi_protocol: Fix use after free vulnerability in ssi_protocol Driver Due to Race Condition
2025-05-02 07:39:18 +02:00
hv
hwmon
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
hwspinlock
hwtracing
Merge tag 'ASB-2025-05-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-05-18 08:00:20 +00:00
i2c
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
i3c
Merge tag 'ASB-2025-06-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-06-30 10:49:17 +03:00
ide
idle
iio
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
infiniband
This is the 5.4.296 stable release
2025-07-18 10:57:54 +00:00
input
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
interconnect
iommu
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
ipack
irqchip
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
isdn
leds
Merge tag 'ASB-2025-05-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-05-18 08:00:20 +00:00
lightnvm
macintosh
mailbox
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
mcb
mcb: fix a double free bug in chameleon_parse_gdd()
2025-05-02 07:39:26 +02:00
md
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
media
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
memory
memstick
message
mfd
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
misc
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
mmc
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
mtd
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
mux
net
UPSTREAM: wireguard: queueing: get rid of per-peer ring buffers
2025-09-24 12:16:38 +02:00
nfc
ntb
ntb: reduce stack usage in idt_scan_mws
2025-05-02 07:39:28 +02:00
nubus
nvdimm
libnvdimm/labels: Fix divide error in nd_label_data_init()
2025-06-04 14:32:30 +02:00
nvme
nvmet-tcp: don't restore null sk_state_change
2025-06-04 14:32:35 +02:00
nvmem
Merge tag 'ASB-2025-05-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-05-18 08:00:20 +00:00
of
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
opp
oprofile
parisc
parport
pci
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
pcmcia
perf
Merge tag 'ASB-2025-06-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-06-30 10:49:17 +03:00
phy
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
pinctrl
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
platform
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
pnp
power
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
powercap
pps
ps3
ptp
pwm
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
rapidio
drivers/rapidio/rio_cm.c: prevent possible heap overwrite
2025-06-27 11:02:56 +01:00
ras
regulator
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
remoteproc
reset
rpmsg
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
rtc
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
s390
scsi: s390: zfcp: Ensure synchronous unit_add
2025-06-27 11:02:56 +01:00
sbus
scsi
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
sfi
sh
siox
slimbus
Merge tag 'ASB-2025-05-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-05-18 08:00:20 +00:00
soc
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
soundwire
spi
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
spmi
ssb
staging
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
target
This is the 5.4.294 stable release
2025-06-05 07:11:21 +00:00
tc
tee
tee: Prevent size calculation wraparound on 32-bit kernels
2025-06-27 11:02:55 +01:00
thermal
Merge tag 'ASB-2025-06-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-06-30 10:49:17 +03:00
thunderbolt
thunderbolt: Do not double dequeue a configuration request
2025-06-27 11:02:44 +01:00
tty
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
uio
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
usb
Merge tag 'ASB-2025-09-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-12 18:48:05 +03:00
vfio
vhost
video
Merge tag 'ASB-2025-08-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
2025-09-01 13:17:46 +03:00
virt
virtio
visorbus
vlynq
vme
w1
watchdog
watchdog: da9052_wdt: respect TWDMIN
2025-06-27 11:02:55 +01:00
xen
xen/swiotlb: relax alignment requirements
2025-06-04 14:32:37 +02:00
zorro
Kconfig
Makefile
OWNERS