1
0
Fork 0
remarkable-linux/drivers/clocksource
Roman Volkov 27853751e2 clocksource/drivers/vt8500: Increase the minimum delta
[ Upstream commit f9eccf2461 ]

The vt8500 clocksource driver declares itself as capable to handle the
minimum delay of 4 cycles by passing the value into
clockevents_config_and_register(). The vt8500_timer_set_next_event()
requires the passed cycles value to be at least 16. The impact is that
userspace hangs in nanosleep() calls with small delay intervals.

This problem is reproducible in Linux 4.2 starting from:
c6eb3f70d4 ('hrtimer: Get rid of hrtimer softirq')

From Russell King, more detailed explanation:

"It's a speciality of the StrongARM/PXA hardware. It takes a certain
number of OSCR cycles for the value written to hit the compare registers.
So, if a very small delta is written (eg, the compare register is written
with a value of OSCR + 1), the OSCR will have incremented past this value
before it hits the underlying hardware. The result is, that you end up
waiting a very long time for the OSCR to wrap before the event fires.

So, we introduce a check in set_next_event() to detect this and return
-ETIME if the calculated delta is too small, which causes the generic
clockevents code to retry after adding the min_delta specified in
clockevents_config_and_register() to the current time value.

min_delta must be sufficient that we don't re-trip the -ETIME check - if
we do, we will return -ETIME, forward the next event time, try to set it,
return -ETIME again, and basically lock the system up. So, min_delta
must be larger than the check inside set_next_event(). A factor of two
was chosen to ensure that this situation would never occur.

The PXA code worked on PXA systems for years, and I'd suggest no one
changes this mechanism without access to a wide range of PXA systems,
otherwise they're risking breakage."

Cc: stable@vger.kernel.org
Cc: Russell King <linux@arm.linux.org.uk>
Acked-by: Alexey Charkov <alchark@gmail.com>
Signed-off-by: Roman Volkov <rvolkov@v1ros.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
2016-02-03 14:01:46 -05:00
..
Kconfig ARM: SoC driver updates for v4.1 2015-04-22 09:18:17 -07:00
Makefile ARM: at91: time: move the system timer driver to drivers/clocksource 2015-03-16 17:03:05 +01:00
acpi_pm.c treewide: Fix printks with 0x%# 2013-08-27 10:49:38 +02:00
arm_arch_timer.c Initial ACPI support for arm64: 2015-04-24 08:23:45 -07:00
arm_global_timer.c ARM: make it easier to check the CPU part number correctly 2014-07-18 12:29:02 +01:00
asm9260_timer.c ARM: clocksource: Add asm9260_timer driver 2015-01-29 14:02:06 +01:00
bcm2835_timer.c clocksource: bcm2835: Switch to sched_clock_register() 2013-07-30 11:24:51 -07:00
bcm_kona_timer.c clocksource: kona: fix __iomem annotation 2015-01-05 14:43:36 +01:00
cadence_ttc_timer.c clocksource: cadence_ttc: Add support for 32bit mode 2014-09-29 01:59:09 +02:00
clksrc-dbx500-prcmu.c clocksource: dbx500-prcmu: Switch to sched_clock_register() 2013-07-30 11:24:52 -07:00
clksrc-of.c of: consolidate linker section OF match table declarations 2014-05-20 14:25:24 -05:00
clps711x-timer.c clocksource: clps711x: Add CLPS711X clocksource driver 2014-07-23 12:02:35 +02:00
cs5535-clockevt.c clocksource: misc drivers: Remove deprecated IRQF_DISABLED 2013-12-11 11:40:27 +01:00
dummy_timer.c time: Replace __get_cpu_var uses 2014-08-26 13:45:44 -04:00
dw_apb_timer.c drivers: fix up obsolete cpu function usage. 2015-03-05 13:37:02 +10:30
dw_apb_timer_of.c clocksource/drivers/dw_apb_timers_of: Fix IO endianness causing time jumps 2015-03-31 09:15:57 +02:00
em_sti.c clocksource: Rename __clocksource_updatefreq_*() to __clocksource_update_freq_*() 2015-03-13 08:07:08 +01:00
exynos_mct.c clocksource: exynos_mct: Avoid blocking calls in the cpu hotplug notifier 2015-08-03 09:29:16 -07:00
fsl_ftm_timer.c clocksource: Add Freescale FlexTimer Module (FTM) timer support 2014-05-23 10:12:04 +02:00
i8253.c time: Kill xtime_lock, replacing it with jiffies_lock 2012-11-13 14:08:23 -05:00
meson6_timer.c ARM: meson6: clocksource: Add Meson6 timer support 2014-09-29 01:50:05 +02:00
metag_generic.c drivers/clocksource: Replace __get_cpu_var used for address calculation 2014-08-26 13:45:46 -04:00
mips-gic-timer.c CLOCKSOURCE: mips-gic: Allow GIC clock to be specified in device-tree 2015-04-01 17:22:11 +02:00
mmio.c clocksource: Fix clocksource_mmio_readX_down 2014-05-23 09:19:40 +02:00
moxart_timer.c ARM: clocksource: moxart: Add bitops.h include 2013-08-01 01:13:34 +02:00
mtk_timer.c clocksource: mtk: Fix race conditions in probe code 2015-02-25 10:28:49 +01:00
mxs_timer.c clocksource: mxs_timer: Switch to sched_clock_register() 2013-07-30 11:24:52 -07:00
nomadik-mtu.c ARM: SoC DT updates for 3.14 2014-01-23 18:45:38 -08:00
pxa_timer.c clocksource: pxa: Fix section mismatch 2015-02-25 10:28:55 +01:00
qcom-timer.c clocksource: Replace __this_cpu_ptr with raw_cpu_ptr 2014-08-26 13:45:56 -04:00
rockchip_timer.c clockevents: rockchip: Add rockchip timer for rk3288 2015-01-29 14:02:13 +01:00
samsung_pwm_timer.c clocksource: misc drivers: Remove deprecated IRQF_DISABLED 2013-12-11 11:40:27 +01:00
scx200_hrt.c clocksource: scx200_hrt: Fix the build 2012-02-22 13:25:16 +01:00
sh_cmt.c clocksource: Rename __clocksource_updatefreq_*() to __clocksource_update_freq_*() 2015-03-13 08:07:08 +01:00
sh_mtu2.c clocksource: sh_mtu2: Add DT support 2014-07-04 15:50:29 +02:00
sh_tmu.c clocksource: Rename __clocksource_updatefreq_*() to __clocksource_update_freq_*() 2015-03-13 08:07:08 +01:00
sun4i_timer.c clocksource/drivers/sun4i-timer: Only register a sched_clock on sun4i and sun5i 2015-03-31 09:15:58 +02:00
tcb_clksrc.c clocksource: tcb_clksrc: Sanitize IRQ request 2014-09-29 01:50:05 +02:00
tegra20_timer.c ARM, clocksource/drivers: Provide read_boot_clock64() and read_persistent_clock64() and use them 2015-04-03 08:18:23 +02:00
time-armada-370-xp.c Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2014-12-10 08:18:32 -08:00
time-efm32.c clocksource/drivers/efm32: Use CLOCK_EVT_FEAT_PERIODIC for defining features 2015-03-31 09:15:57 +02:00
time-orion.c clocksource: orion: Use atomic access for shared registers 2014-03-11 23:05:02 +01:00
timer-atlas7.c clocksource: marco: Rename marco to atlas7 2015-01-29 14:02:06 +01:00
timer-atmel-pit.c clocksource/drivers/at91: Fix IO endianness 2015-03-31 09:15:58 +02:00
timer-atmel-st.c clocksource: atmel-st: remove mach/hardware dependency 2015-03-16 17:03:07 +01:00
timer-digicolor.c clocksource: Driver for Conexant Digicolor SoC timer 2015-01-29 14:02:15 +01:00
timer-integrator-ap.c ARM: integrator: move AP timer to clocksource 2014-10-28 15:42:34 +01:00
timer-keystone.c clocksource: timer-keystone: Delete unnecessary variable 2014-03-11 23:05:00 +01:00
timer-prima2.c clocksource: sirf: Fix incorrect clock enable counter for timer 2014-07-23 12:02:34 +02:00
timer-sun5i.c clocksource/drivers/sun5i: Add clock notifiers 2015-03-31 17:53:58 +02:00
timer-u300.c Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2014-04-05 13:20:43 -07:00
versatile.c clocksource: versatile: Adapt for Versatile AB and PB boards 2015-01-29 14:02:16 +01:00
vf_pit_timer.c clocksource: vf_pit_timer: Support shutdown mode 2014-09-29 01:50:05 +02:00
vt8500_timer.c clocksource/drivers/vt8500: Increase the minimum delta 2016-02-03 14:01:46 -05:00
zevio-timer.c clocksource: nspire: Fix compiler warning 2014-04-29 15:06:43 +02:00