linux-uconsole/arch/arc/include/asm
Vineet Gupta 0c06a0a693 ARC: Workaround spinlock livelock in SMP SystemC simulation
commit 6c00350b57 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
..
arcregs.h ARC: Boot #2: Verbose Boot reporting / feature verification 2013-02-15 23:16:07 +05:30
asm-offsets.h
atomic.h ARC: Atomic/bitops/cmpxchg/barriers 2013-02-11 20:00:30 +05:30
barrier.h ARC: Atomic/bitops/cmpxchg/barriers 2013-02-11 20:00:30 +05:30
bitops.h ARC: Atomic/bitops/cmpxchg/barriers 2013-02-11 20:00:30 +05:30
bug.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
cache.h ARC: [mm] Aliasing VIPT dcache support 4/4 2013-05-09 22:00:57 +05:30
cacheflush.h ARC: Use enough bits for determining page's cache color 2013-05-23 14:25:09 +05:30
checksum.h ARC: Checksum/byteorder/swab routines 2013-02-11 20:00:34 +05:30
clk.h ARC: [DeviceTree] Convert some Kconfig items to runtime values 2013-02-15 23:15:56 +05:30
cmpxchg.h ARC: Atomic/bitops/cmpxchg/barriers 2013-02-11 20:00:30 +05:30
current.h ARC: [optim] Cache "current" in Register r25 2013-02-15 23:15:58 +05:30
defines.h ARC: Boot #2: Verbose Boot reporting / feature verification 2013-02-15 23:16:07 +05:30
delay.h ARC: Fix __udelay calculation 2013-10-18 07:45:45 -07:00
disasm.h ARC: disassembly (needed by kprobes/kgdb/unaligned-access-emul) 2013-02-15 23:16:04 +05:30
dma-mapping.h arc: fix dma_address assignment during dma_map_sg() 2013-03-19 15:34:53 +05:30
dma.h ARC: I/O and DMA Mappings 2013-02-15 23:15:54 +05:30
elf.h ARC: Remove SET_PERSONALITY (tracks cross-arch change) 2013-03-18 14:37:05 +05:30
entry.h ARC: Fix the typo in event identifier flags used by ptrace 2013-03-20 18:45:45 +05:30
exec.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
futex.h ARC: Futex support 2013-02-15 23:16:00 +05:30
io.h ARC: Add support for ioremap_prot API 2013-02-15 23:16:11 +05:30
irq.h ARC: Prepare interrupt code for external controllers 2013-05-07 13:43:58 +05:30
irqflags.h ARC: Add implicit compiler barrier to raw_local_irq* functions 2013-04-08 16:10:26 -07:00
Kbuild ARC: [mm] Aliasing VIPT dcache support 4/4 2013-05-09 22:00:57 +05:30
kdebug.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
kgdb.h ARC: make allyesconfig build breakages 2013-03-11 19:01:09 +05:30
kprobes.h ARC: kprobes support 2013-02-15 23:16:05 +05:30
linkage.h ARC: Support for single cycle Close Coupled Mem (CCM) 2013-02-15 23:16:10 +05:30
mach_desc.h ARC: make a copy of flat DT 2013-02-26 14:25:18 +05:30
mmu.h ARC: MMU Context Management 2013-02-15 23:15:51 +05:30
mmu_context.h ARC: SMP support 2013-02-15 23:16:02 +05:30
module.h ARC: DWARF2 .debug_frame based stack unwinder 2013-02-15 23:16:03 +05:30
mutex.h ARC: SMP support 2013-02-15 23:16:02 +05:30
page.h ARC: lazy dcache flush broke gdb in non-aliasing configs 2013-05-25 14:15:55 +05:30
perf_event.h ARC: perf support (software counters only) 2013-02-15 23:16:09 +05:30
pgalloc.h ARC: Page Table Management 2013-02-15 23:15:51 +05:30
pgtable.h ARC: copy_(to|from)_user() to honor usermode-access permissions 2013-05-23 10:33:03 +05:30
processor.h ARC: SMP support 2013-02-15 23:16:02 +05:30
prom.h ARC: [Review] Multi-platform image #2: Board callback Infrastructure 2013-02-15 23:16:13 +05:30
ptrace.h ARC: gdbserver breakage in Big-Endian configuration #1 2013-08-29 09:47:29 -07:00
sections.h ARC: SMP failed to boot due to missing IVT setup 2013-10-18 07:45:45 -07:00
segment.h ARC: uaccess friends 2013-02-11 20:00:31 +05:30
serial.h ARC: [TB10x] Add support for TB10x platform 2013-05-07 13:43:59 +05:30
setup.h ARC: UAPI Disintegrate arch/arc/include/asm 2013-02-15 23:16:11 +05:30
shmparam.h ARC: [mm] Aliasing VIPT dcache support 4/4 2013-05-09 22:00:57 +05:30
smp.h ARC: [Review] Multi-platform image #7: SMP common code to use callbacks 2013-02-15 23:16:16 +05:30
spinlock.h ARC: Workaround spinlock livelock in SMP SystemC simulation 2013-10-18 07:45:45 -07:00
spinlock_types.h ARC: Spinlock/rwlock/mutex primitives 2013-02-11 20:00:35 +05:30
string.h ARC: String library 2013-02-11 20:00:35 +05:30
switch_to.h ARC: Process-creation/scheduling/idle-loop 2013-02-11 20:00:38 +05:30
syscall.h ARC: gdbserver breakage in Big-Endian configuration #2 2013-08-29 09:47:29 -07:00
syscalls.h ARC: ABIv3: fork/vfork wrappers not needed in "no-legacy-syscall" ABI 2013-03-11 19:01:10 +05:30
thread_info.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
timex.h ARC: Timers/counters/delay management 2013-02-11 20:00:39 +05:30
tlb-mmu1.h ARC: MMU Exception Handling 2013-02-15 23:15:52 +05:30
tlb.h ARC: copy_(to|from)_user() to honor usermode-access permissions 2013-05-23 10:33:03 +05:30
tlbflush.h ARC: TLB flush Handling 2013-02-15 23:15:53 +05:30
uaccess.h ARC: Fix 32-bit wrap around in access_ok() 2013-10-18 07:45:45 -07:00
unaligned.h ARC: Unaligned access emulation 2013-02-15 23:16:06 +05:30
unwind.h ARC: DWARF2 .debug_frame based stack unwinder 2013-02-15 23:16:03 +05:30