On Mon, Jun 19, 2023 at 04:41:13PM -0700, Dave Hansen wrote: > On 6/19/23 07:46, kirill.shutemov@xxxxxxxxxxxxxxx wrote: > >>> > >>> Using atomic_set() requires changing tdmr->pamt_4k_base to atomic_t, which is a > >>> little bit silly or overkill IMHO. Looking at the code, it seems > >>> arch_atomic_set() simply uses __WRITE_ONCE(): > >> How about _adding_ a variable that protects tdmr->pamt_4k_base? > >> Wouldn't that be more straightforward than mucking around with existing > >> types? > > What's wrong with simple global spinlock that protects all tdmr->pamt_*? > > It is much easier to follow than a custom serialization scheme. > > Quick, what prevents a: > > spin_lock() => #MC => spin_lock() > > deadlock? > > Plain old test/sets don't deadlock ever. Depends on what you mean; anything that spin-waits will deadlock, doesn't matter if its a test-and-set or not. The thing with these non-maskable exceptions/interrupts is that they must be wait-free. If serialization is required it needs to be try based and accept failure without waiting.