linux/arch/mips/include/asm
Peter Zijlstra 47933ad41a arch: Introduce smp_load_acquire(), smp_store_release()
A number of situations currently require the heavyweight smp_mb(),
even though there is no need to order prior stores against later
loads.  Many architectures have much cheaper ways to handle these
situations, but the Linux kernel currently has no portable way
to make use of them.

This commit therefore supplies smp_load_acquire() and
smp_store_release() to remedy this situation.  The new
smp_load_acquire() primitive orders the specified load against
any subsequent reads or writes, while the new smp_store_release()
primitive orders the specifed store against any prior reads or
writes.  These primitives allow array-based circular FIFOs to be
implemented without an smp_mb(), and also allow a theoretical
hole in rcu_assign_pointer() to be closed at no additional
expense on most architectures.

In addition, the RCU experience transitioning from explicit
smp_read_barrier_depends() and smp_wmb() to rcu_dereference()
and rcu_assign_pointer(), respectively resulted in substantial
improvements in readability.  It therefore seems likely that
replacing other explicit barriers with smp_load_acquire() and
smp_store_release() will provide similar benefits.  It appears
that roughly half of the explicit barriers in core kernel code
might be so replaced.

[Changelog by PaulMck]

Reviewed-by: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Acked-by: Will Deacon <will.deacon@arm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Michael Ellerman <michael@ellerman.id.au>
Cc: Michael Neuling <mikey@neuling.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Victor Kaplansky <VICTORK@il.ibm.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Link: http://lkml.kernel.org/r/20131213150640.908486364@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2014-01-12 10:37:17 +01:00
..
dec DEC: Whitespace cleanup 2013-10-29 21:24:44 +01:00
emma MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
fw MIPS: sibyte: Declare the cfe_write() buffer as constant 2013-06-21 18:07:02 +02:00
ip32 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
lasat MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-ar7 Revert "MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET" 2013-07-01 15:10:58 +02:00
mach-ath79 MIPS: ath79: Remove ar933x_uart_platform.h header 2013-10-29 21:23:49 +01:00
mach-au1x00 MIPS: Cleanup CP0 PRId and CP1 FPIR register access masks 2013-09-18 20:25:19 +02:00
mach-bcm47xx MIPS: BCM47XX: Get GPIO pin from nvram configuration 2013-10-29 21:24:05 +01:00
mach-bcm63xx MIPS: BCM63XX: export PSI size from nvram 2013-08-05 18:58:55 +01:00
mach-cavium-octeon MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-cobalt MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-db1x00 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-dec MIPS: DECstation CPU feature overrides 2013-10-29 21:24:46 +01:00
mach-emma2rh MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-generic MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-ip22 MIPS: Optimize current_cpu_type() for better code. 2013-09-17 18:50:53 +02:00
mach-ip27 MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-ip28 MIPS: Optimize current_cpu_type() for better code. 2013-09-17 18:50:53 +02:00
mach-ip32 MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-jazz MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-jz4740 MIPS: jz4740: Remove custom DMA API 2013-07-05 11:40:52 +05:30
mach-lantiq MIPS: Lantiq: Falcon: add cpu-feature-override.h 2013-09-03 23:22:16 +02:00
mach-lasat MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-loongson MIPS: Remove unnecessary platform dma helper functions 2013-10-29 21:24:40 +01:00
mach-loongson1 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-malta MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-netlogic Merge branch 'mips-next' of http://dev.phrozen.org/githttp/mips-next into mips-for-linux-next 2012-12-13 19:40:13 +01:00
mach-pmcs-msp71xx MIPS: MSP71xx: Remove gpio drivers 2013-06-18 00:31:31 +02:00
mach-pnx833x MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-ralink MIPS: ralink: mt7620: Add cpu-feature-override header 2013-09-04 16:58:31 +02:00
mach-rc32434 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-rm MIPS: PMC-Sierra Yosemite: Remove support. 2012-12-13 18:15:30 +01:00
mach-sead3 MIPS: microMIPS: Disable LL/SC and fix linker bug. 2013-05-09 17:55:19 +02:00
mach-sibyte MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mach-tx39xx MIPS: PMC-Sierra Yosemite: Remove support. 2012-12-13 18:15:30 +01:00
mach-tx49xx MIPS: PMC-Sierra Yosemite: Remove support. 2012-12-13 18:15:30 +01:00
mach-vr41xx MIPS: PMC-Sierra Yosemite: Remove support. 2012-12-13 18:15:30 +01:00
mips-boards MIPS: Remove unused defines in piix4.h 2013-10-29 21:25:31 +01:00
netlogic MIPS: Netlogic: replace early_init_devtree() call 2013-11-06 16:14:04 -06:00
octeon Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-11-15 16:47:22 -08:00
pci MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sgi MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sibyte MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sn MIPS: IP27: Remove pfn_t. 2013-05-08 03:51:58 +02:00
txx9 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
vr41xx MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
xtalk MIPS: IP27: Fix build errors with CONFIG_PCI disabled. 2013-06-21 18:07:00 +02:00
abi.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
addrspace.h MIPS: Random whitespace clean-ups 2013-11-04 18:19:20 +01:00
amon.h
arch_hweight.h
asm-offsets.h
asm.h MIPS: microMIPS: Optimise 'memset' core library function. 2013-05-09 17:55:19 +02:00
asmmacro-32.h
asmmacro-64.h
asmmacro.h
atomic.h MIPS: Random whitespace clean-ups 2013-11-04 18:19:20 +01:00
barrier.h arch: Introduce smp_load_acquire(), smp_store_release() 2014-01-12 10:37:17 +01:00
bcache.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
bitops.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
bmips.h MIPS: BMIPS: Fix compilation for BMIPS5000 2013-08-26 15:31:55 +02:00
bootinfo.h MIPS: add detect_memory_region() 2013-05-08 01:19:11 +02:00
branch.h MIPS: MIPS16e: Support handling of delay slots. 2013-05-09 17:55:20 +02:00
break.h MIPS: Quit exporting kernel internel break codes to uapi/asm/break.h 2013-02-20 18:24:24 +01:00
bug.h
bugs.h
cache.h
cacheflush.h
cacheops.h MIPS: Loongson: Get rid of Loongson 2 #ifdefery all over arch/mips. 2013-10-29 21:25:24 +01:00
cevt-r4k.h
checksum.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
clkdev.h
clock.h MIPS: clock.h: Remove declaration of cpu_wait. 2013-05-22 01:34:25 +02:00
cmp.h
cmpxchg.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
compat-signal.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
compat.h Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2013-03-02 07:44:16 -08:00
compiler.h
cop2.h MIPS: Netlogic: COP2 save/restore code 2013-06-13 17:46:41 +02:00
cpu-features.h MIPS: cpu-features.h: s/MIPS53/MIPS64/ 2013-09-24 11:07:18 +02:00
cpu-info.h MIPS: Provide nice way to access boot CPU's data. 2013-09-17 13:58:12 +02:00
cpu-type.h MIPS: Optimize current_cpu_type() for better code. 2013-09-17 18:50:53 +02:00
cpu.h MIPS: Cleanup CP0 PRId and CP1 FPIR register access masks 2013-09-18 20:25:19 +02:00
debug.h
delay.h MIPS: Make __{,n,u}delay declarations match definitions and generic delay.h 2012-10-16 22:20:03 +02:00
device.h
div64.h
dma-coherence.h MIPS: Add option to disable software I/O coherency. 2013-05-01 16:32:49 -05:00
dma-mapping.h MIPS: Add option to disable software I/O coherency. 2013-05-01 16:32:49 -05:00
dma.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
ds1287.h
dsp.h MIPS: DSP: Fix DSP mask for registers. 2013-01-24 13:20:09 +01:00
edac.h
elf.h MIPS: Switch ELF core dumper to use regsets. 2013-10-29 21:25:09 +01:00
errno.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
exec.h
fb.h
fixmap.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
floppy.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
fpregdef.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
fpu_emulator.h MIPS: microMIPS: Floating point support. 2013-05-09 17:55:18 +02:00
fpu.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
ftrace.h
futex.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
gcmpregs.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
gic.h MIPS: Fix typos and cleanup comment 2013-07-01 15:10:57 +02:00
gio_device.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
gpio.h
gt64120.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
hardirq.h
hazards.h MIPS: Get rid of the use of .macro in C code. 2013-04-11 15:39:51 +02:00
highmem.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
hugetlb.h mm/hugetlb: add more arch-defined huge_pte functions 2013-04-29 15:54:33 -07:00
hw_irq.h
i8259.h
ide.h
idle.h MIPS: Idle: Break r4k_wait into two functions and fix it. 2013-05-22 01:34:28 +02:00
inst.h MIPS: MIPS16e: Support handling of delay slots. 2013-05-09 17:55:20 +02:00
io.h MIPS: define write{b,w,l,q}_relaxed 2013-07-01 15:10:59 +02:00
irq_cpu.h MIPS: add irqdomain support for the CPU IRQ controller 2013-02-17 01:25:34 +01:00
irq_gt641xx.h
irq_regs.h
irq.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
irqflags.h MIPS: Get rid of the use of .macro in C code. 2013-04-11 15:39:51 +02:00
isadep.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
jazz.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
jazzdma.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
jump_label.h compiler/gcc4: Add quirk for 'asm goto' miscompilation bug 2013-10-11 07:39:14 +02:00
Kbuild sched, arch: Create asm/preempt.h 2013-09-25 14:07:50 +02:00
kdebug.h
kexec.h MIPS: kdump: Add support 2012-12-13 16:46:47 +01:00
kgdb.h
kmap_types.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
kprobes.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
kvm_host.h KVM: mips: Get rid of KVM_HPAGE defines 2013-10-14 10:12:08 +03:00
linkage.h consolidate cond_syscall and SYSCALL_ALIAS declarations 2013-03-03 22:55:19 -05:00
local.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
m48t37.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mc146818-time.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mc146818rtc.h
mips_machine.h MIPS: move mips_{set,get}_machine_name() to a more generic place 2013-05-08 01:19:07 +02:00
mips_mt.h
mipsmtregs.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
mipsprom.h
mipsregs.h MIPS: Add MIPS R5 config5 register. 2013-09-19 11:16:44 +02:00
mmu_context.h MIPS: mm: Use scratch for PGD when !CONFIG_MIPS_PGD_C0_CONTEXT 2013-10-29 21:24:51 +01:00
mmu.h
mmzone.h
module.h MIPS: PMC-Sierra Yosemite: Remove support. 2012-12-13 18:15:30 +01:00
msc01_ic.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
nile4.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
paccess.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
page.h Revert "MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET" 2013-07-01 15:10:58 +02:00
pci.h MIPS: PCI: Use pci_resource_to_user to map pci memory space properly 2013-09-19 00:48:48 +02:00
perf_event.h
pgalloc.h mips: handle pgtable_page_ctor() fail 2013-11-15 09:32:18 +09:00
pgtable-32.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
pgtable-64.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
pgtable-bits.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
pgtable.h consolidate io_remap_pfn_range definitions 2013-06-29 12:46:35 +04:00
pmon.h
prefetch.h
processor.h MIPS: Cleanup indentation and whitespace 2013-07-01 15:10:57 +02:00
prom.h of: implement pci_address_to_pio as weak function 2013-10-09 20:04:06 -05:00
ptrace.h MIPS: Enable HAVE_ARCH_TRACEHOOK. 2013-10-29 21:25:11 +01:00
r4k-timer.h MIPS: Synchronize MIPS count one CPU at a time 2012-08-17 10:57:28 +02:00
r4kcache.h MIPS: Loongson: Get rid of Loongson 2 #ifdefery all over arch/mips. 2013-10-29 21:25:24 +01:00
reboot.h
reg.h
regdef.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
rm9k-ocd.h
rtlx.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
seccomp.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
setup.h MIPS: Add 8250/16550 serial early printk driver 2013-10-29 21:24:36 +01:00
sgialib.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sgiarcs.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
shmparam.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sigcontext.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
siginfo.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
signal.h Fix breakage in MIPS siginfo handling 2013-03-19 19:15:52 +01:00
sim.h mips: switch to generic sys_fork() and sys_clone() 2013-02-03 18:33:02 -05:00
smp-ops.h
smp.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
smtc_ipi.h
smtc_proc.h
smtc.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sni.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
socket.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
sparsemem.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
spinlock_types.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
spinlock.h MIPS: Remove redundant instructions from arch_spin_{,try}lock. 2013-04-26 17:18:24 +02:00
spram.h
stackframe.h MIPS: Move definition of SMP processor id register to header file 2013-10-29 21:23:51 +01:00
stackprotector.h MIPS: initial stack protector support 2013-07-01 15:10:48 +02:00
stacktrace.h
string.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
suspend.h
switch_to.h MIPS: Move cop2 save/restore to switch_to() 2013-06-13 17:46:41 +02:00
syscall.h MIPS: ftrace: Add support for syscall tracepoints. 2013-10-29 21:25:16 +01:00
termios.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
thread_info.h preempt: Make PREEMPT_ACTIVE generic 2013-11-13 20:21:47 +01:00
time.h MIPS: Always register R4K clock when selected 2013-10-29 21:25:26 +01:00
timex.h MIPS: Reimplement get_cycles(). 2013-09-18 16:31:49 +02:00
tlb.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
tlbdebug.h
tlbflush.h
tlbmisc.h
topology.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
traps.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
txx9irq.h
txx9pio.h
txx9tmr.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
types.h UAPI: (Scripted) Disintegrate arch/mips/include/asm 2012-10-09 09:47:14 +01:00
uaccess.h Merge branch 'mti-next' of git://git.linux-mips.org/pub/scm/sjhill/linux-sjhill into mips-for-linux-next 2013-05-09 17:57:30 +02:00
uasm.h MIPS: Delete __cpuinit/__CPUINIT usage from MIPS code 2013-07-14 19:36:51 -04:00
unaligned.h
unistd.h MIPS: ftrace: Add support for syscall tracepoints. 2013-10-29 21:25:16 +01:00
user.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
vdso.h
vga.h MIPS: Fix VGA_MAP_MEM macro. 2013-09-18 17:13:58 +02:00
vpe.h
war.h MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
watch.h
wbflush.h