Description
In the Linux kernel, the following vulnerability has been resolved: memcg: use round-robin victim selection in refill_stock Harry Yoo reported that get_random_u32_below() is not safe to call in the nmi context and memcg charge draining can happen in nmi context. More specifically get_random_u32_below() is neither reentrant- nor NMI-safe: it acquires a per-cpu local_lock via local_lock_irqsave() on the batched_entropy_u32 state. An NMI that lands on a CPU mid-update of the ChaCha batch state and recurses into the random subsystem would corrupt that state. The memcg_stock local_trylock prevents re-entry on the percpu stock itself, but cannot protect an unrelated subsystem's per-cpu lock. Replace the random pick with a per-cpu round-robin counter stored in memcg_stock_pcp and serialized by the same local_trylock that already guards cached[] and nr_pages[]. No atomics, no random calls, no extra locks needed.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
f735eebe55f8f61758fe014bd0b02ab50b059e4d to < 89bd8215e25aa6999cc51696da418e0d422bc5e0affectedf735eebe55f8f61758fe014bd0b02ab50b059e4d to < 00731bd7e18f182a32ca54d6b176eaa470b51ed7affectedf735eebe55f8f61758fe014bd0b02ab50b059e4d to < c0cafe24d3f6534294c4b2bc2d47734ff7cbd313affected
Linux Linux
Default version status: affected
6.16affected0 to < 6.16unaffected6.18.36 to ≤ 6.18.*unaffected7.0.13 to ≤ 7.0.*unaffected7.1 to ≤ *unaffected