linux/include/asm-generic
Peter Zijlstra 54cf809b95 locking,qspinlock: Fix spin_is_locked() and spin_unlock_wait()
Similar to commits:

  51d7d5205d ("powerpc: Add smp_mb() to arch_spin_is_locked()")
  d86b8da04d ("arm64: spinlock: serialise spin_unlock_wait against concurrent lockers")

qspinlock suffers from the fact that the _Q_LOCKED_VAL store is
unordered inside the ACQUIRE of the lock.

And while this is not a problem for the regular mutual exclusive
critical section usage of spinlocks, it breaks creative locking like:

	spin_lock(A)			spin_lock(B)
	spin_unlock_wait(B)		if (!spin_is_locked(A))
	do_something()			  do_something()

In that both CPUs can end up running do_something at the same time,
because our _Q_LOCKED_VAL store can drop past the spin_unlock_wait()
spin_is_locked() loads (even on x86!!).

To avoid making the normal case slower, add smp_mb()s to the less used
spin_unlock_wait() / spin_is_locked() side of things to avoid this
problem.

Reported-and-tested-by: Davidlohr Bueso <dave@stgolabs.net>
Reported-by: Giovanni Gherdovich <ggherdovich@suse.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: stable@vger.kernel.org   # v4.2 and later
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-05-20 19:30:32 -07:00
..
bitops
4level-fixup.h
Kbuild.asm
asm-offsets.h
atomic-long.h
atomic.h
atomic64.h
audit_change_attr.h
audit_dir_write.h
audit_read.h
audit_signal.h
audit_write.h
barrier.h
bitops.h
bitsperlong.h
bug.h
bugs.h
cache.h
cacheflush.h
checksum.h
clkdev.h
cmpxchg-local.h
cmpxchg.h
cputime.h
cputime_jiffies.h
cputime_nsecs.h
current.h
delay.h
device.h
div64.h
dma-contiguous.h
dma.h
early_ioremap.h
emergency-restart.h
exec.h
fb.h
fixmap.h
ftrace.h
futex.h asm-generic/futex: Re-enable preemption in futex_atomic_cmpxchg_inatomic() 2016-04-21 11:06:09 +02:00
getorder.h
gpio.h
hardirq.h
hugetlb.h
hw_irq.h
ide_iops.h
int-ll64.h
io.h io-64-nonatomic: Add relaxed accessor variants 2016-05-03 18:23:02 +01:00
ioctl.h
iomap.h
irq.h
irq_regs.h
irq_work.h
irqflags.h
kdebug.h
kmap_types.h
kvm_para.h
libata-portmap.h
linkage.h
local.h
local64.h
mcs_spinlock.h
memory_model.h
mm-arch-hooks.h
mm_hooks.h
mmu.h
mmu_context.h
module.h
msi.h
mutex-dec.h
mutex-null.h
mutex-xchg.h
mutex.h
page.h
param.h
parport.h
pci.h
pci_iomap.h
percpu.h
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h arch: fix has_transparent_hugepage() 2016-05-19 19:12:14 -07:00
preempt.h
ptrace.h
qrwlock.h
qrwlock_types.h
qspinlock.h locking,qspinlock: Fix spin_is_locked() and spin_unlock_wait() 2016-05-20 19:30:32 -07:00
qspinlock_types.h
resource.h
rtc.h
rwsem.h locking/rwsem: Introduce basis for down_write_killable() 2016-04-13 10:42:20 +02:00
seccomp.h seccomp: Get compat syscalls from asm-generic header 2016-05-13 14:02:00 +02:00
sections.h
segment.h
serial.h
siginfo.h SIGNAL: Move generic copy_siginfo() to signal.h 2016-05-13 14:02:10 +02:00
signal.h
simd.h
sizes.h
spinlock.h
statfs.h
string.h
switch_to.h
syscall.h
syscalls.h
termios-base.h
termios.h
timex.h
tlb.h
tlbflush.h
topology.h
trace_clock.h
uaccess-unaligned.h
uaccess.h
unaligned.h
unistd.h
user.h
vga.h
vmlinux.lds.h x86/asm: Make sure verify_cpu() has a good stack 2016-04-13 11:52:19 +02:00
vtime.h
word-at-a-time.h
xor.h