android_kernel_samsung_msm8976/arch/arc
Vineet Gupta 0c06a0a693 ARC: Workaround spinlock livelock in SMP SystemC simulation
commit 6c00350b573c0bd3635436e43e8696951dd6e1b6 upstream.

Some ARC SMP systems lack native atomic R-M-W (LLOCK/SCOND) insns and
can only use atomic EX insn (reg with mem) to build higher level R-M-W
primitives. This includes a SystemC based SMP simulation model.

So rwlocks need to use a protecting spinlock for atomic cmp-n-exchange
operation to update reader(s)/writer count.

The spinlock operation itself looks as follows:

	mov reg, 1		; 1=locked, 0=unlocked
retry:
	EX reg, [lock]		; load existing, store 1, atomically
	BREQ reg, 1, rety	; if already locked, retry

In single-threaded simulation, SystemC alternates between the 2 cores
with "N" insn each based scheduling. Additionally for insn with global
side effect, such as EX writing to shared mem, a core switch is
enforced too.

Given that, 2 cores doing a repeated EX on same location, Linux often
got into a livelock e.g. when both cores were fiddling with tasklist
lock (gdbserver / hackbench) for read/write respectively as the
sequence diagram below shows:

           core1                                   core2
         --------                                --------
1. spin lock [EX r=0, w=1] - LOCKED
2. rwlock(Read)            - LOCKED
3. spin unlock  [ST 0]     - UNLOCKED
                                         spin lock [EX r=0,w=1] - LOCKED
                      -- resched core 1----

5. spin lock [EX r=1] - ALREADY-LOCKED

                      -- resched core 2----
6.                                       rwlock(Write) - READER-LOCKED
7.                                       spin unlock [ST 0]
8.                                       rwlock failed, retry again

9.                                       spin lock  [EX r=0, w=1]
                      -- resched core 1----

10  spinlock locked in #9, retry #5
11. spin lock [EX gets 1]
                      -- resched core 2----
...
...

The fix was to unlock using the EX insn too (step 7), to trigger another
SystemC scheduling pass which would let core1 proceed, eliding the
livelock.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-10-18 07:45:45 -07:00
..
boot ARC: [TB10x] Remove redundant abilis,simple-pinctrl mechanism 2013-05-15 10:12:03 +05:30
configs ARC: Add support for nSIM OSCI System C model 2013-05-07 13:44:00 +05:30
include ARC: Workaround spinlock livelock in SMP SystemC simulation 2013-10-18 07:45:45 -07:00
kernel ARC: Handle zero-overhead-loop in unaligned access handler 2013-10-18 07:45:45 -07:00
lib ARC: [lib] strchr breakage in Big-endian configuration 2013-08-29 09:47:34 -07:00
mm ARC: lazy dcache flush broke gdb in non-aliasing configs 2013-05-25 14:15:55 +05:30
oprofile ARC: OProfile support 2013-02-15 23:16:00 +05:30
plat-arcfpga ARC port updates for Linux 3.10 (part 1) 2013-05-09 14:36:27 -07:00
plat-tb10x ARC: [TB10x] Remove redundant abilis,simple-pinctrl mechanism 2013-05-15 10:12:03 +05:30
Kbuild
Kconfig ARC: [mm] Aliasing VIPT dcache support 2/4 2013-05-09 21:59:46 +05:30
Kconfig.debug
Makefile ARC: [TB10x] Add support for TB10x platform 2013-05-07 13:43:59 +05:30