Revision 1e6e57d9b34a9075d5f9e2048ea7b09756590d11 authored by Will Deacon on 04 July 2016, 16:44:48 UTC, committed by Will Deacon on 19 October 2016, 14:37:29 UTC
Writing the outer loop of an LL/SC sequence using do {...} while
constructs potentially allows the compiler to hoist memory accesses
between the STXR and the branch back to the LDXR. On CPUs that do not
guarantee forward progress of LL/SC loops when faced with memory
accesses to the same ERG (up to 2k) between the failed STXR and the
branch back, we may end up livelocking.

This patch avoids this issue in our percpu atomics by rewriting the
outer loop as part of the LL/SC inline assembly block.

Cc: <stable@vger.kernel.org>
Fixes: f97fc810798c ("arm64: percpu: Implement this_cpu operations")
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
1 parent 1c5b51d
History
File Mode Size
bpf
configs
debug
events
gcov
irq
livepatch
locking
power
printk
rcu
sched
time
trace
.gitignore -rw-r--r-- 69 bytes
Kconfig.freezer -rw-r--r-- 52 bytes
Kconfig.hz -rw-r--r-- 1.6 KB
Kconfig.locks -rw-r--r-- 4.8 KB
Kconfig.preempt -rw-r--r-- 2.1 KB
Makefile -rw-r--r-- 4.1 KB
acct.c -rw-r--r-- 15.4 KB
async.c -rw-r--r-- 9.9 KB
audit.c -rw-r--r-- 54.0 KB
audit.h -rw-r--r-- 11.1 KB
audit_fsnotify.c -rw-r--r-- 6.1 KB
audit_tree.c -rw-r--r-- 22.6 KB
audit_watch.c -rw-r--r-- 14.4 KB
auditfilter.c -rw-r--r-- 34.0 KB
auditsc.c -rw-r--r-- 64.4 KB
backtracetest.c -rw-r--r-- 2.1 KB
bounds.c -rw-r--r-- 703 bytes
capability.c -rw-r--r-- 12.9 KB
cgroup.c -rw-r--r-- 176.3 KB
cgroup_freezer.c -rw-r--r-- 12.4 KB
cgroup_pids.c -rw-r--r-- 8.9 KB
compat.c -rw-r--r-- 29.5 KB
configs.c -rw-r--r-- 2.8 KB
context_tracking.c -rw-r--r-- 6.3 KB
cpu.c -rw-r--r-- 46.9 KB
cpu_pm.c -rw-r--r-- 6.5 KB
cpuset.c -rw-r--r-- 76.5 KB
crash_dump.c -rw-r--r-- 1.3 KB
cred.c -rw-r--r-- 21.5 KB
delayacct.c -rw-r--r-- 4.5 KB
dma.c -rw-r--r-- 3.6 KB
elfcore.c -rw-r--r-- 396 bytes
exec_domain.c -rw-r--r-- 1.4 KB
exit.c -rw-r--r-- 43.1 KB
extable.c -rw-r--r-- 4.0 KB
fork.c -rw-r--r-- 55.5 KB
freezer.c -rw-r--r-- 4.4 KB
futex.c -rw-r--r-- 89.4 KB
futex_compat.c -rw-r--r-- 4.5 KB
groups.c -rw-r--r-- 5.2 KB
hung_task.c -rw-r--r-- 5.9 KB
irq_work.c -rw-r--r-- 4.4 KB
jump_label.c -rw-r--r-- 15.2 KB
kallsyms.c -rw-r--r-- 15.7 KB
kcmp.c -rw-r--r-- 4.4 KB
kcov.c -rw-r--r-- 6.6 KB
kexec.c -rw-r--r-- 6.8 KB
kexec_core.c -rw-r--r-- 39.6 KB
kexec_file.c -rw-r--r-- 24.5 KB
kexec_internal.h -rw-r--r-- 1.2 KB
kmod.c -rw-r--r-- 19.1 KB
kprobes.c -rw-r--r-- 60.7 KB
ksysfs.c -rw-r--r-- 6.2 KB
kthread.c -rw-r--r-- 32.1 KB
latencytop.c -rw-r--r-- 7.8 KB
membarrier.c -rw-r--r-- 2.4 KB
memremap.c -rw-r--r-- 11.9 KB
module-internal.h -rw-r--r-- 458 bytes
module.c -rw-r--r-- 109.5 KB
module_signing.c -rw-r--r-- 2.2 KB
notifier.c -rw-r--r-- 16.3 KB
nsproxy.c -rw-r--r-- 6.4 KB
padata.c -rw-r--r-- 25.4 KB
panic.c -rw-r--r-- 15.4 KB
params.c -rw-r--r-- 24.1 KB
pid.c -rw-r--r-- 15.0 KB
pid_namespace.c -rw-r--r-- 11.0 KB
profile.c -rw-r--r-- 14.7 KB
ptrace.c -rw-r--r-- 31.6 KB
range.c -rw-r--r-- 3.0 KB
reboot.c -rw-r--r-- 13.3 KB
relay.c -rw-r--r-- 32.1 KB
resource.c -rw-r--r-- 39.3 KB
seccomp.c -rw-r--r-- 23.6 KB
signal.c -rw-r--r-- 94.2 KB
smp.c -rw-r--r-- 20.8 KB
smpboot.c -rw-r--r-- 13.3 KB
smpboot.h -rw-r--r-- 601 bytes
softirq.c -rw-r--r-- 19.0 KB
stacktrace.c -rw-r--r-- 1.7 KB
stop_machine.c -rw-r--r-- 17.1 KB
sys.c -rw-r--r-- 57.6 KB
sys_ni.c -rw-r--r-- 7.1 KB
sysctl.c -rw-r--r-- 67.6 KB
sysctl_binary.c -rw-r--r-- 50.8 KB
task_work.c -rw-r--r-- 3.3 KB
taskstats.c -rw-r--r-- 14.8 KB
test_kprobes.c -rw-r--r-- 7.4 KB
torture.c -rw-r--r-- 21.0 KB
tracepoint.c -rw-r--r-- 14.5 KB
tsacct.c -rw-r--r-- 5.1 KB
ucount.c -rw-r--r-- 5.5 KB
uid16.c -rw-r--r-- 5.0 KB
up.c -rw-r--r-- 2.0 KB
user-return-notifier.c -rw-r--r-- 1.3 KB
user.c -rw-r--r-- 5.4 KB
user_namespace.c -rw-r--r-- 27.3 KB
utsname.c -rw-r--r-- 3.6 KB
utsname_sysctl.c -rw-r--r-- 3.0 KB
watchdog.c -rw-r--r-- 29.6 KB
workqueue.c -rw-r--r-- 152.4 KB
workqueue_internal.h -rw-r--r-- 2.2 KB

back to top