Re: [PATCH v2] Wireguard: Fix data-race in rx/tx counter
From: Andrew Lunn <andrew@lunn.ch>
Date: 2026-06-29 14:51:58
Also in:
lkml
When looking around drivers/net, I found a few u64_stats uses without per-cpu. I will do some digging to understand the reasoning behind it, compared to the original "bare u64 counters" in wireguard.
/* * Protect against 64-bit values tearing on 32-bit architectures. This is * typically used for statistics read/update in different subsystems. The assumption is, updating a 64 bit value on a 64 bit machine is a single operation. You either see the old value, or the new value. For statistics counters, we general don't care about valid but slightly outdated values. On a 32 bit machine, updating a 64 bit value requires up to two reads and two writes. So if a reader and a writer operate at the same time, the reader might see one of the invalid intermediary states, also know as tearing. We do care about a totally wrong value. u64_stats_sync.h gives you a mechanism which is totally free on 64bit systems, but gives the needed protection on 32 bit systems to avoid seeing tears. You only need mutual exclusion on the writer side, from other writers. If you have per-cpu counters, you naturally get mutual exclusion, the CPU cannot be a writer twice to its own per CPU counters. However, without per-CPU counters, you need some form of locking. I don't know the locking used in wireguard, it might already be in place? If so, this would be a cheap solution. Andrew