linux/arch/arm/kernel
Stephen Boyd 7f45ce8f41 ARM: sched_clock: Load cycle count after epoch stabilizes
commit 336ae1180d upstream.

There is a small race between when the cycle count is read from
the hardware and when the epoch stabilizes. Consider this
scenario:

 CPU0                           CPU1
 ----                           ----
 cyc = read_sched_clock()
 cyc_to_sched_clock()
                                 update_sched_clock()
                                  ...
                                  cd.epoch_cyc = cyc;
  epoch_cyc = cd.epoch_cyc;
  ...
  epoch_ns + cyc_to_ns((cyc - epoch_cyc)

The cyc on cpu0 was read before the epoch changed. But we
calculate the nanoseconds based on the new epoch by subtracting
the new epoch from the old cycle count. Since epoch is most likely
larger than the old cycle count we calculate a large number that
will be converted to nanoseconds and added to epoch_ns, causing
time to jump forward too much.

Fix this problem by reading the hardware after the epoch has
stabilized.

Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-12-16 09:09:43 -08:00
..
.gitignore
arch_timer.c ARM: convert arm/arm64 arch timer to use CLKSRC_OF init 2013-04-11 15:11:15 -05:00
armksyms.c Merge branches 'audit', 'delay', 'fixes', 'misc' and 'sta2x11' into for-linus 2012-07-27 23:06:32 +01:00
arthur.c
asm-offsets.c Merge tag 'kvm-3.10-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm 2013-05-05 14:47:31 -07:00
atags_compat.c ARM: 7505/1: split out ATAGS parsing 2012-09-03 22:55:56 +01:00
atags_parse.c ARM: 7505/1: split out ATAGS parsing 2012-09-03 22:55:56 +01:00
atags_proc.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
atags.h ARM: 7506/1: allow for ATAGS to be configured out when DT support is selected 2012-09-03 22:56:15 +01:00
bios32.c ARM: 7683/1: pci: add a align_resource hook 2013-04-03 16:56:11 +01:00
calls.S ARM: 7665/1: Wire up kcmp syscall 2013-03-03 22:54:18 +00:00
cpuidle.c
crash_dump.c ARM: 8012/1: kdump: Avoid overflow when converting pfn to physaddr 2014-06-07 13:25:34 -07:00
debug.S ARM: compile fix for DEBUG_LL=y && MMU=n 2013-01-16 14:30:06 -08:00
devtree.c ARM: dt: Only print warning, not WARN() on bad cpu map in device tree 2013-06-29 17:00:40 -07:00
dma-isa.c
dma.c
early_printk.c early_printk: consolidate random copies of identical code 2013-04-29 18:28:13 -07:00
elf.c Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
entry-armv.S ARM: 7876/1: clear Thumb-2 IT state on exception handling 2013-12-04 10:55:46 -08:00
entry-common.S ARM: 7748/1: oabi: handle faults when loading swi instruction from userspace 2014-10-05 14:54:15 -07:00
entry-header.S Merge branches 'devel-stable', 'entry', 'fixes', 'mach-types', 'misc' and 'smp-hotplug' into for-linus 2013-05-02 21:30:36 +01:00
etm.c ARM/etm/sysrq: fix inconstistent help message of sysrq key 2013-04-30 17:04:10 -07:00
fiq.c ARM: update FIQ support for relocation of vectors 2013-08-11 18:35:20 -07:00
fiqasm.S
ftrace.c ARM: 7468/1: ftrace: Trace function entry before updating index 2012-07-31 10:30:42 +01:00
head-common.S ARM: make cr_alignment read-only #ifndef CONFIG_CPU_CP15 2013-01-31 21:44:45 +01:00
head-nommu.S ARM: let CPUs not being able to run in ARM mode enter in THUMB mode 2013-01-31 21:44:46 +01:00
head.S ARM: 7690/1: mm: fix CONFIG_LPAE typos 2013-04-03 16:45:51 +01:00
hw_breakpoint.c ARM: 7697/1: hw_breakpoint: do not use __cpuinitdata for dbg_cpu_pm_nb 2013-04-17 16:54:06 +01:00
hyp-stub.S ARM: hyp: initialize CNTVOFF to zero 2014-01-09 12:24:26 -08:00
insn.c ARM: fix missing bug.h include in arch/arm/kernel/insn.c 2012-03-30 11:51:46 +01:00
insn.h ARM: 7334/1: add jump label support 2012-03-24 09:38:56 +00:00
io.c
irq.c ARM: 8133/1: use irq_set_affinity with force=false when migrating irqs 2014-10-05 14:54:10 -07:00
isa.c
iwmmxt.S
jump_label.c ARM: 7334/1: add jump label support 2012-03-24 09:38:56 +00:00
kgdb.c
kprobes-arm.c
kprobes-common.c ARM: probes: fix instruction fetch order with <asm/opcodes.h> 2014-11-21 09:22:54 -08:00
kprobes-test-arm.c ARM: kprobes: make more tests conditional 2012-10-09 17:07:43 +02:00
kprobes-test-thumb.c
kprobes-test.c treewide: fix printk typo in multiple drivers 2012-11-19 11:08:17 +01:00
kprobes-test.h
kprobes-thumb.c ARM: probes: fix instruction fetch order with <asm/opcodes.h> 2014-11-21 09:22:54 -08:00
kprobes.c ARM: probes: fix instruction fetch order with <asm/opcodes.h> 2014-11-21 09:22:54 -08:00
kprobes.h
machine_kexec.c ARM: 7897/1: kexec: Use the right ISA for relocate_new_kernel 2014-10-05 14:54:10 -07:00
Makefile ARM: psci: add support for PSCI invocations from the kernel 2013-01-10 21:10:20 +00:00
module.c
opcodes.c
patch.c ARM: 7332/1: extract out code patch function from kprobes 2012-03-24 09:38:55 +00:00
patch.h ARM: 7332/1: extract out code patch function from kprobes 2012-03-24 09:38:55 +00:00
perf_event_cpu.c ARM: perf: handle armpmu_register failing 2013-01-18 13:46:09 +00:00
perf_event_v6.c ARM: perf: don't pretend to support counting of L1I writes 2013-01-16 12:01:59 +00:00
perf_event_v7.c ARM: 7663/1: perf: fix ARMv7 EVTYPE_MASK to include NSH bit 2013-03-03 22:54:17 +00:00
perf_event_xscale.c ARM: perf: don't pretend to support counting of L1I writes 2013-01-16 12:01:59 +00:00
perf_event.c ARM: perf: hook up perf_sample_event_took around pmu irq handling 2014-06-11 12:03:27 -07:00
pj4-cp0.c
process.c ARM: 7912/1: check stack pointer in get_wchan 2013-12-20 07:45:07 -08:00
psci.c ARM: psci: add support for PSCI invocations from the kernel 2013-01-10 21:10:20 +00:00
ptrace.c ARM: 7595/1: syscall: rework ordering in syscall_trace_exit 2012-12-11 00:18:26 +00:00
relocate_kernel.S ARM: 7897/1: kexec: Use the right ISA for relocate_new_kernel 2014-10-05 14:54:10 -07:00
return_address.c ARM: 7676/1: fix a wrong value returned from CALLER_ADDRn 2013-03-19 11:43:46 +00:00
sched_clock.c ARM: sched_clock: Load cycle count after epoch stabilizes 2014-12-16 09:09:43 -08:00
setup.c ARM: ignore memory below PHYS_OFFSET 2014-03-23 21:38:21 -07:00
signal.c ARM: fix nommu builds with 48be69a02 (ARM: move signal handlers into a vdso-like page) 2013-08-11 18:35:20 -07:00
sleep.S Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
smp_scu.c Merge branch 'for-next' of git://git.pengutronix.de/git/ukl/linux into devel-stable 2013-03-09 15:49:32 +00:00
smp_tlb.c ARM: 7769/1: Cortex-A15: fix erratum 798181 implementation 2013-07-21 18:21:34 -07:00
smp_twd.c ARM: 7778/1: smp_twd: twd_update_frequency need be run on all online CPUs 2013-07-21 18:21:34 -07:00
smp.c ARM: 7759/1: decouple CPU offlining from reboot/shutdown 2013-06-17 21:35:25 +01:00
stacktrace.c ARM: stacktrace: avoid listing stacktrace functions in stacktrace 2014-06-30 20:09:44 -07:00
suspend.c ARM: 7661/1: mm: perform explicit branch predictor maintenance when required 2013-03-03 22:54:16 +00:00
swp_emulate.c arm: single_open() leaks 2013-05-05 00:07:22 -04:00
sys_arm.c arm: switch to generic fork/vfork/clone 2012-11-28 22:13:54 -05:00
sys_oabi-compat.c userns: Convert stat to return values mapped from kuids and kgids 2012-05-15 14:08:35 -07:00
tcm.c ARM: 7694/1: ARM, TCM: initialize TCM in paging_init(), instead of setup_arch() 2013-04-17 16:53:24 +01:00
thumbee.c ARM: 7385/1: ThumbEE: Use cpuid macros to read ID_PFR0 for ThumbEE 2012-04-25 19:49:26 +01:00
time.c ARM: make machine_desc->init_time default to clocksource_of_init 2013-04-11 15:11:14 -05:00
topology.c ARM: 7742/1: topology: export cpu_topology 2013-06-05 23:32:26 +01:00
traps.c ARM: Correct BUG() assembly to ensure it is endian-agnostic 2014-11-21 09:22:55 -08:00
unwind.c
vmlinux.lds.S ARM: use linker magic for vectors and vector stubs 2013-08-11 18:35:20 -07:00
xscale-cp0.c