timer changes for v3.14
Subsystems (13)
Ingo Molnar
maintainerLinus,
Please pull the latest timers-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-core-for-linus
# HEAD: 00e2bcd6d35f59fce7fa0e76e24d08f74c6a8506 clocksource: Timer-sun5i: Switch to sched_clock_register()
The main changes are:
- ARM clocksource/clockevent improvements and fixes.
- Generic timekeeping updates: TAI fixes/improvements, cleanups.
- Posix cpu timer cleanups and improvements.
- Dynticks updates: full dynticks bugfixes, optimizations and cleanups.
Thanks,
Ingo
------------------>
Axel Lin (1):
clocksource: bcm_kona_timer: Remove unused bcm_timer_ids
Borislav Petkov (1):
rtc-cmos: Add an alarm disable quirk
Ezequiel Garcia (1):
clocksource: armada-370-xp: Enable timer divider only when needed
Frederic Weisbecker (15):
nohz: Convert a few places to use local per cpu accesses
context_tracking: Wrap static key check into more intuitive function name
context_tracking: Rename context_tracking_active() to context_tracking_cpu_is_enabled()
posix-timers: Spare workqueue if there is no full dynticks CPU to kick
posix-timers: Fix full dynticks CPUs kick on timer rescheduling
posix-timers: Remove dead thread posix cpu timers caching
posix-timers: Remove dead process posix cpu timers caching
posix-timers: Cleanup reaped target handling
posix-timers: Remove dead task special case
posix-timers: Remove useless clock sample on timers cleanup
posix-timers: Consolidate posix_cpu_clock_get()
posix-timers: Use sighand lock instead of tasklist_lock for task clock sample
posix-timers: Use sighand lock instead of tasklist_lock on timer deletion
posix-timers: Remove remaining uses of tasklist_lock
posix-timers: Convert abuses of BUG_ON to WARN_ON
Jingoo Han (2):
clocksource: sh_tmu: Remove unnecessary platform_set_drvdata()
clocksource: sh_mtu2: Remove unnecessary platform_set_drvdata()
John Stultz (7):
timekeeping: Fix lost updates to tai adjustment
timekeeping: Fix potential lost pv notification of time change
timekeeping: Avoid possible deadlock from clock_was_set_delayed tick/timekeeping: Call update_wall_time outside the jiffies lock
timekeeping: Fix CLOCK_TAI timer/nanosleep delays
timekeeping: Fix missing timekeeping_update in suspend path
timekeeping: Remove comment that's mostly out of date
Laurent Pinchart (1):
clocksource: sh_cmt: Add clk_prepare/unprepare support
Linus Walleij (1):
clocksource: clksrc-of: Warn if no clock sources are found
Maxime Ripard (7):
clockevent: sun4i: Fill the irq field in the clockevent structure
clocksource: sun4i: Change CPU mask to cpu_possible_mask
clocksource: sun4i: Increase a bit the clock event and sources rating
clocksource: Add Allwinner SoCs HS timers driver
ARM: sun5i: a10s: Add support for the High Speed Timers
ARM: sun5i: a13: Add support for the High Speed Timers
ARM: sun7i: a20: Add support for the High Speed Timers
Michael Opdenacker (3):
clocksource: misc drivers: Remove deprecated IRQF_DISABLED
clocksource: tegra: Remove deprecated IRQF_DISABLED
clocksource: vt8500: Remove deprecated IRQF_DISABLED
Paul Gortmaker (1):
trivial: fix spelling in CONTEXT_TRACKING_FORCE help text
Stephen Boyd (5):
clocksource: arm_global_timer: Switch to sched_clock_register()
clocksource: cadence_ttc_timer: Switch to sched_clock_register()
clocksource: sun4i: Switch to sched_clock_register()
clocksource: orion: Switch to sched_clock_register()
clocksource: Timer-sun5i: Switch to sched_clock_register()
Yijing Wang (1):
timekeeper: fix comment typo for tk_setup_internals()
.../bindings/timer/allwinner,sun5i-a13-hstimer.txt | 22 ++ arch/arm/boot/dts/sun5i-a10s.dtsi | 7 + arch/arm/boot/dts/sun5i-a13.dtsi | 7 + arch/arm/boot/dts/sun7i-a20.dtsi | 10 + arch/arm/mach-sunxi/Kconfig | 1 + drivers/clocksource/Kconfig | 4 + drivers/clocksource/Makefile | 1 + drivers/clocksource/arm_global_timer.c | 4 +- drivers/clocksource/bcm_kona_timer.c | 6 - drivers/clocksource/cadence_ttc_timer.c | 7 +- drivers/clocksource/clksrc-of.c | 4 + drivers/clocksource/cs5535-clockevt.c | 2 +- drivers/clocksource/dw_apb_timer.c | 3 +- drivers/clocksource/nomadik-mtu.c | 2 +- drivers/clocksource/samsung_pwm_timer.c | 2 +- drivers/clocksource/sh_cmt.c | 23 +- drivers/clocksource/sh_mtu2.c | 4 +- drivers/clocksource/sh_tmu.c | 4 +- drivers/clocksource/sun4i_timer.c | 11 +- drivers/clocksource/tegra20_timer.c | 2 +- drivers/clocksource/time-armada-370-xp.c | 18 +- drivers/clocksource/time-orion.c | 4 +- drivers/clocksource/timer-sun5i.c | 192 ++++++++++++ drivers/clocksource/vt8500_timer.c | 2 +- drivers/rtc/rtc-cmos.c | 52 +++- include/linux/context_tracking.h | 10 +- include/linux/context_tracking_state.h | 11 +- include/linux/tick.h | 8 +- include/linux/vtime.h | 4 +- init/Kconfig | 2 +- kernel/context_tracking.c | 8 +- kernel/posix-cpu-timers.c | 327 +++++++++------------ kernel/softirq.c | 4 +- kernel/time/tick-broadcast.c | 6 +- kernel/time/tick-common.c | 1 + kernel/time/tick-internal.h | 5 +- kernel/time/tick-sched.c | 40 ++- kernel/time/timekeeping.c | 53 ++-- 38 files changed, 556 insertions(+), 317 deletions(-) create mode 100644 Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt create mode 100644 drivers/clocksource/timer-sun5i.c
Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt new file +22 -0
@@ -0,0 +1,22 @@ +Allwinner SoCs High Speed Timer Controller + +Required properties: + +- compatible : should be "allwinner,sun5i-a13-hstimer" or + "allwinner,sun7i-a20-hstimer" +- reg : Specifies base physical address and size of the registers. +- interrupts : The interrupts of these timers (2 for the sun5i IP, 4 for the sun7i + one) +- clocks: phandle to the source clock (usually the AHB clock) + +Example: + +timer@01c60000 { + compatible = "allwinner,sun7i-a20-hstimer"; + reg = <0x01c60000 0x1000>; + interrupts = <0 51 1>, + <0 52 1>, + <0 53 1>, + <0 54 1>; + clocks = <&ahb1_gates 19>; +};
arch/arm/boot/dts/sun5i-a10s.dtsi +7 -0
@@ -332,5 +332,12 @@ clock-frequency = <100000>; status = "disabled"; }; + + timer@01c60000 { + compatible = "allwinner,sun5i-a13-hstimer"; + reg = <0x01c60000 0x1000>; + interrupts = <82>, <83>; + clocks = <&ahb_gates 28>; + }; }; };
arch/arm/boot/dts/sun5i-a13.dtsi +7 -0
@@ -273,5 +273,12 @@ clock-frequency = <100000>; status = "disabled"; }; + + timer@01c60000 { + compatible = "allwinner,sun5i-a13-hstimer"; + reg = <0x01c60000 0x1000>; + interrupts = <82>, <83>; + clocks = <&ahb_gates 28>; + }; }; };
arch/arm/boot/dts/sun7i-a20.dtsi +10 -0
@@ -395,6 +395,16 @@ status = "disabled"; }; + hstimer@01c60000 { + compatible = "allwinner,sun7i-a20-hstimer"; + reg = <0x01c60000 0x1000>; + interrupts = <0 81 1>, + <0 82 1>, + <0 83 1>, + <0 84 1>; + clocks = <&ahb_gates 28>; + }; + gic: interrupt-controller@01c81000 { compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic"; reg = <0x01c81000 0x1000>,
arch/arm/mach-sunxi/Kconfig +1 -0
@@ -12,3 +12,4 @@ config ARCH_SUNXI select PINCTRL_SUNXI select SPARSE_IRQ select SUN4I_TIMER + select SUN5I_HSTIMER
drivers/clocksource/Kconfig +4 -0
@@ -37,6 +37,10 @@ config SUN4I_TIMER select CLKSRC_MMIO bool +config SUN5I_HSTIMER + select CLKSRC_MMIO + bool + config VT8500_TIMER bool
drivers/clocksource/Makefile +1 -0
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARCH_MOXART) += moxart_timer.o obj-$(CONFIG_ARCH_MXS) += mxs_timer.o obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o obj-$(CONFIG_SUN4I_TIMER) += sun4i_timer.o +obj-$(CONFIG_SUN5I_HSTIMER) += timer-sun5i.o obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o obj-$(CONFIG_ARCH_NSPIRE) += zevio-timer.o
drivers/clocksource/arm_global_timer.c +2 -2
@@ -202,7 +202,7 @@ static struct clocksource gt_clocksource = { };#ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK -static u32 notrace gt_sched_clock_read(void) +static u64 notrace gt_sched_clock_read(void) {return gt_counter_read (); }
@@ -217,7 +217,7 @@ static void __init gt_clocksource_init(void)writel (GT_CONTROL_TIMER_ENABLE , gt_base +GT_CONTROL );#ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK -setup_sched_clock (gt_sched_clock_read,32 , gt_clk_rate); +sched_clock_register (gt_sched_clock_read,64 , gt_clk_rate);#endif clocksource_register_hz (>_clocksource, gt_clk_rate); }
drivers/clocksource/bcm_kona_timer.c +0 -6
@@ -98,12 +98,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw)return ; } -static const struct of_device_id bcm_timer_ids[]__initconst = { - {.compatible ="brcm,kona-timer" }, - {.compatible ="bcm,kona-timer" },/* deprecated name */ - {}, -}; -static void __init kona_timers_init (struct device_node *node) {u32 freq;
drivers/clocksource/cadence_ttc_timer.c +3 -4
@@ -158,7 +158,7 @@ static cycle_t __ttc_clocksource_read(struct clocksource *cs) TTC_COUNT_VAL_OFFSET); } -static u32 notrace ttc_sched_clock_read(void) +static u64 notrace ttc_sched_clock_read(void) {return __raw_readl (ttc_sched_clock_val_reg); }
@@ -306,7 +306,7 @@ static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base) } ttc_sched_clock_val_reg = base +TTC_COUNT_VAL_OFFSET ; -setup_sched_clock (ttc_sched_clock_read,16 , +sched_clock_register (ttc_sched_clock_read,16 ,clk_get_rate (ttccs->ttc.clk) /PRESCALE ); }
@@ -388,8 +388,7 @@ static void __init ttc_setup_clockevent(struct clk *clk,__raw_writel (0x1 , ttcce->ttc.base_addr +TTC_IER_OFFSET ); err =request_irq (irq, ttc_clock_event_interrupt, -IRQF_DISABLED |IRQF_TIMER , - ttcce->ce.name, ttcce); +IRQF_TIMER , ttcce->ce.name, ttcce);if (WARN_ON (err)) {kfree (ttcce);return ;
drivers/clocksource/clksrc-of.c +4 -0
@@ -28,6 +28,7 @@ void __init clocksource_of_init(void)struct device_node *np;const struct of_device_id *match;clocksource_of_init_fn init_func; +unsigned clocksources =0 ;for_each_matching_node_and_match (np, __clksrc_of_table, &match) {if (!of_device_is_available (np))
@@ -35,5 +36,8 @@ void __init clocksource_of_init(void) init_func = match->data;init_func (np); + clocksources++; } +if (!clocksources) +pr_crit ("%s: no matching clocksources found\n" , __func__); }
drivers/clocksource/cs5535-clockevt.c +1 -1
@@ -131,7 +131,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)static struct irqaction mfgptirq = { .handler = mfgpt_tick, - .flags =IRQF_DISABLED |IRQF_NOBALANCING |IRQF_TIMER |IRQF_SHARED , + .flags =IRQF_NOBALANCING |IRQF_TIMER |IRQF_SHARED , .name =DRV_NAME , };
drivers/clocksource/dw_apb_timer.c +1 -2
@@ -243,8 +243,7 @@ dw_apb_clockevent_init(int cpu, const char *name, unsigned rating, dw_ced->irqaction.dev_id = &dw_ced->ced; dw_ced->irqaction.irq = irq; dw_ced->irqaction.flags =IRQF_TIMER |IRQF_IRQPOLL | -IRQF_NOBALANCING | -IRQF_DISABLED ; +IRQF_NOBALANCING ; dw_ced->eoi = apbt_eoi; err =setup_irq (irq, &dw_ced->irqaction);
drivers/clocksource/nomadik-mtu.c +1 -1
@@ -187,7 +187,7 @@ static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)static struct irqaction nmdk_timer_irq = { .name ="Nomadik Timer Tick" , - .flags =IRQF_DISABLED |IRQF_TIMER , + .flags =IRQF_TIMER , .handler = nmdk_timer_interrupt, .dev_id = &nmdk_clkevt, };
drivers/clocksource/samsung_pwm_timer.c +1 -1
@@ -264,7 +264,7 @@ static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)static struct irqaction samsung_clock_event_irq = { .name ="samsung_time_irq" , - .flags =IRQF_DISABLED |IRQF_TIMER |IRQF_IRQPOLL , + .flags =IRQF_TIMER |IRQF_IRQPOLL , .handler = samsung_clock_event_isr, .dev_id = &time_event_device, };
drivers/clocksource/sh_cmt.c +17 -6
@@ -634,12 +634,18 @@ static int sh_cmt_clock_event_next(unsigned long delta,static void sh_cmt_clock_event_suspend (struct clock_event_device *ced) { -pm_genpd_syscore_poweroff (&ced_to_sh_cmt (ced)->pdev->dev); +struct sh_cmt_priv *p =ced_to_sh_cmt (ced); + +pm_genpd_syscore_poweroff (&p->pdev->dev); +clk_unprepare (p->clk); }static void sh_cmt_clock_event_resume (struct clock_event_device *ced) { -pm_genpd_syscore_poweron (&ced_to_sh_cmt (ced)->pdev->dev); +struct sh_cmt_priv *p =ced_to_sh_cmt (ced); + +clk_prepare (p->clk); +pm_genpd_syscore_poweron (&p->pdev->dev); } static void sh_cmt_register_clockevent(struct sh_cmt_priv *p,
@@ -726,8 +732,7 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev) p->irqaction.name =dev_name (&p->pdev->dev); p->irqaction.handler = sh_cmt_interrupt; p->irqaction.dev_id = p; - p->irqaction.flags =IRQF_DISABLED |IRQF_TIMER | \ -IRQF_IRQPOLL |IRQF_NOBALANCING ; + p->irqaction.flags =IRQF_TIMER |IRQF_IRQPOLL |IRQF_NOBALANCING ;/* get hold of clock */ p->clk =clk_get (&p->pdev->dev,"cmt_fck" );
@@ -737,6 +742,10 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev) goto err2; } + ret =clk_prepare (p->clk); +if (ret <0 ) + goto err3; +if (res2 && (resource_size (res2) ==4 )) {/* assume both CMSTR and CMCSR to be 32-bit */ p->read_control = sh_cmt_read32;
@@ -773,19 +782,21 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev) cfg->clocksource_rating);if (ret) {dev_err (&p->pdev->dev,"registration failed\n" ); - goto err3; + goto err4; } p->cs_enabled = false; ret =setup_irq (irq, &p->irqaction);if (ret) {dev_err (&p->pdev->dev,"failed to request irq %d\n" , irq); - goto err3; + goto err4; }platform_set_drvdata (pdev, p);return 0 ; +err4: +clk_unprepare (p->clk); err3:clk_put (p->clk); err2:
drivers/clocksource/sh_mtu2.c +1 -3
@@ -302,8 +302,7 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev) p->irqaction.handler = sh_mtu2_interrupt; p->irqaction.dev_id = p; p->irqaction.irq = irq; - p->irqaction.flags =IRQF_DISABLED |IRQF_TIMER | \ -IRQF_IRQPOLL |IRQF_NOBALANCING ; + p->irqaction.flags =IRQF_TIMER |IRQF_IRQPOLL |IRQF_NOBALANCING ;/* get hold of clock */ p->clk =clk_get (&p->pdev->dev,"mtu2_fck" );
@@ -358,7 +357,6 @@ static int sh_mtu2_probe(struct platform_device *pdev) ret =sh_mtu2_setup (p, pdev);if (ret) {kfree (p); -platform_set_drvdata (pdev,NULL );pm_runtime_idle (&pdev->dev);return ret; }
drivers/clocksource/sh_tmu.c +1 -3
@@ -462,8 +462,7 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev) p->irqaction.handler = sh_tmu_interrupt; p->irqaction.dev_id = p; p->irqaction.irq = irq; - p->irqaction.flags =IRQF_DISABLED |IRQF_TIMER | \ -IRQF_IRQPOLL |IRQF_NOBALANCING ; + p->irqaction.flags =IRQF_TIMER |IRQF_IRQPOLL |IRQF_NOBALANCING ;/* get hold of clock */ p->clk =clk_get (&p->pdev->dev,"tmu_fck" );
@@ -523,7 +522,6 @@ static int sh_tmu_probe(struct platform_device *pdev) ret =sh_tmu_setup (p, pdev);if (ret) {kfree (p); -platform_set_drvdata (pdev,NULL );pm_runtime_idle (&pdev->dev);return ret; }
drivers/clocksource/sun4i_timer.c +6 -5
@@ -114,7 +114,7 @@ static int sun4i_clkevt_next_event(unsigned long evt,static struct clock_event_device sun4i_clockevent = { .name ="sun4i_tick" , - .rating =300 , + .rating =350 , .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , .set_mode = sun4i_clkevt_mode, .set_next_event = sun4i_clkevt_next_event,
@@ -138,7 +138,7 @@ static struct irqaction sun4i_timer_irq = { .dev_id = &sun4i_clockevent, }; -static u32 sun4i_timer_sched_read (void ) +static u64 notrace sun4i_timer_sched_read(void) {return ~readl (timer_base +TIMER_CNTVAL_REG (1 )); }
@@ -170,9 +170,9 @@ static void __init sun4i_timer_init(struct device_node *node)TIMER_CTL_CLK_SRC (TIMER_CTL_CLK_SRC_OSC24M ), timer_base + TIMER_CTL_REG(1)); -setup_sched_clock (sun4i_timer_sched_read,32 , rate); +sched_clock_register (sun4i_timer_sched_read,32 , rate);clocksource_mmio_init (timer_base +TIMER_CNTVAL_REG (1 ), node->name, - rate,300 ,32 , clocksource_mmio_readl_down); + rate,350 ,32 , clocksource_mmio_readl_down); ticks_per_jiffy =DIV_ROUND_UP (rate,HZ );
@@ -190,7 +190,8 @@ static void __init sun4i_timer_init(struct device_node *node) val =readl (timer_base +TIMER_IRQ_EN_REG );writel (val |TIMER_IRQ_EN (0 ), timer_base +TIMER_IRQ_EN_REG ); - sun4i_clockevent.cpumask =cpumask_of (0 ); + sun4i_clockevent.cpumask = cpu_possible_mask; + sun4i_clockevent.irq = irq;clockevents_config_and_register (&sun4i_clockevent, rate,TIMER_SYNC_TICKS ,0xffffffff );
drivers/clocksource/tegra20_timer.c +1 -1
@@ -149,7 +149,7 @@ static irqreturn_t tegra_timer_interrupt(int irq, void *dev_id)static struct irqaction tegra_timer_irq = { .name ="timer0" , - .flags =IRQF_DISABLED |IRQF_TIMER |IRQF_TRIGGER_HIGH , + .flags =IRQF_TIMER |IRQF_TRIGGER_HIGH , .handler = tegra_timer_interrupt, .dev_id = &tegra_clockevent, };
drivers/clocksource/time-armada-370-xp.c +9 -9
@@ -76,6 +76,7 @@static void __iomem *timer_base, *local_base;static unsigned int timer_clk;static bool timer25Mhz = true; +static u32 enable_mask;/* * Number of timer ticks per jiffy.
@@ -121,8 +122,7 @@ armada_370_xp_clkevt_next_event(unsigned long delta,/* * Enable the timer. */ -local_timer_ctrl_clrset (TIMER0_RELOAD_EN , -TIMER0_EN |TIMER0_DIV (TIMER_DIVIDER_SHIFT )); +local_timer_ctrl_clrset (TIMER0_RELOAD_EN , enable_mask);return 0 ; }
@@ -141,9 +141,7 @@ armada_370_xp_clkevt_mode(enum clock_event_mode mode,/* * Enable timer. */ -local_timer_ctrl_clrset (0 ,TIMER0_RELOAD_EN | -TIMER0_EN | -TIMER0_DIV (TIMER_DIVIDER_SHIFT )); +local_timer_ctrl_clrset (0 ,TIMER0_RELOAD_EN | enable_mask); }else {/* * Disable timer.
@@ -240,10 +238,13 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)WARN_ON (!timer_base); local_base =of_iomap (np,1 ); -if (timer25Mhz) +if (timer25Mhz) { set =TIMER0_25MHZ ; -else + enable_mask =TIMER0_EN ; + }else { clr =TIMER0_25MHZ ; + enable_mask =TIMER0_EN |TIMER0_DIV (TIMER_DIVIDER_SHIFT ); + }timer_ctrl_clrset (clr, set);local_timer_ctrl_clrset (clr, set);
@@ -262,8 +263,7 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)writel (0xffffffff , timer_base +TIMER0_VAL_OFF );writel (0xffffffff , timer_base +TIMER0_RELOAD_OFF ); -timer_ctrl_clrset (0 ,TIMER0_EN |TIMER0_RELOAD_EN | -TIMER0_DIV (TIMER_DIVIDER_SHIFT )); +timer_ctrl_clrset (0 ,TIMER0_RELOAD_EN | enable_mask);/* * Set scale and timer for sched_clock.
drivers/clocksource/time-orion.c +2 -2
@@ -53,7 +53,7 @@ EXPORT_SYMBOL(orion_timer_ctrl_clrset);/* * Free-running clocksource handling. */ -static u32 notrace orion_read_sched_clock(void) +static u64 notrace orion_read_sched_clock(void) {return ~readl (timer_base +TIMER0_VAL ); }
@@ -135,7 +135,7 @@ static void __init orion_timer_init(struct device_node *np)clocksource_mmio_init (timer_base +TIMER0_VAL ,"orion_clocksource" ,clk_get_rate (clk),300 ,32 , clocksource_mmio_readl_down); -setup_sched_clock (orion_read_sched_clock,32 ,clk_get_rate (clk)); +sched_clock_register (orion_read_sched_clock,32 ,clk_get_rate (clk));/* setup timer1 as clockevent timer */ if (setup_irq (irq, &orion_clkevt_irq))
drivers/clocksource/timer-sun5i.c new file +192 -0
192 lines not on this page · raw message
drivers/clocksource/vt8500_timer.c +1 -1
@@ -124,7 +124,7 @@ static irqreturn_t vt8500_timer_interrupt(int irq, void *dev_id)static struct irqaction irq = { .name ="vt8500_timer" , - .flags =IRQF_DISABLED |IRQF_TIMER |IRQF_IRQPOLL , + .flags =IRQF_TIMER |IRQF_IRQPOLL , .handler = vt8500_timer_interrupt, .dev_id = &clockevent, };
drivers/rtc/rtc-cmos.c +51 -1
80 lines not on this page · raw message
include/linux/context_tracking.h +5 -5
@@ -17,13 +17,13 @@ extern void __context_tracking_task_switch(struct task_struct *prev,static inline void user_enter (void ) { -if (static_key_false (&context_tracking_enabled)) +if (context_tracking_is_enabled ())context_tracking_user_enter (); }static inline void user_exit (void ) { -if (static_key_false (&context_tracking_enabled)) +if (context_tracking_is_enabled ())context_tracking_user_exit (); }
@@ -31,7 +31,7 @@ static inline enum ctx_state exception_enter(void) {enum ctx_state prev_ctx; -if (!static_key_false (&context_tracking_enabled)) +if (!context_tracking_is_enabled ())return 0 ; prev_ctx =this_cpu_read (context_tracking.state);
@@ -42,7 +42,7 @@ static inline enum ctx_state exception_enter(void)static inline void exception_exit (enum ctx_state prev_ctx) { -if (static_key_false (&context_tracking_enabled)) { +if (context_tracking_is_enabled ()) {if (prev_ctx ==IN_USER )context_tracking_user_enter (); }
@@ -51,7 +51,7 @@ static inline void exception_exit(enum ctx_state prev_ctx)static inline void context_tracking_task_switch (struct task_struct *prev,struct task_struct *next) { -if (static_key_false (&context_tracking_enabled)) +if (context_tracking_is_enabled ())__context_tracking_task_switch (prev, next); }#else
include/linux/context_tracking_state.h +8 -3
@@ -22,15 +22,20 @@ struct context_tracking {extern struct static_key context_tracking_enabled; DECLARE_PER_CPU(struct context_tracking, context_tracking); -static inline bool context_tracking_in_user (void ) +static inline bool context_tracking_is_enabled (void ) { -return __this_cpu_read (context_tracking.state) ==IN_USER ; +return static_key_false (&context_tracking_enabled); } -static inline bool context_tracking_active (void ) +static inline bool context_tracking_cpu_is_enabled (void ) {return __this_cpu_read (context_tracking.active); } + +static inline bool context_tracking_in_user (void ) +{ +return __this_cpu_read (context_tracking.state) ==IN_USER ; +}#else static inline bool context_tracking_in_user (void ) {return false; }static inline bool context_tracking_active (void ) {return false; }
include/linux/tick.h +4 -4
@@ -104,7 +104,7 @@ extern struct cpumask *tick_get_broadcast_oneshot_mask(void);extern void tick_clock_notify (void );extern int tick_check_oneshot_change (int allow_nohz);extern struct tick_sched *tick_get_tick_sched (int cpu); -extern void tick_check_idle (int cpu); +extern void tick_check_idle (void );extern int tick_oneshot_mode_active (void );# ifndef arch_needs_cpu# define arch_needs_cpu (cpu) (0)
@@ -112,7 +112,7 @@ extern int tick_oneshot_mode_active(void);# else static inline void tick_clock_notify (void ) { }static inline int tick_check_oneshot_change (int allow_nohz) {return 0 ; } -static inline void tick_check_idle (int cpu) { } +static inline void tick_check_idle (void ) { }static inline int tick_oneshot_mode_active (void ) {return 0 ; }# endif
@@ -121,7 +121,7 @@ static inline void tick_init(void) { }static inline void tick_cancel_sched_timer (int cpu) { }static inline void tick_clock_notify (void ) { }static inline int tick_check_oneshot_change (int allow_nohz) {return 0 ; } -static inline void tick_check_idle (int cpu) { } +static inline void tick_check_idle (void ) { }static inline int tick_oneshot_mode_active (void ) {return 0 ; }#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
@@ -165,7 +165,7 @@ extern cpumask_var_t tick_nohz_full_mask;static inline bool tick_nohz_full_enabled (void ) { -if (!static_key_false (&context_tracking_enabled)) +if (!context_tracking_is_enabled ())return false;return tick_nohz_full_running;
include/linux/vtime.h +2 -2
@@ -19,8 +19,8 @@ static inline bool vtime_accounting_enabled(void) { return true; }#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN static inline bool vtime_accounting_enabled (void ) { -if (static_key_false (&context_tracking_enabled)) { -if (context_tracking_active ()) +if (context_tracking_is_enabled ()) { +if (context_tracking_cpu_is_enabled ())return true; }
init/Kconfig +1 -1
@@ -532,7 +532,7 @@ config CONTEXT_TRACKING_FORCE dynticks subsystem by forcing the context tracking on all CPUs in the system. - Say Y only if you're working on the developpement of an + Say Y only if you're working on the development of an architecture backend for the context tracking. Say N otherwise, this option brings an overhead that you
kernel/context_tracking.c +4 -4
@@ -53,10 +53,10 @@ void context_tracking_user_enter(void)/* * Repeat the user_enter() check here because some archs may be calling * this from asm and if no CPU needs context tracking, they shouldn't -* go further. Repeat the check here until they support the static key -* check. +* go further. Repeat the check here until they support the inline static +* key check. */ -if (!static_key_false (&context_tracking_enabled)) +if (!context_tracking_is_enabled ())return ;/*
@@ -160,7 +160,7 @@ void context_tracking_user_exit(void) {unsigned long flags; -if (!static_key_false (&context_tracking_enabled)) +if (!context_tracking_is_enabled ())return ;if (in_interrupt ())
kernel/posix-cpu-timers.c +135 -192
529 lines not on this page · raw message
kernel/softirq.c +1 -3
@@ -311,8 +311,6 @@ asmlinkage void do_softirq(void)*/ void irq_enter (void ) { -int cpu =smp_processor_id (); -rcu_irq_enter ();if (is_idle_task (current) && !in_interrupt ()) {/*
@@ -320,7 +318,7 @@ void irq_enter(void)* here, as softirq will be serviced on return from interrupt. */ local_bh_disable (); -tick_check_idle (cpu); +tick_check_idle ();_local_bh_enable (); }
kernel/time/tick-broadcast.c +3 -3
@@ -538,10 +538,10 @@ int tick_resume_broadcast_oneshot(struct clock_event_device *bc)* Called from irq_enter() when idle was interrupted to reenable the * per cpu device. */ -void tick_check_oneshot_broadcast (int cpu) +void tick_check_oneshot_broadcast_this_cpu (void ) { -if (cpumask_test_cpu (cpu, tick_broadcast_oneshot_mask)) { -struct tick_device *td = &per_cpu (tick_cpu_device, cpu); +if (cpumask_test_cpu (smp_processor_id (), tick_broadcast_oneshot_mask)) { +struct tick_device *td = &__get_cpu_var (tick_cpu_device);/* * We might be in the middle of switching over from
kernel/time/tick-common.c +1 -0
@@ -85,6 +85,7 @@ static void tick_periodic(int cpu)do_timer (1 );write_sequnlock (&jiffies_lock); +update_wall_time (); }update_process_times (user_mode (get_irq_regs ()));
kernel/time/tick-internal.h +3 -2
@@ -51,7 +51,7 @@ extern void tick_broadcast_switch_to_oneshot(void);extern void tick_shutdown_broadcast_oneshot (unsigned int *cpup);extern int tick_resume_broadcast_oneshot (struct clock_event_device *bc);extern int tick_broadcast_oneshot_active (void ); -extern void tick_check_oneshot_broadcast (int cpu); +extern void tick_check_oneshot_broadcast_this_cpu (void );bool tick_broadcast_oneshot_available (void );# else /* BROADCAST */ static inline void tick_broadcast_setup_oneshot (struct clock_event_device *bc)
@@ -62,7 +62,7 @@ static inline void tick_broadcast_oneshot_control(unsigned long reason) { }static inline void tick_broadcast_switch_to_oneshot (void ) { }static inline void tick_shutdown_broadcast_oneshot (unsigned int *cpup) { }static inline int tick_broadcast_oneshot_active (void ) {return 0 ; } -static inline void tick_check_oneshot_broadcast (int cpu) { } +static inline void tick_check_oneshot_broadcast_this_cpu (void ) { }static inline bool tick_broadcast_oneshot_available (void ) {return true; }# endif /* !BROADCAST */
@@ -155,3 +155,4 @@ static inline int tick_device_is_functional(struct clock_event_device *dev)#endif extern void do_timer (unsigned long ticks); +extern void update_wall_time (void );
kernel/time/tick-sched.c +17 -23
@@ -86,6 +86,7 @@ static void tick_do_update_jiffies64(ktime_t now) tick_next_period =ktime_add (last_jiffies_update, tick_period); }write_sequnlock (&jiffies_lock); +update_wall_time (); }/*
@@ -391,11 +392,9 @@ __setup("nohz=", setup_tick_nohz);*/ static void tick_nohz_update_jiffies (ktime_t now) { -int cpu =smp_processor_id (); -struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu);unsigned long flags; - ts->idle_waketime = now; +__this_cpu_write (tick_cpu_sched.idle_waketime, now);local_irq_save (flags);tick_do_update_jiffies64 (now);
@@ -426,17 +425,15 @@ update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_upda } -static void tick_nohz_stop_idle (int cpu,ktime_t now) +static void tick_nohz_stop_idle (struct tick_sched *ts,ktime_t now) { -struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu); - -update_ts_time_stats (cpu, ts, now,NULL ); +update_ts_time_stats (smp_processor_id (), ts, now,NULL ); ts->idle_active =0 ;sched_clock_idle_wakeup_event (0 ); } -static ktime_t tick_nohz_start_idle (int cpu,struct tick_sched *ts) +static ktime_t tick_nohz_start_idle (struct tick_sched *ts) {ktime_t now =ktime_get ();
@@ -754,7 +751,7 @@ static void __tick_nohz_idle_enter(struct tick_sched *ts)ktime_t now, expires;int cpu =smp_processor_id (); - now =tick_nohz_start_idle (cpu, ts); + now =tick_nohz_start_idle (ts);if (can_stop_idle_tick (cpu, ts)) {int was_stopped = ts->tick_stopped;
@@ -911,8 +908,7 @@ static void tick_nohz_account_idle_ticks(struct tick_sched *ts)*/ void tick_nohz_idle_exit (void ) { -int cpu =smp_processor_id (); -struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu); +struct tick_sched *ts = &__get_cpu_var (tick_cpu_sched);ktime_t now;local_irq_disable ();
@@ -925,7 +921,7 @@ void tick_nohz_idle_exit(void) now =ktime_get ();if (ts->idle_active) -tick_nohz_stop_idle (cpu, now); +tick_nohz_stop_idle (ts, now);if (ts->tick_stopped) {tick_nohz_restart_sched_tick (ts, now);
@@ -1009,12 +1005,10 @@ static void tick_nohz_switch_to_nohz(void)* timer and do not touch the other magic bits which need to be done * when idle is left. */ -static void tick_nohz_kick_tick (int cpu,ktime_t now) +static void tick_nohz_kick_tick (struct tick_sched *ts,ktime_t now) {#if 0 /* Switch back to 2.6.27 behaviour */ - -struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu);ktime_t delta;/*
@@ -1029,36 +1023,36 @@ static void tick_nohz_kick_tick(int cpu, ktime_t now) #endif } -static inline void tick_check_nohz (int cpu) +static inline void tick_check_nohz_this_cpu (void ) { -struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu); +struct tick_sched *ts = &__get_cpu_var (tick_cpu_sched);ktime_t now;if (!ts->idle_active && !ts->tick_stopped)return ; now =ktime_get ();if (ts->idle_active) -tick_nohz_stop_idle (cpu, now); +tick_nohz_stop_idle (ts, now);if (ts->tick_stopped) {tick_nohz_update_jiffies (now); -tick_nohz_kick_tick (cpu, now); +tick_nohz_kick_tick (ts, now); } }#else static inline void tick_nohz_switch_to_nohz (void ) { } -static inline void tick_check_nohz (int cpu) { } +static inline void tick_check_nohz_this_cpu (void ) { }#endif /* CONFIG_NO_HZ_COMMON */ /* * Called from irq_enter to notify about the possible interruption of idle() */ -void tick_check_idle (int cpu) +void tick_check_idle (void ) { -tick_check_oneshot_broadcast (cpu); -tick_check_nohz (cpu); +tick_check_oneshot_broadcast_this_cpu (); +tick_check_nohz_this_cpu (); }/*
kernel/time/timekeeping.c +26 -27
169 lines not on this page · raw message