On Thu 2019-02-14 13:10:28, John Ogness wrote: > On 2019-02-14, Petr Mladek <pmladek@xxxxxxxx> wrote: > >>> cpu_store looks like an implementation detail. The caller > >>> needs to remember it to handle the nesting properly. > >>> > >>> We could achieve the same with a recursion counter hidden > >>> in struct prb_lock. > > > > The atomic operations are tricky. I feel other lost in them. > > Well, I still think that it might easier to detect nesting > > on the same CPU, see below. > > > > Also there is no need to store irq flags in per-CPU variable. > > Only the first owner of the lock need to store the flags. The others > > are spinning or nested. > > > > struct prb_cpulock { > > atomic_t owner; > > unsigned int flags; > > int nesting; /* intialized to 0 */ > > }; > > > > void prb_lock(struct prb_cpulock *cpu_lock) > > { > > unsigned int flags; > > int cpu; > > I added an explicit preempt_disable here: > > cpu = get_cpu(); It is superfluous. Preemption is not possible when interrupts are disabled. > It looks great. I've run my stress tests on it and everything is running > well. I am glad to read this. > Thanks for simplifying this! You are welcome. Best Regards, Petr