alistair23-linux/drivers/clocksource
Jisheng Zhang 8b5f0010fe clockevents/drivers/dw_apb_timer: Add dynamic irq flag to the timer
Commit d2348fb6fd ("tick: Dynamically set broadcast irq affinity")
adds one excellent feature CLOCK_EVT_FEAT_DYNIRQ to let the core set the
interrupt affinity of the broadcast interrupt to the cpu which has the
earliest expiry time. This patch adds CLOCK_EVT_FEAT_DYNIRQ flag to
avoid unnecessary wakeups and IPIs when the dw_apb_timer is used as
broadcast timer.

A simple test:
~ # rm /tmp/test.sh
~ # cat > /tmp/test.sh
cat /proc/interrupts
for i in `seq 10` ; do sleep $i; done
cat /proc/interrupts
~ # chmod +x /tmp/test.sh
~ # taskset 0x2 /tmp/test.sh

without the patch:

           CPU0       CPU1
 27:        115         36       GIC  27  arch_timer
 45:         62          0       GIC  45  mmc0
160:         88          0  interrupt-controller   8  timer
227:          0          0  interrupt-controller   4  f7e81400.i2c
228:          0          0  interrupt-controller   5  f7e81800.i2c
229:          0          0  interrupt-controller   7  dw_spi65535
230:          0          0  interrupt-controller  21  f7e84000.i2c
231:          0          0  interrupt-controller  20  f7e84800.i2c
265:        445          0  interrupt-controller   8  serial
IPI0:          0          0  CPU wakeup interrupts
IPI1:          0         11  Timer broadcast interrupts
IPI2:         56        104  Rescheduling interrupts
IPI3:          0          0  Function call interrupts
IPI4:          0          4  Single function call interrupts
IPI5:          0          0  CPU stop interrupts
IPI6:         25         27  IRQ work interrupts
IPI7:          0          0  completion interrupts
IPI8:          0          0  CPU backtrace
Err:          0
           CPU0       CPU1
 27:        115         38       GIC  27  arch_timer
 45:         62          0       GIC  45  mmc0
160:        160          0  interrupt-controller   8  timer
227:          0          0  interrupt-controller   4  f7e81400.i2c
228:          0          0  interrupt-controller   5  f7e81800.i2c
229:          0          0  interrupt-controller   7  dw_spi65535
230:          0          0  interrupt-controller  21  f7e84000.i2c
231:          0          0  interrupt-controller  20  f7e84800.i2c
265:        514          0  interrupt-controller   8  serial
IPI0:          0          0  CPU wakeup interrupts
IPI1:          0         83  Timer broadcast interrupts
IPI2:         56        104  Rescheduling interrupts
IPI3:          0          0  Function call interrupts
IPI4:          0          4  Single function call interrupts
IPI5:          0          0  CPU stop interrupts
IPI6:         25         46  IRQ work interrupts
IPI7:          0          0  completion interrupts
IPI8:          0          0  CPU backtrace
Err:          0

cpu0 get 160-88=72 timer interrupts, CPU1 got 83-11=72 broadcast timer
IPIs
So, overall system got 72+72=144 wake ups and 72 broadcast timer IPIs

With the patch:
           CPU0       CPU1
 27:        107         37       GIC  27  arch_timer
 45:         62          0       GIC  45  mmc0
160:         66          7  interrupt-controller   8  timer
227:          0          0  interrupt-controller   4  f7e81400.i2c
228:          0          0  interrupt-controller   5  f7e81800.i2c
229:          0          0  interrupt-controller   7  dw_spi65535
230:          0          0  interrupt-controller  21  f7e84000.i2c
231:          0          0  interrupt-controller  20  f7e84800.i2c
265:        311          0  interrupt-controller   8  serial
IPI0:          0          0  CPU wakeup interrupts
IPI1:          2          4  Timer broadcast interrupts
IPI2:         58        100  Rescheduling interrupts
IPI3:          0          0  Function call interrupts
IPI4:          0          4  Single function call interrupts
IPI5:          0          0  CPU stop interrupts
IPI6:         21         24  IRQ work interrupts
IPI7:          0          0  completion interrupts
IPI8:          0          0  CPU backtrace
Err:          0
           CPU0       CPU1
 27:        107         39       GIC  27  arch_timer
 45:         62          0       GIC  45  mmc0
160:         69         75  interrupt-controller   8  timer
227:          0          0  interrupt-controller   4  f7e81400.i2c
228:          0          0  interrupt-controller   5  f7e81800.i2c
229:          0          0  interrupt-controller   7  dw_spi65535
230:          0          0  interrupt-controller  21  f7e84000.i2c
231:          0          0  interrupt-controller  20  f7e84800.i2c
265:        380          0  interrupt-controller   8  serial
IPI0:          0          0  CPU wakeup interrupts
IPI1:          3          6  Timer broadcast interrupts
IPI2:         60        100  Rescheduling interrupts
IPI3:          0          0  Function call interrupts
IPI4:          0          4  Single function call interrupts
IPI5:          0          0  CPU stop interrupts
IPI6:         21         45  IRQ work interrupts
IPI7:          0          0  completion interrupts
IPI8:          0          0  CPU backtrace
Err:          0

cpu0 got 69-66=3, cpu1 got 75-7=68 timer interrupts. cpu0 got 3-2=1
broadcast timer IPIs, cpu1 got 6-4=2 broadcast timer IPIs.
So, overall system got 3+68+1+2=74 wakeups and 1+2=3 broadcast timer
IPIs

This patch removes 50% wakeups and almost 100% broadcast timer IPIs!

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
2015-08-10 11:40:53 +02:00
..
acpi_pm.c
arm_arch_timer.c clockevents/drivers/arm_arch_timer: Migrate to new 'set-state' interface 2015-08-06 12:16:41 +02:00
arm_global_timer.c clockevents/drivers/arm_global_timer: Migrate to new 'set-state' interface 2015-08-06 12:16:41 +02:00
armv7m_systick.c clocksource/drivers/armv7m_systick: Add ARM System timer driver 2015-06-02 12:10:14 +02:00
asm9260_timer.c clockevents/drivers/asm9260: Migrate to new 'set-state' interface 2015-08-10 11:40:25 +02:00
bcm2835_timer.c clockevents/drivers/bcm2835: Migrate to new 'set-state' interface 2015-08-06 12:16:41 +02:00
bcm_kona_timer.c clockevents/drivers/bcm_kona: Migrate to new 'set-state' interface 2015-08-06 12:16:42 +02:00
cadence_ttc_timer.c clockevents/drivers/cadence_ttc: Migrate to new 'set-state' interface 2015-08-10 11:40:26 +02:00
clksrc-dbx500-prcmu.c
clksrc-of.c
clps711x-timer.c clockevents/drivers/clps711x: Migrate to new 'set-state' interface 2015-08-10 11:40:27 +02:00
cs5535-clockevt.c clockevents/drivers/cs5535: Migrate to new 'set-state' interface 2015-08-06 12:16:42 +02:00
dummy_timer.c clockevents/drivers/dummy_timer: Migrate to new 'set-state' interface 2015-08-10 11:40:28 +02:00
dw_apb_timer.c clockevents/drivers/dw_apb_timer: Add dynamic irq flag to the timer 2015-08-10 11:40:53 +02:00
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 clockevents/drivers/em_sti: Migrate to new 'set-state' interface 2015-08-06 12:16:42 +02:00
exynos_mct.c clockevents/drivers/exynos_mct: Migrate to new 'set-state' interface 2015-08-10 11:40:53 +02:00
fsl_ftm_timer.c clockevents/drivers/fsl_ftm: Migrate to new 'set-state' interface 2015-08-10 11:40:29 +02:00
h8300_timer8.c h8300: fix typo. 2015-06-23 13:36:00 +09:00
h8300_timer16.c h8300: clocksource 2015-06-23 13:35:55 +09:00
h8300_tpu.c h8300: clocksource 2015-06-23 13:35:55 +09:00
i8253.c clockevents/drivers/i8253: Migrate to new 'set-state' interface 2015-08-10 11:40:30 +02:00
Kconfig clockevents/drivers/Kconfig: Replace USE_OF with OF 2015-08-10 11:40:15 +02:00
Makefile Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2015-06-26 12:20:00 -07:00
meson6_timer.c clockevents/drivers/meson6: Migrate to new 'set-state' interface 2015-08-10 11:40:30 +02:00
metag_generic.c clockevents/drivers/metag_generic: Migrate to new 'set-state' interface 2015-08-10 11:40:31 +02:00
mips-gic-timer.c clockevents/drivers/mips-gic: Migrate to new 'set-state' interface 2015-08-10 11:40:32 +02:00
mmio.c
moxart_timer.c clockevents/drivers/moxart: Migrate to new 'set-state' interface 2015-08-10 11:40:32 +02:00
mtk_timer.c clockevents/drivers/mtk: Migrate to new 'set-state' interface 2015-08-10 11:40:33 +02:00
mxs_timer.c clockevents/drivers/mxs: Migrate to new 'set-state' interface 2015-08-10 11:40:34 +02:00
nomadik-mtu.c clockevents/drivers/nomadik-mtu: Migrate to new 'set-state' interface 2015-08-10 11:40:34 +02:00
pxa_timer.c clockevents/drivers/pxa: Migrate to new 'set-state' interface 2015-08-10 11:40:35 +02:00
qcom-timer.c clockevents/drivers/qcom: Migrate to new 'set-state' interface 2015-08-10 11:40:36 +02:00
rockchip_timer.c clockevents/drivers/rockchip: Migrate to new 'set-state' interface 2015-08-10 11:40:36 +02:00
samsung_pwm_timer.c clockevents/drivers/samsung_pwm: Migrate to new 'set-state' interface 2015-08-10 11:40:37 +02:00
scx200_hrt.c
sh_cmt.c clockevents/drivers/sh_cmt: Migrate to new 'set-state' interface 2015-08-10 11:40:38 +02:00
sh_mtu2.c clockevents/drivers/sh_mtu2: Migrate to new 'set-state' interface 2015-08-10 11:40:38 +02:00
sh_tmu.c clockevents/drivers/sh_tmu: Migrate to new 'set-state' interface 2015-08-10 11:40:39 +02:00
sun4i_timer.c clockevents/drivers/sun4i: Migrate to new 'set-state' interface 2015-08-10 11:40:40 +02:00
tcb_clksrc.c clockevents/drivers/tcb_clksrc: Migrate to new 'set-state' interface 2015-08-10 11:40:52 +02:00
tegra20_timer.c clockevents/drivers/tegra20: Migrate to new 'set-state' interface 2015-08-10 11:40:40 +02:00
time-armada-370-xp.c clockevents/drivers/time-armada-370-xp: Migrate to new 'set-state' interface 2015-08-10 11:40:41 +02:00
time-efm32.c clockevents/drivers/efm32: Migrate to new 'set-state' interface 2015-08-10 11:40:42 +02:00
time-lpc32xx.c clocksource/drivers/lpc32xx: Add the lpc32xx timer driver 2015-06-02 12:10:10 +02:00
time-orion.c clockevents/drivers/orion: Migrate to new 'set-state' interface 2015-08-10 11:40:42 +02:00
timer-atlas7.c clockevents/drivers/atlas7: Migrate to new 'set-state' interface 2015-08-10 11:40:43 +02:00
timer-atmel-pit.c clockevents/drivers/atmel: Migrate to new 'set-state' interface 2015-08-10 11:40:44 +02:00
timer-atmel-st.c clockevents/drivers/atmel-st: Migrate to new 'set-state' interface 2015-08-10 11:40:44 +02:00
timer-digicolor.c clockevents/drivers/digicolor: Migrate to new 'set-state' interface 2015-08-10 11:40:45 +02:00
timer-imx-gpt.c clocksource/imx: Define clocksource for mx27 2015-07-07 10:44:45 +02:00
timer-integrator-ap.c clockevents/drivers/integrator: Migrate to new 'set-state' interface 2015-08-10 11:40:46 +02:00
timer-keystone.c clockevents/drivers/keystone: Migrate to new 'set-state' interface 2015-08-10 11:40:47 +02:00
timer-prima2.c clockevents/drivers/prima2: Migrate to new 'set-state' interface 2015-08-10 11:40:47 +02:00
timer-sp.h ARM: 8366/1: move Dual-Timer SP804 driver to drivers/clocksource 2015-06-02 09:58:18 +01:00
timer-sp804.c ARM: 8366/1: move Dual-Timer SP804 driver to drivers/clocksource 2015-06-02 09:58:18 +01:00
timer-stm32.c clockevents/drivers/stm32: Migrate to new 'set-state' interface 2015-08-10 11:40:48 +02:00
timer-sun5i.c clockevents/drivers/sun5i: Migrate to new 'set-state' interface 2015-08-10 11:40:49 +02:00
timer-u300.c clockevents/drivers/u300: Migrate to new 'set-state' interface 2015-08-10 11:40:49 +02:00
versatile.c clocksource: versatile: Adapt for Versatile AB and PB boards 2015-01-29 14:02:16 +01:00
vf_pit_timer.c clockevents/drivers/vf_pit: Migrate to new 'set-state' interface 2015-08-10 11:40:50 +02:00
vt8500_timer.c clockevents/drivers/vt8500: Migrate to new 'set-state' interface 2015-08-10 11:40:51 +02:00
zevio-timer.c clockevents/drivers/zevio: Migrate to new 'set-state' interface 2015-08-10 11:40:51 +02:00