From a9028e53ff099408c408455f9329f669952b9be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gr=C3=A9goire?= Date: Sat, 19 Sep 2026 23:03:39 -0400 Subject: [PATCH] ke/smr: allow invalid sequences in deferred_advance_commit This was buggy when the race was lost and it ended up trying to commit a deferred advance of 0, now explicitly make the magazine's sequence invalid and do nothing in deferred_advance_commit, avoiding an integer underflow. --- src/kern/smr.zig | 2 ++ src/mm/zone.zig | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/kern/smr.zig b/src/kern/smr.zig index ce76949..7ffaed3 100644 --- a/src/kern/smr.zig +++ b/src/kern/smr.zig @@ -274,6 +274,8 @@ pub fn deferred_advance(dom: *Domain) Sequence { /// Actually advance the global clock to a value previously returned by /// deferred_advance(). pub fn deferred_advance_commit(dom: *Domain, seq: Sequence) void { + if (seq == seq_invalid) return; + _ = dom.clock.write_seq.cmpxchgStrong( seq - seq_incr, seq, diff --git a/src/mm/zone.zig b/src/mm/zone.zig index 84bc29b..783c86a 100644 --- a/src/mm/zone.zig +++ b/src/mm/zone.zig @@ -792,6 +792,10 @@ pub const Zone = struct { // We lost the race. If the magazine we got was fully filled, // then put it in the depot. Otherwise, dispose of it. if (cnt == magazine_size.load()) { + // Ensure this magazine isn't counted as a freed one, + // it is instantly reclaimable. + nm.seq = ke.smr.seq_invalid; + Depot.free(nm, &cpu.depot.full_mags, self.reuse_policy); continue; }