diff options
author | Will Deacon <will.deacon@arm.com> | 2019-02-22 13:48:44 +0100 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2019-04-08 12:59:39 +0200 |
commit | d1be6a28b13ce6d1bc42bf9b6a9454c65839225b (patch) | |
tree | 320fd6244998529491991e7012ebfc5dd9709d4a /kernel | |
parent | docs/memory-barriers.txt: Rewrite "KERNEL I/O BARRIER EFFECTS" section (diff) | |
download | linux-d1be6a28b13ce6d1bc42bf9b6a9454c65839225b.tar.xz linux-d1be6a28b13ce6d1bc42bf9b6a9454c65839225b.zip |
asm-generic/mmiowb: Add generic implementation of mmiowb() tracking
In preparation for removing all explicit mmiowb() calls from driver
code, implement a tracking system in asm-generic based loosely on the
PowerPC implementation. This allows architectures with a non-empty
mmiowb() definition to have the barrier automatically inserted in
spin_unlock() following a critical section containing an I/O write.
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/Kconfig.locks | 7 | ||||
-rw-r--r-- | kernel/locking/spinlock.c | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks index fbba478ae522..6ba2570eddad 100644 --- a/kernel/Kconfig.locks +++ b/kernel/Kconfig.locks @@ -251,3 +251,10 @@ config ARCH_USE_QUEUED_RWLOCKS config QUEUED_RWLOCKS def_bool y if ARCH_USE_QUEUED_RWLOCKS depends on SMP + +config ARCH_HAS_MMIOWB + bool + +config MMIOWB + def_bool y if ARCH_HAS_MMIOWB + depends on SMP diff --git a/kernel/locking/spinlock.c b/kernel/locking/spinlock.c index 936f3d14dd6b..0ff08380f531 100644 --- a/kernel/locking/spinlock.c +++ b/kernel/locking/spinlock.c @@ -22,6 +22,13 @@ #include <linux/debug_locks.h> #include <linux/export.h> +#ifdef CONFIG_MMIOWB +#ifndef arch_mmiowb_state +DEFINE_PER_CPU(struct mmiowb_state, __mmiowb_state); +EXPORT_PER_CPU_SYMBOL(__mmiowb_state); +#endif +#endif + /* * If lockdep is enabled then we use the non-preemption spin-ops * even on CONFIG_PREEMPT, because lockdep assumes that interrupts are |