On Wed, Aug 08, 2018 at 08:46:29AM -0400, Steven Rostedt wrote: > On Tue, 7 Aug 2018 20:53:54 -0700 > Joel Fernandes <joe...@google.com> wrote: > > > > > When I talked to Paul few months ago about SRCU from NMI context, he > > > mentioned the per-cpu memory operations during srcu_read_lock can be > > > NMI interrupted, that's why we added that warning. > > > > So I looked more closely, __srcu_read_lock on 2 different handles may > > still be doing a this_cpu_inc on the same location.. > > (sp->sda->srcu_lock_count). :-( > > > > Paul any ideas on how to solve this? > > > > It does start to seem like a show stopper :-( > > What's wrong with a this_cpu_inc()? It's atomic for the CPU. Although > it wont be atomic for the capture of the idx. But I also don't see > interrupts being disabled, thus an NMI is no different than any > interrupt doing the same thing, right?
On architectures without increment-memory instructions, if you take an NMI between the load from sp->sda->srcu_lock_count and the later store, you lose a count. Note that both __srcu_read_lock() and __srcu_read_unlock() do increments of different locations, so you cannot rely on the usual "NMI fixes up before exit" semantics you get when incrementing and decrementing the same location. Thanx, Paul