From: odedkatz <katz.oded@gmail.com>
To: wireguard@lists.zx2c4.com
Cc: odedk@twingate.com, alexey@twingate.com, odedkatz <katz.oded@gmail.com>
Subject: [PATCH 0/1] wintun driver get stalled for few sec until another packet is being sent -- approach 2
Date: Tue, 24 Feb 2026 15:47:16 -0800 [thread overview]
Message-ID: <20260224234717.16883-1-katz.oded@gmail.com> (raw)
## Problem
High-speed TCP uploads stall for 4-5 seconds when the sender and receiver are close (~1ms RTT). The root cause is a missed-wakeup race in the Receive ring's Alertable/Tail signaling protocol between the userspace API (WintunSendPacket) and the kernel0 consumer thread (TunProcessReceiveData).
On x86-64, WriteRelease/ReadAcquire provide acquire-release semantics but do not emit MFENCE — the only instruction that prevents store-load reordering (the one reordering x86 permits). Both cores can simultaneously observe stale values of the other's store, causing the userspace to skip SetEvent while the driver enters KeWaitForMultipleObjects indefinitely.
The driver sleeps until a TCP retransmission (RTO ~1s + exponential backoff) coincidentally wins the race, producing the observed 4-5 second stalls.
## Fix
Insert MemoryBarrier() between each store-load pair on both sides. This guarantees that at least one side always sees the other's store, eliminating the missed wakeup. The Alertable optimization (avoiding SetEvent syscalls when the driver is actively spinning) is fully preserved.
Alexey Lapuka (1):
Fix missed-wakeup race in ring buffer Alertable signaling
api/session.c | 1 +
driver/wintun.c | 1 +
2 files changed, 2 insertions(+)
--
2.43.0
next reply other threads:[~2026-02-24 23:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-24 23:47 odedkatz [this message]
2026-02-24 23:47 ` [PATCH 1/1] Fix missed-wakeup race in ring buffer Alertable signaling odedkatz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260224234717.16883-1-katz.oded@gmail.com \
--to=katz.oded@gmail.com \
--cc=alexey@twingate.com \
--cc=odedk@twingate.com \
--cc=wireguard@lists.zx2c4.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox