Star64_linux/include/asm-generic
Will Deacon 0bce9c46bf mutex: Place lock in contended state after fastpath_lock failure
ARM recently moved to asm-generic/mutex-xchg.h for its mutex
implementation after the previous implementation was found to be missing
some crucial memory barriers. However, this has revealed some problems
running hackbench on SMP platforms due to the way in which the
MUTEX_SPIN_ON_OWNER code operates.

The symptoms are that a bunch of hackbench tasks are left waiting on an
unlocked mutex and therefore never get woken up to claim it. This boils
down to the following sequence of events:

        Task A        Task B        Task C        Lock value
0                                                     1
1       lock()                                        0
2                     lock()                          0
3                     spin(A)                         0
4       unlock()                                      1
5                                   lock()            0
6                     cmpxchg(1,0)                    0
7                     contended()                    -1
8       lock()                                        0
9       spin(C)                                       0
10                                  unlock()          1
11      cmpxchg(1,0)                                  0
12      unlock()                                      1

At this point, the lock is unlocked, but Task B is in an uninterruptible
sleep with nobody to wake it up.

This patch fixes the problem by ensuring we put the lock into the
contended state if we fail to acquire it on the fastpath, ensuring that
any blocked waiters are woken up when the mutex is released.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Chris Mason <chris.mason@fusionio.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: <stable@vger.kernel.org>
Reviewed-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-6e9lrw2avczr0617fzl5vqb8@git.kernel.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2012-08-13 18:46:54 +02:00
..
bitops
4level-fixup.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
auxvec.h
barrier.h
bitops.h
bitsperlong.h vsprintf: further optimize decimal conversion 2012-05-31 17:49:27 -07:00
bug.h bug.h: Fix up CONFIG_BUG=n implicit function declarations. 2012-06-25 10:32:49 -07:00
bugs.h
cache.h
cacheflush.h
checksum.h
cmpxchg-local.h
cmpxchg.h
cputime.h
current.h
delay.h
device.h
div64.h
dma-coherent.h common: dma-mapping: add support for generic dma_mmap_* calls 2012-07-30 12:25:46 +02:00
dma-contiguous.h mm: cma: fix condition check when setting global cma area 2012-07-06 12:02:04 +02:00
dma-mapping-broken.h
dma-mapping-common.h common: dma-mapping: introduce dma_get_sgtable() function 2012-07-30 12:25:46 +02:00
dma.h
emergency-restart.h
errno-base.h
errno.h
exec.h
fb.h
fcntl.h c/r: fcntl: add F_GETOWNER_UIDS option 2012-07-30 17:25:21 -07:00
ftrace.h
futex.h
getorder.h
gpio.h
hardirq.h
hw_irq.h
ide_iops.h
int-l64.h
int-ll64.h
io-64-nonatomic-hi-lo.h
io-64-nonatomic-lo-hi.h
io.h
ioctl.h
ioctls.h
iomap.h
ipcbuf.h
irq.h
irq_regs.h
irqflags.h
Kbuild KVM: Export asm-generic/kvm_para.h 2012-05-29 12:31:01 +03:00
Kbuild.asm
kdebug.h
kmap_types.h asm-generic: remove km_type definitions 2012-07-24 15:27:30 +08:00
kvm_para.h KVM: make asm-generic/kvm_para.h have an ifdef __KERNEL__ block 2012-05-21 17:47:52 +03:00
libata-portmap.h
linkage.h
local.h
local64.h
memory_model.h
mm_hooks.h
mman-common.h
mman.h
mmu.h
mmu_context.h
module.h
msgbuf.h
mutex-dec.h
mutex-null.h
mutex-xchg.h mutex: Place lock in contended state after fastpath_lock failure 2012-08-13 18:46:54 +02:00
mutex.h
page.h
param.h
parport.h
pci-bridge.h
pci-dma-compat.h
pci.h
pci_iomap.h
percpu.h
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h thp: avoid atomic64_read in pmd_read_atomic for 32bit PAE 2012-06-20 14:39:35 -07:00
poll.h
posix_types.h bury __kernel_nlink_t, make internal nlink_t consistent 2012-05-30 21:04:50 -04:00
ptrace.h
resource.h
rtc.h
rwsem.h
scatterlist.h
sections.h
segment.h
sembuf.h
serial.h
setup.h
shmbuf.h
shmparam.h
siginfo.h
signal-defs.h
signal.h
sizes.h ARM: 7430/1: sizes.h: move from asm-generic to <linux/sizes.h> 2012-06-28 17:14:34 +01:00
socket.h
sockios.h
spinlock.h
stat.h
statfs.h
string.h
swab.h
switch_to.h
syscall.h
syscalls.h
termbits.h
termios-base.h
termios.h
timex.h
tlb.h mm/mmu_gather: enable tlb flush range in generic mmu_gather 2012-06-27 19:29:11 -07:00
tlbflush.h
topology.h
types.h
uaccess-unaligned.h
uaccess.h
ucontext.h
unaligned.h
unistd.h
user.h
vga.h
vmlinux.lds.h
word-at-a-time.h word-at-a-time: make the interfaces truly generic 2012-05-26 11:33:40 -07:00
xor.h