Re: [GIT PULL] timer fixes

2020-12-27 Thread pr-tracker-bot
The pull request you sent on Sun, 27 Dec 2020 10:26:58 +0100:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-2020-12-27

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/2eeefc60ad70ffb7a5daf9f47aef5b1ebd1f39ad

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html


[GIT PULL] timer fixes

2020-12-27 Thread Ingo Molnar
Linus,

Please pull the latest timers/urgent git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-2020-12-27

   # HEAD: f6f5cd840ae782680c5e94048c72420e4e6857f9 timekeeping: Fix spelling 
mistake in Kconfig "fullfill" -> "fulfill"

Update/fix two CPU sanity checks in the hotplug and the boot code,
and fix a typo in the Kconfig help text.

( Context: the first two commits are the result of an ongoing 
  annotation+review work of (intentional) tick_do_timer_cpu() data 
  races reported by KCSAN, but the annotations aren't fully cooked 
  yet. )

 Thanks,

Ingo

-->
Colin Ian King (1):
  timekeeping: Fix spelling mistake in Kconfig "fullfill" -> "fulfill"

Thomas Gleixner (2):
  tick: Remove pointless cpu valid check in hotplug code
  tick/sched: Remove bogus boot "safety" check


 kernel/time/Kconfig   |  2 +-
 kernel/time/tick-common.c | 10 +++---
 kernel/time/tick-sched.c  |  7 ---
 3 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
index a09b1d61df6a..64051f47475c 100644
--- a/kernel/time/Kconfig
+++ b/kernel/time/Kconfig
@@ -141,7 +141,7 @@ config CONTEXT_TRACKING_FORCE
  dynticks working.
 
  This option stands for testing when an arch implements the
- context tracking backend but doesn't yet fullfill all the
+ context tracking backend but doesn't yet fulfill all the
  requirements to make the full dynticks feature working.
  Without the full dynticks, there is no way to test the support
  for context tracking and the subsystems that rely on it: RCU
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index a03764df5366..9d3a22510bab 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -407,17 +407,13 @@ EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control);
 /*
  * Transfer the do_timer job away from a dying cpu.
  *
- * Called with interrupts disabled. Not locking required. If
+ * Called with interrupts disabled. No locking required. If
  * tick_do_timer_cpu is owned by this cpu, nothing can change it.
  */
 void tick_handover_do_timer(void)
 {
-   if (tick_do_timer_cpu == smp_processor_id()) {
-   int cpu = cpumask_first(cpu_online_mask);
-
-   tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu :
-   TICK_DO_TIMER_NONE;
-   }
+   if (tick_do_timer_cpu == smp_processor_id())
+   tick_do_timer_cpu = cpumask_first(cpu_online_mask);
 }
 
 /*
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index a9e68936822d..5fbc748f0058 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -991,13 +991,6 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched 
*ts)
 */
if (tick_do_timer_cpu == cpu)
return false;
-   /*
-* Boot safety: make sure the timekeeping duty has been
-* assigned before entering dyntick-idle mode,
-* tick_do_timer_cpu is TICK_DO_TIMER_BOOT
-*/
-   if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_BOOT))
-   return false;
 
/* Should not happen for nohz-full */
if (WARN_ON_ONCE(tick_do_timer_cpu == TICK_DO_TIMER_NONE))


Re: [GIT pull] timer fixes for 5.2

2019-06-16 Thread pr-tracker-bot
The pull request you sent on Sun, 16 Jun 2019 11:29:52 -:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/efba92d58fa37d714d665deddb5cc6458b39bb88

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker


[GIT pull] timer fixes for 5.2

2019-06-16 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

up to:  e3ff9c3678b4: timekeeping: Repair ktime_get_coarse*() granularity

A set of small fixes:

 - Repair the ktime_get_coarse() functions so they actually deliver what
   they are supposed to: tick granular time stamps. The current code missed
   to add the accumulated nanoseconds part of the timekeeper so the
   resulting granularity was 1 second.

 - Prevent the tracer from infinitely recursing into time getter functions
   in the arm architectured timer by marking these functions notrace

 - Fix a trivial compiler warning caused by wrong qualifier ordering.

Thanks,

tglx

-->
Julien Thierry (1):
  clocksource/drivers/arm_arch_timer: Don't trace count reader functions

Philippe Mazenauer (1):
  clocksource/drivers/timer-ti-dm: Change to new style declaration

Thomas Gleixner (1):
  timekeeping: Repair ktime_get_coarse*() granularity


 drivers/clocksource/arm_arch_timer.c | 8 
 drivers/clocksource/timer-ti-dm.c| 2 +-
 kernel/time/timekeeping.c| 5 +++--
 3 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index b2a951a798e2..5c69c9a9a6a4 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -149,22 +149,22 @@ u32 arch_timer_reg_read(int access, enum arch_timer_reg 
reg,
return val;
 }
 
-static u64 arch_counter_get_cntpct_stable(void)
+static notrace u64 arch_counter_get_cntpct_stable(void)
 {
return __arch_counter_get_cntpct_stable();
 }
 
-static u64 arch_counter_get_cntpct(void)
+static notrace u64 arch_counter_get_cntpct(void)
 {
return __arch_counter_get_cntpct();
 }
 
-static u64 arch_counter_get_cntvct_stable(void)
+static notrace u64 arch_counter_get_cntvct_stable(void)
 {
return __arch_counter_get_cntvct_stable();
 }
 
-static u64 arch_counter_get_cntvct(void)
+static notrace u64 arch_counter_get_cntvct(void)
 {
return __arch_counter_get_cntvct();
 }
diff --git a/drivers/clocksource/timer-ti-dm.c 
b/drivers/clocksource/timer-ti-dm.c
index e40b55a7086f..5394d9dbdfbc 100644
--- a/drivers/clocksource/timer-ti-dm.c
+++ b/drivers/clocksource/timer-ti-dm.c
@@ -896,7 +896,7 @@ static int omap_dm_timer_remove(struct platform_device 
*pdev)
return ret;
 }
 
-const static struct omap_dm_timer_ops dmtimer_ops = {
+static const struct omap_dm_timer_ops dmtimer_ops = {
.request_by_node = omap_dm_timer_request_by_node,
.request_specific = omap_dm_timer_request_specific,
.request = omap_dm_timer_request,
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 85f5912d8f70..44b726bab4bd 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -808,17 +808,18 @@ ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs)
struct timekeeper *tk = _core.timekeeper;
unsigned int seq;
ktime_t base, *offset = offsets[offs];
+   u64 nsecs;
 
WARN_ON(timekeeping_suspended);
 
do {
seq = read_seqcount_begin(_core.seq);
base = ktime_add(tk->tkr_mono.base, *offset);
+   nsecs = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift;
 
} while (read_seqcount_retry(_core.seq, seq));
 
-   return base;
-
+   return base + nsecs;
 }
 EXPORT_SYMBOL_GPL(ktime_get_coarse_with_offset);
 



Re: [GIT PULL] timer fixes

2019-05-16 Thread pr-tracker-bot
The pull request you sent on Thu, 16 May 2019 18:09:25 +0200:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/b2c3dda6f8f06d825b9b6099f57b906c774141c0

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker


[GIT PULL] timer fixes

2019-05-16 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: fdc6bae940ee9eb869e493990540098b8c0fd6ab ntp: Allow TAI-UTC offset 
to be set to zero

A TIA adjtimex interface extension, and a POSIX compliance ABI fix for 
timespec64 users.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  y2038: Make CONFIG_64BIT_TIME unconditional

Miroslav Lichvar (1):
  ntp: Allow TAI-UTC offset to be set to zero


 arch/Kconfig  | 2 +-
 kernel/time/ntp.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 3368786a..9092e0ffe4d3 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -764,7 +764,7 @@ config COMPAT_OLD_SIGACTION
bool
 
 config 64BIT_TIME
-   def_bool ARCH_HAS_64BIT_TIME
+   def_bool y
help
  This should be selected by all architectures that need to support
  new system calls with a 64-bit time_t. This is relevant on all 32-bit
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 92a90014a925..f43d47c8c3b6 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -690,7 +690,7 @@ static inline void process_adjtimex_modes(const struct 
__kernel_timex *txc,
time_constant = max(time_constant, 0l);
}
 
-   if (txc->modes & ADJ_TAI && txc->constant > 0)
+   if (txc->modes & ADJ_TAI && txc->constant >= 0)
*time_tai = txc->constant;
 
if (txc->modes & ADJ_OFFSET)


Re: [GIT PULL] timer fixes

2019-04-20 Thread pr-tracker-bot
The pull request you sent on Sat, 20 Apr 2019 09:45:50 +0200:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/e899cc3b3d9813f795c039c0f3c689861d6836da

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker


[GIT PULL] timer fixes

2019-04-20 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 3f2552f7e9c5abef2775c53f7af66532f8bf65bc timers/sched_clock: Prevent 
generic sched_clock wrap caused by tick_freeze()

Misc clocksource driver fixes, and a sched-clock wrapping fix.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  clocksource/drivers/npcm: select TIMER_OF

Chang-An Chen (1):
  timers/sched_clock: Prevent generic sched_clock wrap caused by 
tick_freeze()

Nathan Chancellor (1):
  clocksource/drivers/timer-ti-dm: Remove omap_dm_timer_set_load_start

Neil Armstrong (1):
  clocksource/drivers/oxnas: Fix OX820 compatible

Yangtao Li (1):
  clocksource/drivers/arm_arch_timer: Remove unneeded pr_fmt macro


 drivers/clocksource/Kconfig   |  1 +
 drivers/clocksource/arm_arch_timer.c  |  5 +
 drivers/clocksource/timer-oxnas-rps.c |  2 +-
 drivers/clocksource/timer-ti-dm.c | 28 
 kernel/time/sched_clock.c |  4 ++--
 kernel/time/tick-common.c |  2 ++
 kernel/time/timekeeping.h |  7 +++
 7 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 171502a356aa..4b3d143f0f8a 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -145,6 +145,7 @@ config VT8500_TIMER
 config NPCM7XX_TIMER
bool "NPCM7xx timer driver" if COMPILE_TEST
depends on HAS_IOMEM
+   select TIMER_OF
select CLKSRC_MMIO
help
  Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture,
diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index aa4ec53281ce..ea373cfbcecb 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -9,7 +9,7 @@
  * published by the Free Software Foundation.
  */
 
-#define pr_fmt(fmt)"arm_arch_timer: " fmt
+#define pr_fmt(fmt)"arch_timer: " fmt
 
 #include 
 #include 
@@ -33,9 +33,6 @@
 
 #include 
 
-#undef pr_fmt
-#define pr_fmt(fmt) "arch_timer: " fmt
-
 #define CNTTIDR0x08
 #define CNTTIDR_VIRT(n)(BIT(1) << ((n) * 4))
 
diff --git a/drivers/clocksource/timer-oxnas-rps.c 
b/drivers/clocksource/timer-oxnas-rps.c
index eed6feff8b5f..30c6f4ce672b 100644
--- a/drivers/clocksource/timer-oxnas-rps.c
+++ b/drivers/clocksource/timer-oxnas-rps.c
@@ -296,4 +296,4 @@ static int __init oxnas_rps_timer_init(struct device_node 
*np)
 TIMER_OF_DECLARE(ox810se_rps,
   "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init);
 TIMER_OF_DECLARE(ox820_rps,
-  "oxsemi,ox820se-rps-timer", oxnas_rps_timer_init);
+  "oxsemi,ox820-rps-timer", oxnas_rps_timer_init);
diff --git a/drivers/clocksource/timer-ti-dm.c 
b/drivers/clocksource/timer-ti-dm.c
index 3352da6ed61f..ee8ec5a8cb16 100644
--- a/drivers/clocksource/timer-ti-dm.c
+++ b/drivers/clocksource/timer-ti-dm.c
@@ -585,34 +585,6 @@ static int omap_dm_timer_set_load(struct omap_dm_timer 
*timer, int autoreload,
return 0;
 }
 
-/* Optimized set_load which removes costly spin wait in timer_start */
-static int omap_dm_timer_set_load_start(struct omap_dm_timer *timer,
-   int autoreload, unsigned int load)
-{
-   u32 l;
-
-   if (unlikely(!timer))
-   return -EINVAL;
-
-   omap_dm_timer_enable(timer);
-
-   l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
-   if (autoreload) {
-   l |= OMAP_TIMER_CTRL_AR;
-   omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);
-   } else {
-   l &= ~OMAP_TIMER_CTRL_AR;
-   }
-   l |= OMAP_TIMER_CTRL_ST;
-
-   __omap_dm_timer_load_start(timer, l, load, timer->posted);
-
-   /* Save the context */
-   timer->context.tclr = l;
-   timer->context.tldr = load;
-   timer->context.tcrr = load;
-   return 0;
-}
 static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
   unsigned int match)
 {
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 094b82ca95e5..930113b9799a 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -272,7 +272,7 @@ static u64 notrace suspended_sched_clock_read(void)
return cd.read_data[seq & 1].epoch_cyc;
 }
 
-static int sched_clock_suspend(void)
+int sched_clock_suspend(void)
 {
struct clock_read_data *rd = _data[0];
 
@@ -283,7 +283,7 @@ static int sched_clock_suspend(void)
return 0;
 }
 
-static void sched_clock_resume(void)
+void sched_clock_resume(void)
 {
struct clock_read_data *rd = _data[0];
 
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index 529143b4c8d2..df401463a191 100644
--- a/kernel/time/tick-common.c
+++ 

Re: [GIT pull] timer fixes for 4.20

2018-11-11 Thread pr-tracker-bot
The pull request you sent on Sun, 11 Nov 2018 09:11:08 +0100:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/08b5278650d6e9f61a210f88e3f418c87389df5b

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker


Re: [GIT pull] timer fixes for 4.20

2018-11-11 Thread pr-tracker-bot
The pull request you sent on Sun, 11 Nov 2018 09:11:08 +0100:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/08b5278650d6e9f61a210f88e3f418c87389df5b

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker


[GIT pull] timer fixes for 4.20

2018-11-11 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Just the removal of a redundant call into the sched deadline overrun check. 

Thanks,

tglx

-->
Juri Lelli (1):
  posix-cpu-timers: Remove useless call to check_dl_overrun()


 kernel/time/posix-cpu-timers.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index ce32cf741b25..8f0644af40be 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -917,9 +917,6 @@ static void check_process_timers(struct task_struct *tsk,
struct task_cputime cputime;
unsigned long soft;
 
-   if (dl_task(tsk))
-   check_dl_overrun(tsk);
-
/*
 * If cputimer is not running, then there are no active
 * process wide timers (POSIX 1.b, itimers, RLIMIT_CPU).



[GIT pull] timer fixes for 4.20

2018-11-11 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Just the removal of a redundant call into the sched deadline overrun check. 

Thanks,

tglx

-->
Juri Lelli (1):
  posix-cpu-timers: Remove useless call to check_dl_overrun()


 kernel/time/posix-cpu-timers.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index ce32cf741b25..8f0644af40be 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -917,9 +917,6 @@ static void check_process_timers(struct task_struct *tsk,
struct task_cputime cputime;
unsigned long soft;
 
-   if (dl_task(tsk))
-   check_dl_overrun(tsk);
-
/*
 * If cputimer is not running, then there are no active
 * process wide timers (POSIX 1.b, itimers, RLIMIT_CPU).



Re: [GIT pull] timer fixes for 4.19

2018-09-29 Thread Greg Kroah-Hartman
On Sat, Sep 29, 2018 at 08:25:47PM +0200, Thomas Gleixner wrote:
> Greg,
> 
> please pull the latest timers-urgent-for-linus git tree from:
> 
>git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

Now pulled, thanks.

greg k-h


Re: [GIT pull] timer fixes for 4.19

2018-09-29 Thread Greg Kroah-Hartman
On Sat, Sep 29, 2018 at 08:25:47PM +0200, Thomas Gleixner wrote:
> Greg,
> 
> please pull the latest timers-urgent-for-linus git tree from:
> 
>git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus

Now pulled, thanks.

greg k-h


[GIT pull] timer fixes for 4.19

2018-09-29 Thread Thomas Gleixner
Greg,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Three small fixes for clocksource drivers:

 - Proper error handling in the Atmel PIT driver
 
 - Add CLOCK_SOURCE_SUSPEND_NONSTOP for TI SoCs so suspend works again

 - Fix the next event function for Facebook Backpack-CMM BMC chips so
   usleep(100) doesnt sleep several milliseconds

Thanks,

tglx

-->
Alexandre Belloni (1):
  clocksource/drivers/timer-atmel-pit: Properly handle error cases

Keerthy (1):
  clocksource/drivers/ti-32k: Add CLOCK_SOURCE_SUSPEND_NONSTOP flag for 
non-am43 SoCs

Tao Ren (1):
  clocksource/drivers/fttmr010: Fix set_next_event handler


 drivers/clocksource/timer-atmel-pit.c | 20 ++--
 drivers/clocksource/timer-fttmr010.c  | 18 +++---
 drivers/clocksource/timer-ti-32k.c|  3 +++
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index ec8a4376f74f..2fab18fae4fc 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -180,26 +180,29 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
data->base = of_iomap(node, 0);
if (!data->base) {
pr_err("Could not map PIT address\n");
-   return -ENXIO;
+   ret = -ENXIO;
+   goto exit;
}
 
data->mck = of_clk_get(node, 0);
if (IS_ERR(data->mck)) {
pr_err("Unable to get mck clk\n");
-   return PTR_ERR(data->mck);
+   ret = PTR_ERR(data->mck);
+   goto exit;
}
 
ret = clk_prepare_enable(data->mck);
if (ret) {
pr_err("Unable to enable mck\n");
-   return ret;
+   goto exit;
}
 
/* Get the interrupts property */
data->irq = irq_of_parse_and_map(node, 0);
if (!data->irq) {
pr_err("Unable to get IRQ from DT\n");
-   return -EINVAL;
+   ret = -EINVAL;
+   goto exit;
}
 
/*
@@ -227,7 +230,7 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
ret = clocksource_register_hz(>clksrc, pit_rate);
if (ret) {
pr_err("Failed to register clocksource\n");
-   return ret;
+   goto exit;
}
 
/* Set up irq handler */
@@ -236,7 +239,8 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
  "at91_tick", data);
if (ret) {
pr_err("Unable to setup IRQ\n");
-   return ret;
+   clocksource_unregister(>clksrc);
+   goto exit;
}
 
/* Set up and register clockevents */
@@ -254,6 +258,10 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
clockevents_register_device(>clkevt);
 
return 0;
+
+exit:
+   kfree(data);
+   return ret;
 }
 TIMER_OF_DECLARE(at91sam926x_pit, "atmel,at91sam9260-pit",
   at91sam926x_pit_dt_init);
diff --git a/drivers/clocksource/timer-fttmr010.c 
b/drivers/clocksource/timer-fttmr010.c
index c020038ebfab..cf93f6419b51 100644
--- a/drivers/clocksource/timer-fttmr010.c
+++ b/drivers/clocksource/timer-fttmr010.c
@@ -130,13 +130,17 @@ static int fttmr010_timer_set_next_event(unsigned long 
cycles,
cr &= ~fttmr010->t1_enable_val;
writel(cr, fttmr010->base + TIMER_CR);
 
-   /* Setup the match register forward/backward in time */
-   cr = readl(fttmr010->base + TIMER1_COUNT);
-   if (fttmr010->count_down)
-   cr -= cycles;
-   else
-   cr += cycles;
-   writel(cr, fttmr010->base + TIMER1_MATCH1);
+   if (fttmr010->count_down) {
+   /*
+* ASPEED Timer Controller will load TIMER1_LOAD register
+* into TIMER1_COUNT register when the timer is re-enabled.
+*/
+   writel(cycles, fttmr010->base + TIMER1_LOAD);
+   } else {
+   /* Setup the match register forward in time */
+   cr = readl(fttmr010->base + TIMER1_COUNT);
+   writel(cr + cycles, fttmr010->base + TIMER1_MATCH1);
+   }
 
/* Start */
cr = readl(fttmr010->base + TIMER_CR);
diff --git a/drivers/clocksource/timer-ti-32k.c 
b/drivers/clocksource/timer-ti-32k.c
index 29e2e1a78a43..6949a9113dbb 100644
--- a/drivers/clocksource/timer-ti-32k.c
+++ b/drivers/clocksource/timer-ti-32k.c
@@ -97,6 +97,9 @@ static int __init ti_32k_timer_init(struct device_node *np)
return -ENXIO;
}
 
+   if (!of_machine_is_compatible("ti,am43"))
+   ti_32k_timer.cs.flags |= CLOCK_SOURCE_SUSPEND_NONSTOP;
+
ti_32k_timer.counter = ti_32k_timer.base;
 
   

[GIT pull] timer fixes for 4.19

2018-09-29 Thread Thomas Gleixner
Greg,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Three small fixes for clocksource drivers:

 - Proper error handling in the Atmel PIT driver
 
 - Add CLOCK_SOURCE_SUSPEND_NONSTOP for TI SoCs so suspend works again

 - Fix the next event function for Facebook Backpack-CMM BMC chips so
   usleep(100) doesnt sleep several milliseconds

Thanks,

tglx

-->
Alexandre Belloni (1):
  clocksource/drivers/timer-atmel-pit: Properly handle error cases

Keerthy (1):
  clocksource/drivers/ti-32k: Add CLOCK_SOURCE_SUSPEND_NONSTOP flag for 
non-am43 SoCs

Tao Ren (1):
  clocksource/drivers/fttmr010: Fix set_next_event handler


 drivers/clocksource/timer-atmel-pit.c | 20 ++--
 drivers/clocksource/timer-fttmr010.c  | 18 +++---
 drivers/clocksource/timer-ti-32k.c|  3 +++
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index ec8a4376f74f..2fab18fae4fc 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -180,26 +180,29 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
data->base = of_iomap(node, 0);
if (!data->base) {
pr_err("Could not map PIT address\n");
-   return -ENXIO;
+   ret = -ENXIO;
+   goto exit;
}
 
data->mck = of_clk_get(node, 0);
if (IS_ERR(data->mck)) {
pr_err("Unable to get mck clk\n");
-   return PTR_ERR(data->mck);
+   ret = PTR_ERR(data->mck);
+   goto exit;
}
 
ret = clk_prepare_enable(data->mck);
if (ret) {
pr_err("Unable to enable mck\n");
-   return ret;
+   goto exit;
}
 
/* Get the interrupts property */
data->irq = irq_of_parse_and_map(node, 0);
if (!data->irq) {
pr_err("Unable to get IRQ from DT\n");
-   return -EINVAL;
+   ret = -EINVAL;
+   goto exit;
}
 
/*
@@ -227,7 +230,7 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
ret = clocksource_register_hz(>clksrc, pit_rate);
if (ret) {
pr_err("Failed to register clocksource\n");
-   return ret;
+   goto exit;
}
 
/* Set up irq handler */
@@ -236,7 +239,8 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
  "at91_tick", data);
if (ret) {
pr_err("Unable to setup IRQ\n");
-   return ret;
+   clocksource_unregister(>clksrc);
+   goto exit;
}
 
/* Set up and register clockevents */
@@ -254,6 +258,10 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
clockevents_register_device(>clkevt);
 
return 0;
+
+exit:
+   kfree(data);
+   return ret;
 }
 TIMER_OF_DECLARE(at91sam926x_pit, "atmel,at91sam9260-pit",
   at91sam926x_pit_dt_init);
diff --git a/drivers/clocksource/timer-fttmr010.c 
b/drivers/clocksource/timer-fttmr010.c
index c020038ebfab..cf93f6419b51 100644
--- a/drivers/clocksource/timer-fttmr010.c
+++ b/drivers/clocksource/timer-fttmr010.c
@@ -130,13 +130,17 @@ static int fttmr010_timer_set_next_event(unsigned long 
cycles,
cr &= ~fttmr010->t1_enable_val;
writel(cr, fttmr010->base + TIMER_CR);
 
-   /* Setup the match register forward/backward in time */
-   cr = readl(fttmr010->base + TIMER1_COUNT);
-   if (fttmr010->count_down)
-   cr -= cycles;
-   else
-   cr += cycles;
-   writel(cr, fttmr010->base + TIMER1_MATCH1);
+   if (fttmr010->count_down) {
+   /*
+* ASPEED Timer Controller will load TIMER1_LOAD register
+* into TIMER1_COUNT register when the timer is re-enabled.
+*/
+   writel(cycles, fttmr010->base + TIMER1_LOAD);
+   } else {
+   /* Setup the match register forward in time */
+   cr = readl(fttmr010->base + TIMER1_COUNT);
+   writel(cr + cycles, fttmr010->base + TIMER1_MATCH1);
+   }
 
/* Start */
cr = readl(fttmr010->base + TIMER_CR);
diff --git a/drivers/clocksource/timer-ti-32k.c 
b/drivers/clocksource/timer-ti-32k.c
index 29e2e1a78a43..6949a9113dbb 100644
--- a/drivers/clocksource/timer-ti-32k.c
+++ b/drivers/clocksource/timer-ti-32k.c
@@ -97,6 +97,9 @@ static int __init ti_32k_timer_init(struct device_node *np)
return -ENXIO;
}
 
+   if (!of_machine_is_compatible("ti,am43"))
+   ti_32k_timer.cs.flags |= CLOCK_SOURCE_SUSPEND_NONSTOP;
+
ti_32k_timer.counter = ti_32k_timer.base;
 
   

[GIT pull] timer fixes for 4.18

2018-08-05 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two oneliners addressing NOHZ failures:

  - Use a bitmask to check for the pending timer softirq and not the bit
number. The existing code using the bit number checked for the wrong
bit, which caused timers to either expire late or stop completely.

  - Make the nohz evaluation on interrupt exit more robust. The existing
code did not rearm the hardware when interrupting a running softirq in
task context (ksoftirqd or tail of local_bh_enable()), which caused
timers to either expire late or stop completely.

Thanks,

tglx

-->
Anna-Maria Gleixner (1):
  nohz: Fix local_timer_softirq_pending()

Frederic Weisbecker (1):
  nohz: Fix missing tick reprogram when interrupting an inline softirq


 kernel/softirq.c | 2 +-
 kernel/time/tick-sched.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/softirq.c b/kernel/softirq.c
index 75ffc1d1a2e0..6f584861d329 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -390,7 +390,7 @@ static inline void tick_irq_exit(void)
 
/* Make sure that timer wheel updates are propagated */
if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
-   if (!in_interrupt())
+   if (!in_irq())
tick_nohz_irq_exit();
}
 #endif
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index da9455a6b42b..5b33e2f5c0ed 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -642,7 +642,7 @@ static void tick_nohz_restart(struct tick_sched *ts, 
ktime_t now)
 
 static inline bool local_timer_softirq_pending(void)
 {
-   return local_softirq_pending() & TIMER_SOFTIRQ;
+   return local_softirq_pending() & BIT(TIMER_SOFTIRQ);
 }
 
 static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu)


[GIT pull] timer fixes for 4.18

2018-08-05 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two oneliners addressing NOHZ failures:

  - Use a bitmask to check for the pending timer softirq and not the bit
number. The existing code using the bit number checked for the wrong
bit, which caused timers to either expire late or stop completely.

  - Make the nohz evaluation on interrupt exit more robust. The existing
code did not rearm the hardware when interrupting a running softirq in
task context (ksoftirqd or tail of local_bh_enable()), which caused
timers to either expire late or stop completely.

Thanks,

tglx

-->
Anna-Maria Gleixner (1):
  nohz: Fix local_timer_softirq_pending()

Frederic Weisbecker (1):
  nohz: Fix missing tick reprogram when interrupting an inline softirq


 kernel/softirq.c | 2 +-
 kernel/time/tick-sched.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/softirq.c b/kernel/softirq.c
index 75ffc1d1a2e0..6f584861d329 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -390,7 +390,7 @@ static inline void tick_irq_exit(void)
 
/* Make sure that timer wheel updates are propagated */
if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
-   if (!in_interrupt())
+   if (!in_irq())
tick_nohz_irq_exit();
}
 #endif
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index da9455a6b42b..5b33e2f5c0ed 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -642,7 +642,7 @@ static void tick_nohz_restart(struct tick_sched *ts, 
ktime_t now)
 
 static inline bool local_timer_softirq_pending(void)
 {
-   return local_softirq_pending() & TIMER_SOFTIRQ;
+   return local_softirq_pending() & BIT(TIMER_SOFTIRQ);
 }
 
 static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu)


[GIT PULL] timer fixes

2018-07-13 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 5e18e412973d6bb1804de1d4d30a891c774b006e clocksource: 
arm_arch_timer: Set arch_mem_timer cpumask to cpu_possible_mask

A clocksource driver fix and a revert.

 Thanks,

Ingo

-->
Sudeep Holla (2):
  Revert "tick: Prefer a lower rating device only if it's CPU local device"
  clocksource: arm_arch_timer: Set arch_mem_timer cpumask to 
cpu_possible_mask


 drivers/clocksource/arm_arch_timer.c | 2 +-
 kernel/time/tick-common.c| 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index 57cb2f00fc07..d8c7f5750cdb 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -735,7 +735,7 @@ static void __arch_timer_setup(unsigned type,
clk->features |= CLOCK_EVT_FEAT_DYNIRQ;
clk->name = "arch_mem_timer";
clk->rating = 400;
-   clk->cpumask = cpu_all_mask;
+   clk->cpumask = cpu_possible_mask;
if (arch_timer_mem_use_virtual) {
clk->set_state_shutdown = arch_timer_shutdown_virt_mem;
clk->set_state_oneshot_stopped = 
arch_timer_shutdown_virt_mem;
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index b7005dd21ec1..14de3727b18e 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -277,8 +277,7 @@ static bool tick_check_preferred(struct clock_event_device 
*curdev,
 */
return !curdev ||
newdev->rating > curdev->rating ||
-  (!cpumask_equal(curdev->cpumask, newdev->cpumask) &&
-   !tick_check_percpu(curdev, newdev, smp_processor_id()));
+  !cpumask_equal(curdev->cpumask, newdev->cpumask);
 }
 
 /*


[GIT PULL] timer fixes

2018-07-13 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 5e18e412973d6bb1804de1d4d30a891c774b006e clocksource: 
arm_arch_timer: Set arch_mem_timer cpumask to cpu_possible_mask

A clocksource driver fix and a revert.

 Thanks,

Ingo

-->
Sudeep Holla (2):
  Revert "tick: Prefer a lower rating device only if it's CPU local device"
  clocksource: arm_arch_timer: Set arch_mem_timer cpumask to 
cpu_possible_mask


 drivers/clocksource/arm_arch_timer.c | 2 +-
 kernel/time/tick-common.c| 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index 57cb2f00fc07..d8c7f5750cdb 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -735,7 +735,7 @@ static void __arch_timer_setup(unsigned type,
clk->features |= CLOCK_EVT_FEAT_DYNIRQ;
clk->name = "arch_mem_timer";
clk->rating = 400;
-   clk->cpumask = cpu_all_mask;
+   clk->cpumask = cpu_possible_mask;
if (arch_timer_mem_use_virtual) {
clk->set_state_shutdown = arch_timer_shutdown_virt_mem;
clk->set_state_oneshot_stopped = 
arch_timer_shutdown_virt_mem;
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index b7005dd21ec1..14de3727b18e 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -277,8 +277,7 @@ static bool tick_check_preferred(struct clock_event_device 
*curdev,
 */
return !curdev ||
newdev->rating > curdev->rating ||
-  (!cpumask_equal(curdev->cpumask, newdev->cpumask) &&
-   !tick_check_percpu(curdev, newdev, smp_processor_id()));
+  !cpumask_equal(curdev->cpumask, newdev->cpumask);
 }
 
 /*


[GIT pull] timer fixes for 4.17

2018-04-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A small set of timer fixes:

 - Evaluate the -ETIME condition correctly in the imx tpm driver

 - Fix the evaluation order of a condition in posix cpu timers

 - Use pr_cont() in the clockevents code to prevent ugly message splitting

 - Remove __current_kernel_time() which is now unused to prevent that new
   users show up.

 - Remove a stale forward declaration

Thanks,

tglx

-->
Anson Huang (1):
  clocksource/imx-tpm: Correct -ETIME return condition check

Baolin Wang (1):
  timekeeping: Remove __current_kernel_time()

Geert Uytterhoeven (1):
  clockevents: Fix kernel messages split across multiple lines

Laura Abbott (1):
  posix-cpu-timers: Ensure set_process_cpu_timer is always evaluated

Liu, Changcheng (1):
  timers: Remove stale struct tvec_base forward declaration


 drivers/clocksource/timer-imx-tpm.c |  2 +-
 include/linux/timekeeping32.h   |  3 ---
 include/linux/timer.h   |  2 --
 kernel/time/posix-cpu-timers.c  |  4 +++-
 kernel/time/tick-oneshot.c  | 11 +--
 kernel/time/timekeeping.c   |  7 ---
 6 files changed, 9 insertions(+), 20 deletions(-)

diff --git a/drivers/clocksource/timer-imx-tpm.c 
b/drivers/clocksource/timer-imx-tpm.c
index 05d97a6871d8..6c8318470b48 100644
--- a/drivers/clocksource/timer-imx-tpm.c
+++ b/drivers/clocksource/timer-imx-tpm.c
@@ -114,7 +114,7 @@ static int tpm_set_next_event(unsigned long delta,
 * of writing CNT registers which may cause the min_delta event got
 * missed, so we need add a ETIME check here in case it happened.
 */
-   return (int)((next - now) <= 0) ? -ETIME : 0;
+   return (int)(next - now) <= 0 ? -ETIME : 0;
 }
 
 static int tpm_set_state_oneshot(struct clock_event_device *evt)
diff --git a/include/linux/timekeeping32.h b/include/linux/timekeeping32.h
index af4114d5dc17..3616b4becb59 100644
--- a/include/linux/timekeeping32.h
+++ b/include/linux/timekeeping32.h
@@ -9,9 +9,6 @@
 extern void do_gettimeofday(struct timeval *tv);
 unsigned long get_seconds(void);
 
-/* does not take xtime_lock */
-struct timespec __current_kernel_time(void);
-
 static inline struct timespec current_kernel_time(void)
 {
struct timespec64 now = current_kernel_time64();
diff --git a/include/linux/timer.h b/include/linux/timer.h
index 2448f9cc48a3..7b066fd38248 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -8,8 +8,6 @@
 #include 
 #include 
 
-struct tvec_base;
-
 struct timer_list {
/*
 * All fields that change during normal runtime grouped to the
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 2541bd89f20e..5a6251ac6f7a 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -1205,10 +1205,12 @@ void set_process_cpu_timer(struct task_struct *tsk, 
unsigned int clock_idx,
   u64 *newval, u64 *oldval)
 {
u64 now;
+   int ret;
 
WARN_ON_ONCE(clock_idx == CPUCLOCK_SCHED);
+   ret = cpu_timer_sample_group(clock_idx, tsk, );
 
-   if (oldval && cpu_timer_sample_group(clock_idx, tsk, ) != -EINVAL) {
+   if (oldval && ret != -EINVAL) {
/*
 * We are setting itimer. The *oldval is absolute and we update
 * it to be relative, *newval argument is relative and we update
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c
index c1f518e7aa80..6fe615d57ebb 100644
--- a/kernel/time/tick-oneshot.c
+++ b/kernel/time/tick-oneshot.c
@@ -82,16 +82,15 @@ int tick_switch_to_oneshot(void (*handler)(struct 
clock_event_device *))
if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT) ||
!tick_device_is_functional(dev)) {
 
-   printk(KERN_INFO "Clockevents: "
-  "could not switch to one-shot mode:");
+   pr_info("Clockevents: could not switch to one-shot mode:");
if (!dev) {
-   printk(" no tick device\n");
+   pr_cont(" no tick device\n");
} else {
if (!tick_device_is_functional(dev))
-   printk(" %s is not functional.\n", dev->name);
+   pr_cont(" %s is not functional.\n", dev->name);
else
-   printk(" %s does not support one-shot mode.\n",
-  dev->name);
+   pr_cont(" %s does not support one-shot mode.\n",
+   dev->name);
}
return -EINVAL;
}
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index ca90219a1e73..dcf7f20fcd12 100644
--- a/kernel/time/timekeeping.c

[GIT pull] timer fixes for 4.17

2018-04-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A small set of timer fixes:

 - Evaluate the -ETIME condition correctly in the imx tpm driver

 - Fix the evaluation order of a condition in posix cpu timers

 - Use pr_cont() in the clockevents code to prevent ugly message splitting

 - Remove __current_kernel_time() which is now unused to prevent that new
   users show up.

 - Remove a stale forward declaration

Thanks,

tglx

-->
Anson Huang (1):
  clocksource/imx-tpm: Correct -ETIME return condition check

Baolin Wang (1):
  timekeeping: Remove __current_kernel_time()

Geert Uytterhoeven (1):
  clockevents: Fix kernel messages split across multiple lines

Laura Abbott (1):
  posix-cpu-timers: Ensure set_process_cpu_timer is always evaluated

Liu, Changcheng (1):
  timers: Remove stale struct tvec_base forward declaration


 drivers/clocksource/timer-imx-tpm.c |  2 +-
 include/linux/timekeeping32.h   |  3 ---
 include/linux/timer.h   |  2 --
 kernel/time/posix-cpu-timers.c  |  4 +++-
 kernel/time/tick-oneshot.c  | 11 +--
 kernel/time/timekeeping.c   |  7 ---
 6 files changed, 9 insertions(+), 20 deletions(-)

diff --git a/drivers/clocksource/timer-imx-tpm.c 
b/drivers/clocksource/timer-imx-tpm.c
index 05d97a6871d8..6c8318470b48 100644
--- a/drivers/clocksource/timer-imx-tpm.c
+++ b/drivers/clocksource/timer-imx-tpm.c
@@ -114,7 +114,7 @@ static int tpm_set_next_event(unsigned long delta,
 * of writing CNT registers which may cause the min_delta event got
 * missed, so we need add a ETIME check here in case it happened.
 */
-   return (int)((next - now) <= 0) ? -ETIME : 0;
+   return (int)(next - now) <= 0 ? -ETIME : 0;
 }
 
 static int tpm_set_state_oneshot(struct clock_event_device *evt)
diff --git a/include/linux/timekeeping32.h b/include/linux/timekeeping32.h
index af4114d5dc17..3616b4becb59 100644
--- a/include/linux/timekeeping32.h
+++ b/include/linux/timekeeping32.h
@@ -9,9 +9,6 @@
 extern void do_gettimeofday(struct timeval *tv);
 unsigned long get_seconds(void);
 
-/* does not take xtime_lock */
-struct timespec __current_kernel_time(void);
-
 static inline struct timespec current_kernel_time(void)
 {
struct timespec64 now = current_kernel_time64();
diff --git a/include/linux/timer.h b/include/linux/timer.h
index 2448f9cc48a3..7b066fd38248 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -8,8 +8,6 @@
 #include 
 #include 
 
-struct tvec_base;
-
 struct timer_list {
/*
 * All fields that change during normal runtime grouped to the
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 2541bd89f20e..5a6251ac6f7a 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -1205,10 +1205,12 @@ void set_process_cpu_timer(struct task_struct *tsk, 
unsigned int clock_idx,
   u64 *newval, u64 *oldval)
 {
u64 now;
+   int ret;
 
WARN_ON_ONCE(clock_idx == CPUCLOCK_SCHED);
+   ret = cpu_timer_sample_group(clock_idx, tsk, );
 
-   if (oldval && cpu_timer_sample_group(clock_idx, tsk, ) != -EINVAL) {
+   if (oldval && ret != -EINVAL) {
/*
 * We are setting itimer. The *oldval is absolute and we update
 * it to be relative, *newval argument is relative and we update
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c
index c1f518e7aa80..6fe615d57ebb 100644
--- a/kernel/time/tick-oneshot.c
+++ b/kernel/time/tick-oneshot.c
@@ -82,16 +82,15 @@ int tick_switch_to_oneshot(void (*handler)(struct 
clock_event_device *))
if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT) ||
!tick_device_is_functional(dev)) {
 
-   printk(KERN_INFO "Clockevents: "
-  "could not switch to one-shot mode:");
+   pr_info("Clockevents: could not switch to one-shot mode:");
if (!dev) {
-   printk(" no tick device\n");
+   pr_cont(" no tick device\n");
} else {
if (!tick_device_is_functional(dev))
-   printk(" %s is not functional.\n", dev->name);
+   pr_cont(" %s is not functional.\n", dev->name);
else
-   printk(" %s does not support one-shot mode.\n",
-  dev->name);
+   pr_cont(" %s does not support one-shot mode.\n",
+   dev->name);
}
return -EINVAL;
}
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index ca90219a1e73..dcf7f20fcd12 100644
--- a/kernel/time/timekeeping.c

[GIT pull] timer fixes for 4.16

2018-03-04 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A small set of fixes from the timer departement:

 - Add a missing timer wheel clock forward when migrating timers off a
   unplugged CPU to prevent operating on a stale clock base and missing
   timer deadlines.

 - Use the proper shift count to extract data from a register value to
   prevent evaluating unrelated bits

 - Make the error return check in the FSL timer driver work
   correctly. Checking an unsigned variable for less than zero does not
   really work well.

 - Clarify the confusing comments in the ARC timer code.

Thanks,

tglx

-->
Colin Ian King (1):
  clocksource/drivers/fsl_ftm_timer: Fix error return checking

Felix Fietkau (1):
  clocksource/drivers/mips-gic-timer: Use correct shift count to extract 
data

Lingutla Chandrasekhar (1):
  timers: Forward timer base before migrating timers

Vineet Gupta (1):
  clocksource/drivers/arc_timer: Update some comments


 drivers/clocksource/arc_timer.c  | 11 ---
 drivers/clocksource/fsl_ftm_timer.c  |  2 +-
 drivers/clocksource/mips-gic-timer.c |  2 +-
 kernel/time/timer.c  |  6 ++
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/clocksource/arc_timer.c b/drivers/clocksource/arc_timer.c
index 4927355f9cbe..471b428d8034 100644
--- a/drivers/clocksource/arc_timer.c
+++ b/drivers/clocksource/arc_timer.c
@@ -251,9 +251,14 @@ static irqreturn_t timer_irq_handler(int irq, void *dev_id)
int irq_reenable = clockevent_state_periodic(evt);
 
/*
-* Any write to CTRL reg ACks the interrupt, we rewrite the
-* Count when [N]ot [H]alted bit.
-* And re-arm it if perioid by [I]nterrupt [E]nable bit
+* 1. ACK the interrupt
+*- For ARC700, any write to CTRL reg ACKs it, so just rewrite
+*  Count when [N]ot [H]alted bit.
+*- For HS3x, it is a bit subtle. On taken count-down interrupt,
+*  IP bit [3] is set, which needs to be cleared for ACK'ing.
+*  The write below can only update the other two bits, hence
+*  explicitly clears IP bit
+* 2. Re-arm interrupt if periodic by writing to IE bit [0]
 */
write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH);
 
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index 3ee7e6fea621..846d18daf893 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -281,7 +281,7 @@ static int __init __ftm_clk_init(struct device_node *np, 
char *cnt_name,
 
 static unsigned long __init ftm_clk_init(struct device_node *np)
 {
-   unsigned long freq;
+   long freq;
 
freq = __ftm_clk_init(np, "ftm-evt-counter-en", "ftm-evt");
if (freq <= 0)
diff --git a/drivers/clocksource/mips-gic-timer.c 
b/drivers/clocksource/mips-gic-timer.c
index 65e18c86d9b9..986b6796b631 100644
--- a/drivers/clocksource/mips-gic-timer.c
+++ b/drivers/clocksource/mips-gic-timer.c
@@ -166,7 +166,7 @@ static int __init __gic_clocksource_init(void)
 
/* Set clocksource mask. */
count_width = read_gic_config() & GIC_CONFIG_COUNTBITS;
-   count_width >>= __fls(GIC_CONFIG_COUNTBITS);
+   count_width >>= __ffs(GIC_CONFIG_COUNTBITS);
count_width *= 4;
count_width += 32;
gic_clocksource.mask = CLOCKSOURCE_MASK(count_width);
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 48150ab42de9..4a4fd567fb26 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1894,6 +1894,12 @@ int timers_dead_cpu(unsigned int cpu)
raw_spin_lock_irq(_base->lock);
raw_spin_lock_nested(_base->lock, SINGLE_DEPTH_NESTING);
 
+   /*
+* The current CPUs base clock might be stale. Update it
+* before moving the timers over.
+*/
+   forward_timer_base(new_base);
+
BUG_ON(old_base->running_timer);
 
for (i = 0; i < WHEEL_SIZE; i++)


[GIT pull] timer fixes for 4.16

2018-03-04 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A small set of fixes from the timer departement:

 - Add a missing timer wheel clock forward when migrating timers off a
   unplugged CPU to prevent operating on a stale clock base and missing
   timer deadlines.

 - Use the proper shift count to extract data from a register value to
   prevent evaluating unrelated bits

 - Make the error return check in the FSL timer driver work
   correctly. Checking an unsigned variable for less than zero does not
   really work well.

 - Clarify the confusing comments in the ARC timer code.

Thanks,

tglx

-->
Colin Ian King (1):
  clocksource/drivers/fsl_ftm_timer: Fix error return checking

Felix Fietkau (1):
  clocksource/drivers/mips-gic-timer: Use correct shift count to extract 
data

Lingutla Chandrasekhar (1):
  timers: Forward timer base before migrating timers

Vineet Gupta (1):
  clocksource/drivers/arc_timer: Update some comments


 drivers/clocksource/arc_timer.c  | 11 ---
 drivers/clocksource/fsl_ftm_timer.c  |  2 +-
 drivers/clocksource/mips-gic-timer.c |  2 +-
 kernel/time/timer.c  |  6 ++
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/clocksource/arc_timer.c b/drivers/clocksource/arc_timer.c
index 4927355f9cbe..471b428d8034 100644
--- a/drivers/clocksource/arc_timer.c
+++ b/drivers/clocksource/arc_timer.c
@@ -251,9 +251,14 @@ static irqreturn_t timer_irq_handler(int irq, void *dev_id)
int irq_reenable = clockevent_state_periodic(evt);
 
/*
-* Any write to CTRL reg ACks the interrupt, we rewrite the
-* Count when [N]ot [H]alted bit.
-* And re-arm it if perioid by [I]nterrupt [E]nable bit
+* 1. ACK the interrupt
+*- For ARC700, any write to CTRL reg ACKs it, so just rewrite
+*  Count when [N]ot [H]alted bit.
+*- For HS3x, it is a bit subtle. On taken count-down interrupt,
+*  IP bit [3] is set, which needs to be cleared for ACK'ing.
+*  The write below can only update the other two bits, hence
+*  explicitly clears IP bit
+* 2. Re-arm interrupt if periodic by writing to IE bit [0]
 */
write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH);
 
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index 3ee7e6fea621..846d18daf893 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -281,7 +281,7 @@ static int __init __ftm_clk_init(struct device_node *np, 
char *cnt_name,
 
 static unsigned long __init ftm_clk_init(struct device_node *np)
 {
-   unsigned long freq;
+   long freq;
 
freq = __ftm_clk_init(np, "ftm-evt-counter-en", "ftm-evt");
if (freq <= 0)
diff --git a/drivers/clocksource/mips-gic-timer.c 
b/drivers/clocksource/mips-gic-timer.c
index 65e18c86d9b9..986b6796b631 100644
--- a/drivers/clocksource/mips-gic-timer.c
+++ b/drivers/clocksource/mips-gic-timer.c
@@ -166,7 +166,7 @@ static int __init __gic_clocksource_init(void)
 
/* Set clocksource mask. */
count_width = read_gic_config() & GIC_CONFIG_COUNTBITS;
-   count_width >>= __fls(GIC_CONFIG_COUNTBITS);
+   count_width >>= __ffs(GIC_CONFIG_COUNTBITS);
count_width *= 4;
count_width += 32;
gic_clocksource.mask = CLOCKSOURCE_MASK(count_width);
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 48150ab42de9..4a4fd567fb26 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1894,6 +1894,12 @@ int timers_dead_cpu(unsigned int cpu)
raw_spin_lock_irq(_base->lock);
raw_spin_lock_nested(_base->lock, SINGLE_DEPTH_NESTING);
 
+   /*
+* The current CPUs base clock might be stale. Update it
+* before moving the timers over.
+*/
+   forward_timer_base(new_base);
+
BUG_ON(old_base->running_timer);
 
for (i = 0; i < WHEEL_SIZE; i++)


[GIT pull] timer fixes for 4.15

2017-12-31 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A pile of fixes for long standing issues with the timer wheel and the NOHZ
code:

  - Prevent timer base confusion accross the nohz switch, which can cause
unlocked access and data corruption

  - Reinitialize the stale base clock on cpu hotplug to prevent subtle
side effects including rollovers on 32bit

  - Prevent an interrupt storm when the timer softirq is already pending
caused by tick_nohz_stop_sched_tick()

  - Move the timer start tracepoint to a place where it actually makes sense
  
  - Add documentation to timerqueue functions as they caused confusion
several times now.

Thanks,

tglx

-->
Anna-Maria Gleixner (1):
  timers: Use deferrable base independent of base::nohz_active

Thomas Gleixner (4):
  timers: Reinitialize per cpu bases on hotplug
  nohz: Prevent a timer interrupt storm in tick_nohz_stop_sched_tick()
  timers: Invoke timer_start_debug() where it makes sense
  timerqueue: Document return values of timerqueue_add/del()


 include/linux/cpuhotplug.h |  2 +-
 include/linux/timer.h  |  4 +++-
 kernel/cpu.c   |  4 ++--
 kernel/time/tick-sched.c   | 19 +--
 kernel/time/timer.c| 35 ---
 lib/timerqueue.c   |  8 +---
 6 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 201ab7267986..1a32e558eb11 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -86,7 +86,7 @@ enum cpuhp_state {
CPUHP_MM_ZSWP_POOL_PREPARE,
CPUHP_KVM_PPC_BOOK3S_PREPARE,
CPUHP_ZCOMP_PREPARE,
-   CPUHP_TIMERS_DEAD,
+   CPUHP_TIMERS_PREPARE,
CPUHP_MIPS_SOC_PREPARE,
CPUHP_BP_PREPARE_DYN,
CPUHP_BP_PREPARE_DYN_END= CPUHP_BP_PREPARE_DYN + 20,
diff --git a/include/linux/timer.h b/include/linux/timer.h
index 04af640ea95b..2448f9cc48a3 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -207,9 +207,11 @@ unsigned long round_jiffies_up(unsigned long j);
 unsigned long round_jiffies_up_relative(unsigned long j);
 
 #ifdef CONFIG_HOTPLUG_CPU
+int timers_prepare_cpu(unsigned int cpu);
 int timers_dead_cpu(unsigned int cpu);
 #else
-#define timers_dead_cpu NULL
+#define timers_prepare_cpu NULL
+#define timers_dead_cpuNULL
 #endif
 
 #endif
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 41376c3ac93b..97858477e586 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1277,9 +1277,9 @@ static struct cpuhp_step cpuhp_bp_states[] = {
 * before blk_mq_queue_reinit_notify() from notify_dead(),
 * otherwise a RCU stall occurs.
 */
-   [CPUHP_TIMERS_DEAD] = {
+   [CPUHP_TIMERS_PREPARE] = {
.name   = "timers:dead",
-   .startup.single = NULL,
+   .startup.single = timers_prepare_cpu,
.teardown.single= timers_dead_cpu,
},
/* Kicks the plugged cpu into life */
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 77555faf6fbc..f7cc7abfcf25 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -650,6 +650,11 @@ static void tick_nohz_restart(struct tick_sched *ts, 
ktime_t now)
ts->next_tick = 0;
 }
 
+static inline bool local_timer_softirq_pending(void)
+{
+   return local_softirq_pending() & TIMER_SOFTIRQ;
+}
+
 static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
 ktime_t now, int cpu)
 {
@@ -666,8 +671,18 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched 
*ts,
} while (read_seqretry(_lock, seq));
ts->last_jiffies = basejiff;
 
-   if (rcu_needs_cpu(basemono, _rcu) ||
-   arch_needs_cpu() || irq_work_needs_cpu()) {
+   /*
+* Keep the periodic tick, when RCU, architecture or irq_work
+* requests it.
+* Aside of that check whether the local timer softirq is
+* pending. If so its a bad idea to call get_next_timer_interrupt()
+* because there is an already expired timer, so it will request
+* immeditate expiry, which rearms the hardware timer with a
+* minimal delta which brings us back to this place
+* immediately. Lather, rinse and repeat...
+*/
+   if (rcu_needs_cpu(basemono, _rcu) || arch_needs_cpu() ||
+   irq_work_needs_cpu() || local_timer_softirq_pending()) {
next_tick = basemono + TICK_NSEC;
} else {
/*
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index ffebcf878fba..89a9e1b4264a 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -823,11 +823,10 @@ static inline struct timer_base *get_timer_cpu_base(u32 
tflags, u32 cpu)

[GIT pull] timer fixes for 4.15

2017-12-31 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A pile of fixes for long standing issues with the timer wheel and the NOHZ
code:

  - Prevent timer base confusion accross the nohz switch, which can cause
unlocked access and data corruption

  - Reinitialize the stale base clock on cpu hotplug to prevent subtle
side effects including rollovers on 32bit

  - Prevent an interrupt storm when the timer softirq is already pending
caused by tick_nohz_stop_sched_tick()

  - Move the timer start tracepoint to a place where it actually makes sense
  
  - Add documentation to timerqueue functions as they caused confusion
several times now.

Thanks,

tglx

-->
Anna-Maria Gleixner (1):
  timers: Use deferrable base independent of base::nohz_active

Thomas Gleixner (4):
  timers: Reinitialize per cpu bases on hotplug
  nohz: Prevent a timer interrupt storm in tick_nohz_stop_sched_tick()
  timers: Invoke timer_start_debug() where it makes sense
  timerqueue: Document return values of timerqueue_add/del()


 include/linux/cpuhotplug.h |  2 +-
 include/linux/timer.h  |  4 +++-
 kernel/cpu.c   |  4 ++--
 kernel/time/tick-sched.c   | 19 +--
 kernel/time/timer.c| 35 ---
 lib/timerqueue.c   |  8 +---
 6 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 201ab7267986..1a32e558eb11 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -86,7 +86,7 @@ enum cpuhp_state {
CPUHP_MM_ZSWP_POOL_PREPARE,
CPUHP_KVM_PPC_BOOK3S_PREPARE,
CPUHP_ZCOMP_PREPARE,
-   CPUHP_TIMERS_DEAD,
+   CPUHP_TIMERS_PREPARE,
CPUHP_MIPS_SOC_PREPARE,
CPUHP_BP_PREPARE_DYN,
CPUHP_BP_PREPARE_DYN_END= CPUHP_BP_PREPARE_DYN + 20,
diff --git a/include/linux/timer.h b/include/linux/timer.h
index 04af640ea95b..2448f9cc48a3 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -207,9 +207,11 @@ unsigned long round_jiffies_up(unsigned long j);
 unsigned long round_jiffies_up_relative(unsigned long j);
 
 #ifdef CONFIG_HOTPLUG_CPU
+int timers_prepare_cpu(unsigned int cpu);
 int timers_dead_cpu(unsigned int cpu);
 #else
-#define timers_dead_cpu NULL
+#define timers_prepare_cpu NULL
+#define timers_dead_cpuNULL
 #endif
 
 #endif
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 41376c3ac93b..97858477e586 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1277,9 +1277,9 @@ static struct cpuhp_step cpuhp_bp_states[] = {
 * before blk_mq_queue_reinit_notify() from notify_dead(),
 * otherwise a RCU stall occurs.
 */
-   [CPUHP_TIMERS_DEAD] = {
+   [CPUHP_TIMERS_PREPARE] = {
.name   = "timers:dead",
-   .startup.single = NULL,
+   .startup.single = timers_prepare_cpu,
.teardown.single= timers_dead_cpu,
},
/* Kicks the plugged cpu into life */
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 77555faf6fbc..f7cc7abfcf25 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -650,6 +650,11 @@ static void tick_nohz_restart(struct tick_sched *ts, 
ktime_t now)
ts->next_tick = 0;
 }
 
+static inline bool local_timer_softirq_pending(void)
+{
+   return local_softirq_pending() & TIMER_SOFTIRQ;
+}
+
 static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
 ktime_t now, int cpu)
 {
@@ -666,8 +671,18 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched 
*ts,
} while (read_seqretry(_lock, seq));
ts->last_jiffies = basejiff;
 
-   if (rcu_needs_cpu(basemono, _rcu) ||
-   arch_needs_cpu() || irq_work_needs_cpu()) {
+   /*
+* Keep the periodic tick, when RCU, architecture or irq_work
+* requests it.
+* Aside of that check whether the local timer softirq is
+* pending. If so its a bad idea to call get_next_timer_interrupt()
+* because there is an already expired timer, so it will request
+* immeditate expiry, which rearms the hardware timer with a
+* minimal delta which brings us back to this place
+* immediately. Lather, rinse and repeat...
+*/
+   if (rcu_needs_cpu(basemono, _rcu) || arch_needs_cpu() ||
+   irq_work_needs_cpu() || local_timer_softirq_pending()) {
next_tick = basemono + TICK_NSEC;
} else {
/*
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index ffebcf878fba..89a9e1b4264a 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -823,11 +823,10 @@ static inline struct timer_base *get_timer_cpu_base(u32 
tflags, u32 cpu)

[GIT pull] timer fixes for 4.13

2017-08-20 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few small fixes for timer drivers:

 - Prevent infinite recursion in the arm architected timer driver with
   ftrace

 - Propagate error codes to the caller in case of failure in EM STI driver

 - Adjust a bogus loop iteration in the arm architected timer driver

 - Add a missing Kconfig dependency to the pistachio clocksource to prevent
   build failures

 - Correctly check for IS_ERR() instead of NULL in the shared timer-of
   code,

Thanks,

tglx

-->
Dan Carpenter (1):
  clocksource/drivers/timer-of: Checking for IS_ERR() instead of NULL

Ding Tianhong (1):
  clocksource/drivers/arm_arch_timer: Avoid infinite recursion when ftrace 
is enabled

Gustavo A. R. Silva (1):
  clocksource/drivers/em_sti: Fix error return codes in em_sti_probe()

Matt Redfearn (1):
  clocksource/drivers/Kconfig: Fix CLKSRC_PISTACHIO dependencies

Matthias Kaehlcke (1):
  clocksource/drivers/arm_arch_timer: Fix mem frame loop initialization


 arch/arm64/include/asm/arch_timer.h  |  4 ++--
 drivers/clocksource/Kconfig  |  2 +-
 drivers/clocksource/arm_arch_timer.c |  2 +-
 drivers/clocksource/em_sti.c | 11 ++-
 drivers/clocksource/timer-of.c   |  4 ++--
 5 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/arch/arm64/include/asm/arch_timer.h 
b/arch/arm64/include/asm/arch_timer.h
index 74d08e44a651..a652ce0a5cb2 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -65,13 +65,13 @@ DECLARE_PER_CPU(const struct arch_timer_erratum_workaround 
*,
u64 _val;   \
if (needs_unstable_timer_counter_workaround()) {\
const struct arch_timer_erratum_workaround *wa; \
-   preempt_disable();  \
+   preempt_disable_notrace();  \
wa = __this_cpu_read(timer_unstable_counter_workaround); \
if (wa && wa->read_##reg)   \
_val = wa->read_##reg();\
else\
_val = read_sysreg(reg);\
-   preempt_enable();   \
+   preempt_enable_notrace();   \
} else {\
_val = read_sysreg(reg);\
}   \
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index fcae5ca6ac92..54a67f8a28eb 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -262,7 +262,7 @@ config CLKSRC_LPC32XX
 
 config CLKSRC_PISTACHIO
bool "Clocksource for Pistachio SoC" if COMPILE_TEST
-   depends on HAS_IOMEM
+   depends on GENERIC_CLOCKEVENTS && HAS_IOMEM
select TIMER_OF
help
  Enables the clocksource for the Pistachio SoC.
diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index aae87c4c546e..72bbfccef113 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -1440,7 +1440,7 @@ static int __init arch_timer_mem_acpi_init(int 
platform_timer_count)
 * While unlikely, it's theoretically possible that none of the frames
 * in a timer expose the combination of feature we want.
 */
-   for (i = i; i < timer_count; i++) {
+   for (i = 0; i < timer_count; i++) {
timer = [i];
 
frame = arch_timer_mem_find_best_frame(timer);
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c
index bc48cbf6a795..269db74a0658 100644
--- a/drivers/clocksource/em_sti.c
+++ b/drivers/clocksource/em_sti.c
@@ -305,7 +305,7 @@ static int em_sti_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
dev_err(>dev, "failed to get irq\n");
-   return -EINVAL;
+   return irq;
}
 
/* map memory, let base point to the STI instance */
@@ -314,11 +314,12 @@ static int em_sti_probe(struct platform_device *pdev)
if (IS_ERR(p->base))
return PTR_ERR(p->base);
 
-   if (devm_request_irq(>dev, irq, em_sti_interrupt,
-IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
-dev_name(>dev), p)) {
+   ret = devm_request_irq(>dev, irq, em_sti_interrupt,
+  IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
+  dev_name(>dev), p);

[GIT pull] timer fixes for 4.13

2017-08-20 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few small fixes for timer drivers:

 - Prevent infinite recursion in the arm architected timer driver with
   ftrace

 - Propagate error codes to the caller in case of failure in EM STI driver

 - Adjust a bogus loop iteration in the arm architected timer driver

 - Add a missing Kconfig dependency to the pistachio clocksource to prevent
   build failures

 - Correctly check for IS_ERR() instead of NULL in the shared timer-of
   code,

Thanks,

tglx

-->
Dan Carpenter (1):
  clocksource/drivers/timer-of: Checking for IS_ERR() instead of NULL

Ding Tianhong (1):
  clocksource/drivers/arm_arch_timer: Avoid infinite recursion when ftrace 
is enabled

Gustavo A. R. Silva (1):
  clocksource/drivers/em_sti: Fix error return codes in em_sti_probe()

Matt Redfearn (1):
  clocksource/drivers/Kconfig: Fix CLKSRC_PISTACHIO dependencies

Matthias Kaehlcke (1):
  clocksource/drivers/arm_arch_timer: Fix mem frame loop initialization


 arch/arm64/include/asm/arch_timer.h  |  4 ++--
 drivers/clocksource/Kconfig  |  2 +-
 drivers/clocksource/arm_arch_timer.c |  2 +-
 drivers/clocksource/em_sti.c | 11 ++-
 drivers/clocksource/timer-of.c   |  4 ++--
 5 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/arch/arm64/include/asm/arch_timer.h 
b/arch/arm64/include/asm/arch_timer.h
index 74d08e44a651..a652ce0a5cb2 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -65,13 +65,13 @@ DECLARE_PER_CPU(const struct arch_timer_erratum_workaround 
*,
u64 _val;   \
if (needs_unstable_timer_counter_workaround()) {\
const struct arch_timer_erratum_workaround *wa; \
-   preempt_disable();  \
+   preempt_disable_notrace();  \
wa = __this_cpu_read(timer_unstable_counter_workaround); \
if (wa && wa->read_##reg)   \
_val = wa->read_##reg();\
else\
_val = read_sysreg(reg);\
-   preempt_enable();   \
+   preempt_enable_notrace();   \
} else {\
_val = read_sysreg(reg);\
}   \
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index fcae5ca6ac92..54a67f8a28eb 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -262,7 +262,7 @@ config CLKSRC_LPC32XX
 
 config CLKSRC_PISTACHIO
bool "Clocksource for Pistachio SoC" if COMPILE_TEST
-   depends on HAS_IOMEM
+   depends on GENERIC_CLOCKEVENTS && HAS_IOMEM
select TIMER_OF
help
  Enables the clocksource for the Pistachio SoC.
diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index aae87c4c546e..72bbfccef113 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -1440,7 +1440,7 @@ static int __init arch_timer_mem_acpi_init(int 
platform_timer_count)
 * While unlikely, it's theoretically possible that none of the frames
 * in a timer expose the combination of feature we want.
 */
-   for (i = i; i < timer_count; i++) {
+   for (i = 0; i < timer_count; i++) {
timer = [i];
 
frame = arch_timer_mem_find_best_frame(timer);
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c
index bc48cbf6a795..269db74a0658 100644
--- a/drivers/clocksource/em_sti.c
+++ b/drivers/clocksource/em_sti.c
@@ -305,7 +305,7 @@ static int em_sti_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
dev_err(>dev, "failed to get irq\n");
-   return -EINVAL;
+   return irq;
}
 
/* map memory, let base point to the STI instance */
@@ -314,11 +314,12 @@ static int em_sti_probe(struct platform_device *pdev)
if (IS_ERR(p->base))
return PTR_ERR(p->base);
 
-   if (devm_request_irq(>dev, irq, em_sti_interrupt,
-IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
-dev_name(>dev), p)) {
+   ret = devm_request_irq(>dev, irq, em_sti_interrupt,
+  IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
+  dev_name(>dev), p);

[GIT pull] timer fixes for 4.12

2017-06-25 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few fixes for timekeeping and timers:

  - Plug a subtle race due to a missing READ_ONCE() in the timekeeping code
where reloading of a pointer results in an inconsistent callback
argument being supplied to the clocksource->read function.

  - Correct the CLOCK_MONOTONIC_RAW sub-nanosecond accounting in the time
keeping core code, to prevent a possible discontuity.

  - Apply a similar fix to the arm64 vdso clock_gettime() implementation

  - Add missing includes to clocksource drivers, which relied on indirect
includes which fails in certain configs.

  - Use the proper iomem pointer for read/iounmap in a probe function.

Thanks,

tglx

-->
Frank Rowand (1):
  clocksource/drivers/arm_arch_timer: Fix read and iounmap of incorrect 
variable

John Stultz (2):
  time: Fix clock->read(clock) race around clocksource changes
  time: Fix CLOCK_MONOTONIC_RAW sub-nanosecond accounting

Stephen Rothwell (1):
  clocksource: Explicitly include linux/clocksource.h when needed

Will Deacon (1):
  arm64/vdso: Fix nsec handling for CLOCK_MONOTONIC_RAW


 arch/arm64/kernel/vdso.c|  5 ++-
 arch/arm64/kernel/vdso/gettimeofday.S   |  1 -
 drivers/clocksource/arm_arch_timer.c|  4 +-
 drivers/clocksource/cadence_ttc_timer.c |  1 +
 drivers/clocksource/timer-sun5i.c   |  1 +
 include/linux/timekeeper_internal.h |  5 +--
 kernel/time/timekeeping.c   | 71 +
 7 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index 41b6e31f8f55..d0cb007fa482 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -221,10 +221,11 @@ void update_vsyscall(struct timekeeper *tk)
/* tkr_mono.cycle_last == tkr_raw.cycle_last */
vdso_data->cs_cycle_last= tk->tkr_mono.cycle_last;
vdso_data->raw_time_sec = tk->raw_time.tv_sec;
-   vdso_data->raw_time_nsec= tk->raw_time.tv_nsec;
+   vdso_data->raw_time_nsec= (tk->raw_time.tv_nsec <<
+  tk->tkr_raw.shift) +
+ tk->tkr_raw.xtime_nsec;
vdso_data->xtime_clock_sec  = tk->xtime_sec;
vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec;
-   /* tkr_raw.xtime_nsec == 0 */
vdso_data->cs_mono_mult = tk->tkr_mono.mult;
vdso_data->cs_raw_mult  = tk->tkr_raw.mult;
/* tkr_mono.shift == tkr_raw.shift */
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S 
b/arch/arm64/kernel/vdso/gettimeofday.S
index e00b4671bd7c..76320e920965 100644
--- a/arch/arm64/kernel/vdso/gettimeofday.S
+++ b/arch/arm64/kernel/vdso/gettimeofday.S
@@ -256,7 +256,6 @@ monotonic_raw:
seqcnt_check fail=monotonic_raw
 
/* All computations are done with left-shifted nsecs. */
-   lsl x14, x14, x12
get_nsec_per_sec res=x9
lsl x9, x9, x12
 
diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index 4bed671e490e..8b5c30062d99 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -1209,9 +1209,9 @@ arch_timer_mem_frame_get_cntfrq(struct 
arch_timer_mem_frame *frame)
return 0;
}
 
-   rate = readl_relaxed(frame + CNTFRQ);
+   rate = readl_relaxed(base + CNTFRQ);
 
-   iounmap(frame);
+   iounmap(base);
 
return rate;
 }
diff --git a/drivers/clocksource/cadence_ttc_timer.c 
b/drivers/clocksource/cadence_ttc_timer.c
index 44e5e951583b..8e64b8460f11 100644
--- a/drivers/clocksource/cadence_ttc_timer.c
+++ b/drivers/clocksource/cadence_ttc_timer.c
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 2e9c830ae1cd..c4656c4d44a6 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -12,6 +12,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/include/linux/timekeeper_internal.h 
b/include/linux/timekeeper_internal.h
index 110f4532188c..f7043ccca81c 100644
--- a/include/linux/timekeeper_internal.h
+++ b/include/linux/timekeeper_internal.h
@@ -29,7 +29,6 @@
  */
 struct tk_read_base {
struct clocksource  *clock;
-   u64 (*read)(struct clocksource *cs);
u64 mask;
u64 cycle_last;
u32 mult;
@@ -58,7 +57,7 @@ struct tk_read_base {
  * interval.
  * @xtime_remainder:   Shifted nano seconds left 

[GIT pull] timer fixes for 4.12

2017-06-25 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few fixes for timekeeping and timers:

  - Plug a subtle race due to a missing READ_ONCE() in the timekeeping code
where reloading of a pointer results in an inconsistent callback
argument being supplied to the clocksource->read function.

  - Correct the CLOCK_MONOTONIC_RAW sub-nanosecond accounting in the time
keeping core code, to prevent a possible discontuity.

  - Apply a similar fix to the arm64 vdso clock_gettime() implementation

  - Add missing includes to clocksource drivers, which relied on indirect
includes which fails in certain configs.

  - Use the proper iomem pointer for read/iounmap in a probe function.

Thanks,

tglx

-->
Frank Rowand (1):
  clocksource/drivers/arm_arch_timer: Fix read and iounmap of incorrect 
variable

John Stultz (2):
  time: Fix clock->read(clock) race around clocksource changes
  time: Fix CLOCK_MONOTONIC_RAW sub-nanosecond accounting

Stephen Rothwell (1):
  clocksource: Explicitly include linux/clocksource.h when needed

Will Deacon (1):
  arm64/vdso: Fix nsec handling for CLOCK_MONOTONIC_RAW


 arch/arm64/kernel/vdso.c|  5 ++-
 arch/arm64/kernel/vdso/gettimeofday.S   |  1 -
 drivers/clocksource/arm_arch_timer.c|  4 +-
 drivers/clocksource/cadence_ttc_timer.c |  1 +
 drivers/clocksource/timer-sun5i.c   |  1 +
 include/linux/timekeeper_internal.h |  5 +--
 kernel/time/timekeeping.c   | 71 +
 7 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index 41b6e31f8f55..d0cb007fa482 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -221,10 +221,11 @@ void update_vsyscall(struct timekeeper *tk)
/* tkr_mono.cycle_last == tkr_raw.cycle_last */
vdso_data->cs_cycle_last= tk->tkr_mono.cycle_last;
vdso_data->raw_time_sec = tk->raw_time.tv_sec;
-   vdso_data->raw_time_nsec= tk->raw_time.tv_nsec;
+   vdso_data->raw_time_nsec= (tk->raw_time.tv_nsec <<
+  tk->tkr_raw.shift) +
+ tk->tkr_raw.xtime_nsec;
vdso_data->xtime_clock_sec  = tk->xtime_sec;
vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec;
-   /* tkr_raw.xtime_nsec == 0 */
vdso_data->cs_mono_mult = tk->tkr_mono.mult;
vdso_data->cs_raw_mult  = tk->tkr_raw.mult;
/* tkr_mono.shift == tkr_raw.shift */
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S 
b/arch/arm64/kernel/vdso/gettimeofday.S
index e00b4671bd7c..76320e920965 100644
--- a/arch/arm64/kernel/vdso/gettimeofday.S
+++ b/arch/arm64/kernel/vdso/gettimeofday.S
@@ -256,7 +256,6 @@ monotonic_raw:
seqcnt_check fail=monotonic_raw
 
/* All computations are done with left-shifted nsecs. */
-   lsl x14, x14, x12
get_nsec_per_sec res=x9
lsl x9, x9, x12
 
diff --git a/drivers/clocksource/arm_arch_timer.c 
b/drivers/clocksource/arm_arch_timer.c
index 4bed671e490e..8b5c30062d99 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -1209,9 +1209,9 @@ arch_timer_mem_frame_get_cntfrq(struct 
arch_timer_mem_frame *frame)
return 0;
}
 
-   rate = readl_relaxed(frame + CNTFRQ);
+   rate = readl_relaxed(base + CNTFRQ);
 
-   iounmap(frame);
+   iounmap(base);
 
return rate;
 }
diff --git a/drivers/clocksource/cadence_ttc_timer.c 
b/drivers/clocksource/cadence_ttc_timer.c
index 44e5e951583b..8e64b8460f11 100644
--- a/drivers/clocksource/cadence_ttc_timer.c
+++ b/drivers/clocksource/cadence_ttc_timer.c
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 2e9c830ae1cd..c4656c4d44a6 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -12,6 +12,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/include/linux/timekeeper_internal.h 
b/include/linux/timekeeper_internal.h
index 110f4532188c..f7043ccca81c 100644
--- a/include/linux/timekeeper_internal.h
+++ b/include/linux/timekeeper_internal.h
@@ -29,7 +29,6 @@
  */
 struct tk_read_base {
struct clocksource  *clock;
-   u64 (*read)(struct clocksource *cs);
u64 mask;
u64 cycle_last;
u32 mult;
@@ -58,7 +57,7 @@ struct tk_read_base {
  * interval.
  * @xtime_remainder:   Shifted nano seconds left 

[GIT pull] timer fixes for 4.12

2017-06-18 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Three fixlets for timers:

  - Two hot-fixes for the alarmtimer based posix timers, which prevent
a nasty DOS by self rescheduling timers. The proper cleanup of that
mess is queued for 4.13

  - Make a function static

Thanks,

tglx

-->
Stephen Boyd (1):
  tick/broadcast: Make tick_broadcast_setup_oneshot() static

Thomas Gleixner (2):
  alarmtimer: Prevent overflow of relative timers
  alarmtimer: Rate limit periodic intervals


 kernel/time/alarmtimer.c | 14 +++---
 kernel/time/tick-broadcast.c |  4 +++-
 kernel/time/tick-internal.h  |  2 --
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 5cb5b0008d97..ee2f4202d82a 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -387,7 +387,7 @@ void alarm_start_relative(struct alarm *alarm, ktime_t 
start)
 {
struct alarm_base *base = _bases[alarm->type];
 
-   start = ktime_add(start, base->gettime());
+   start = ktime_add_safe(start, base->gettime());
alarm_start(alarm, start);
 }
 EXPORT_SYMBOL_GPL(alarm_start_relative);
@@ -475,7 +475,7 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t 
interval)
overrun++;
}
 
-   alarm->node.expires = ktime_add(alarm->node.expires, interval);
+   alarm->node.expires = ktime_add_safe(alarm->node.expires, interval);
return overrun;
 }
 EXPORT_SYMBOL_GPL(alarm_forward);
@@ -660,13 +660,21 @@ static int alarm_timer_set(struct k_itimer *timr, int 
flags,
 
/* start the timer */
timr->it.alarm.interval = timespec64_to_ktime(new_setting->it_interval);
+
+   /*
+* Rate limit to the tick as a hot fix to prevent DOS. Will be
+* mopped up later.
+*/
+   if (timr->it.alarm.interval < TICK_NSEC)
+   timr->it.alarm.interval = TICK_NSEC;
+
exp = timespec64_to_ktime(new_setting->it_value);
/* Convert (if necessary) to absolute time */
if (flags != TIMER_ABSTIME) {
ktime_t now;
 
now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime();
-   exp = ktime_add(now, exp);
+   exp = ktime_add_safe(now, exp);
}
 
alarm_start(>it.alarm.alarmtimer, exp);
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 987e496bb51a..b398c2ea69b2 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -37,9 +37,11 @@ static int tick_broadcast_forced;
 static __cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(tick_broadcast_lock);
 
 #ifdef CONFIG_TICK_ONESHOT
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
 static void tick_broadcast_clear_oneshot(int cpu);
 static void tick_resume_broadcast_oneshot(struct clock_event_device *bc);
 #else
+static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 
{ BUG(); }
 static inline void tick_broadcast_clear_oneshot(int cpu) { }
 static inline void tick_resume_broadcast_oneshot(struct clock_event_device 
*bc) { }
 #endif
@@ -867,7 +869,7 @@ static void tick_broadcast_init_next_event(struct cpumask 
*mask,
 /**
  * tick_broadcast_setup_oneshot - setup the broadcast device
  */
-void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
 {
int cpu = smp_processor_id();
 
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
index f738251000fe..be0ac01f2e12 100644
--- a/kernel/time/tick-internal.h
+++ b/kernel/time/tick-internal.h
@@ -126,7 +126,6 @@ static inline int tick_check_oneshot_change(int allow_nohz) 
{ return 0; }
 
 /* Functions related to oneshot broadcasting */
 #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && 
defined(CONFIG_TICK_ONESHOT)
-extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
 extern void tick_broadcast_switch_to_oneshot(void);
 extern void tick_shutdown_broadcast_oneshot(unsigned int cpu);
 extern int tick_broadcast_oneshot_active(void);
@@ -134,7 +133,6 @@ extern void tick_check_oneshot_broadcast_this_cpu(void);
 bool tick_broadcast_oneshot_available(void);
 extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
 #else /* !(BROADCAST && ONESHOT): */
-static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 
{ BUG(); }
 static inline void tick_broadcast_switch_to_oneshot(void) { }
 static inline void tick_shutdown_broadcast_oneshot(unsigned int cpu) { }
 static inline int tick_broadcast_oneshot_active(void) { return 0; }


[GIT pull] timer fixes for 4.12

2017-06-18 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Three fixlets for timers:

  - Two hot-fixes for the alarmtimer based posix timers, which prevent
a nasty DOS by self rescheduling timers. The proper cleanup of that
mess is queued for 4.13

  - Make a function static

Thanks,

tglx

-->
Stephen Boyd (1):
  tick/broadcast: Make tick_broadcast_setup_oneshot() static

Thomas Gleixner (2):
  alarmtimer: Prevent overflow of relative timers
  alarmtimer: Rate limit periodic intervals


 kernel/time/alarmtimer.c | 14 +++---
 kernel/time/tick-broadcast.c |  4 +++-
 kernel/time/tick-internal.h  |  2 --
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 5cb5b0008d97..ee2f4202d82a 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -387,7 +387,7 @@ void alarm_start_relative(struct alarm *alarm, ktime_t 
start)
 {
struct alarm_base *base = _bases[alarm->type];
 
-   start = ktime_add(start, base->gettime());
+   start = ktime_add_safe(start, base->gettime());
alarm_start(alarm, start);
 }
 EXPORT_SYMBOL_GPL(alarm_start_relative);
@@ -475,7 +475,7 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t 
interval)
overrun++;
}
 
-   alarm->node.expires = ktime_add(alarm->node.expires, interval);
+   alarm->node.expires = ktime_add_safe(alarm->node.expires, interval);
return overrun;
 }
 EXPORT_SYMBOL_GPL(alarm_forward);
@@ -660,13 +660,21 @@ static int alarm_timer_set(struct k_itimer *timr, int 
flags,
 
/* start the timer */
timr->it.alarm.interval = timespec64_to_ktime(new_setting->it_interval);
+
+   /*
+* Rate limit to the tick as a hot fix to prevent DOS. Will be
+* mopped up later.
+*/
+   if (timr->it.alarm.interval < TICK_NSEC)
+   timr->it.alarm.interval = TICK_NSEC;
+
exp = timespec64_to_ktime(new_setting->it_value);
/* Convert (if necessary) to absolute time */
if (flags != TIMER_ABSTIME) {
ktime_t now;
 
now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime();
-   exp = ktime_add(now, exp);
+   exp = ktime_add_safe(now, exp);
}
 
alarm_start(>it.alarm.alarmtimer, exp);
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 987e496bb51a..b398c2ea69b2 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -37,9 +37,11 @@ static int tick_broadcast_forced;
 static __cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(tick_broadcast_lock);
 
 #ifdef CONFIG_TICK_ONESHOT
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
 static void tick_broadcast_clear_oneshot(int cpu);
 static void tick_resume_broadcast_oneshot(struct clock_event_device *bc);
 #else
+static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 
{ BUG(); }
 static inline void tick_broadcast_clear_oneshot(int cpu) { }
 static inline void tick_resume_broadcast_oneshot(struct clock_event_device 
*bc) { }
 #endif
@@ -867,7 +869,7 @@ static void tick_broadcast_init_next_event(struct cpumask 
*mask,
 /**
  * tick_broadcast_setup_oneshot - setup the broadcast device
  */
-void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
 {
int cpu = smp_processor_id();
 
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
index f738251000fe..be0ac01f2e12 100644
--- a/kernel/time/tick-internal.h
+++ b/kernel/time/tick-internal.h
@@ -126,7 +126,6 @@ static inline int tick_check_oneshot_change(int allow_nohz) 
{ return 0; }
 
 /* Functions related to oneshot broadcasting */
 #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && 
defined(CONFIG_TICK_ONESHOT)
-extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
 extern void tick_broadcast_switch_to_oneshot(void);
 extern void tick_shutdown_broadcast_oneshot(unsigned int cpu);
 extern int tick_broadcast_oneshot_active(void);
@@ -134,7 +133,6 @@ extern void tick_check_oneshot_broadcast_this_cpu(void);
 bool tick_broadcast_oneshot_available(void);
 extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
 #else /* !(BROADCAST && ONESHOT): */
-static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 
{ BUG(); }
 static inline void tick_broadcast_switch_to_oneshot(void) { }
 static inline void tick_shutdown_broadcast_oneshot(unsigned int cpu) { }
 static inline int tick_broadcast_oneshot_active(void) { return 0; }


[GIT pull] timer fixes for 4.12

2017-05-27 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Silence dmesg spam by making the posix cpu timer printks depend on
print_fatal_signals.

Thanks,

tglx

-->
Thomas Gleixner (1):
  posix-timers: Make signal printks conditional


 kernel/time/posix-cpu-timers.c | 24 
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 1370f067fb51..d2a1e6dd0291 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -825,8 +825,10 @@ static void check_thread_timers(struct task_struct *tsk,
 * At the hard limit, we just die.
 * No need to calculate anything else now.
 */
-   pr_info("CPU Watchdog Timeout (hard): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("CPU Watchdog Timeout (hard): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
return;
}
@@ -838,8 +840,10 @@ static void check_thread_timers(struct task_struct *tsk,
soft += USEC_PER_SEC;
sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;
}
-   pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
}
}
@@ -936,8 +940,10 @@ static void check_process_timers(struct task_struct *tsk,
 * At the hard limit, we just die.
 * No need to calculate anything else now.
 */
-   pr_info("RT Watchdog Timeout (hard): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("RT Watchdog Timeout (hard): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
return;
}
@@ -945,8 +951,10 @@ static void check_process_timers(struct task_struct *tsk,
/*
 * At the soft limit, send a SIGXCPU every second.
 */
-   pr_info("CPU Watchdog Timeout (soft): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("CPU Watchdog Timeout (soft): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
if (soft < hard) {
soft++;


[GIT pull] timer fixes for 4.12

2017-05-27 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Silence dmesg spam by making the posix cpu timer printks depend on
print_fatal_signals.

Thanks,

tglx

-->
Thomas Gleixner (1):
  posix-timers: Make signal printks conditional


 kernel/time/posix-cpu-timers.c | 24 
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 1370f067fb51..d2a1e6dd0291 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -825,8 +825,10 @@ static void check_thread_timers(struct task_struct *tsk,
 * At the hard limit, we just die.
 * No need to calculate anything else now.
 */
-   pr_info("CPU Watchdog Timeout (hard): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("CPU Watchdog Timeout (hard): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
return;
}
@@ -838,8 +840,10 @@ static void check_thread_timers(struct task_struct *tsk,
soft += USEC_PER_SEC;
sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;
}
-   pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
}
}
@@ -936,8 +940,10 @@ static void check_process_timers(struct task_struct *tsk,
 * At the hard limit, we just die.
 * No need to calculate anything else now.
 */
-   pr_info("RT Watchdog Timeout (hard): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("RT Watchdog Timeout (hard): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
return;
}
@@ -945,8 +951,10 @@ static void check_process_timers(struct task_struct *tsk,
/*
 * At the soft limit, send a SIGXCPU every second.
 */
-   pr_info("CPU Watchdog Timeout (soft): %s[%d]\n",
-   tsk->comm, task_pid_nr(tsk));
+   if (print_fatal_signals) {
+   pr_info("CPU Watchdog Timeout (soft): %s[%d]\n",
+   tsk->comm, task_pid_nr(tsk));
+   }
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
if (soft < hard) {
soft++;


[GIT pull] timer fixes for 4.11

2017-04-02 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixes for the new CLKEVT_OF infrastructure.

Thanks,

tglx

-->
Alexander Kochetkov (2):
  clockevents: Fix syntax error in clkevt-of macro
  vmlinux.lds: Add __clkevt_of_table to kernel


 drivers/clocksource/clkevt-probe.c | 2 +-
 include/asm-generic/vmlinux.lds.h  | 2 ++
 include/linux/clockchips.h | 2 +-
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/clkevt-probe.c 
b/drivers/clocksource/clkevt-probe.c
index 8c30fec86094..eb89b502acbd 100644
--- a/drivers/clocksource/clkevt-probe.c
+++ b/drivers/clocksource/clkevt-probe.c
@@ -17,7 +17,7 @@
 
 #include 
 #include 
-#include 
+#include 
 
 extern struct of_device_id __clkevt_of_table[];
 
diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index 0968d13b3885..8c6b525eb0fa 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -173,6 +173,7 @@
KEEP(*(__##name##_of_table_end))
 
 #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
+#define CLKEVT_OF_TABLES() OF_TABLE(CONFIG_CLKEVT_OF, clkevt)
 #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
 #define CLK_OF_TABLES()OF_TABLE(CONFIG_COMMON_CLK, clk)
 #define IOMMU_OF_TABLES()  OF_TABLE(CONFIG_OF_IOMMU, iommu)
@@ -559,6 +560,7 @@
CLK_OF_TABLES() \
RESERVEDMEM_OF_TABLES() \
CLKSRC_OF_TABLES()  \
+   CLKEVT_OF_TABLES()  \
IOMMU_OF_TABLES()   \
CPU_METHOD_OF_TABLES()  \
CPUIDLE_METHOD_OF_TABLES()  \
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 5d3053c34fb3..6d7edc3082f9 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -229,7 +229,7 @@ static inline void tick_setup_hrtimer_broadcast(void) { }
 
 #ifdef CONFIG_CLKEVT_PROBE
 extern int clockevent_probe(void);
-#els
+#else
 static inline int clockevent_probe(void) { return 0; }
 #endif
 


[GIT pull] timer fixes for 4.11

2017-04-02 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixes for the new CLKEVT_OF infrastructure.

Thanks,

tglx

-->
Alexander Kochetkov (2):
  clockevents: Fix syntax error in clkevt-of macro
  vmlinux.lds: Add __clkevt_of_table to kernel


 drivers/clocksource/clkevt-probe.c | 2 +-
 include/asm-generic/vmlinux.lds.h  | 2 ++
 include/linux/clockchips.h | 2 +-
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/clkevt-probe.c 
b/drivers/clocksource/clkevt-probe.c
index 8c30fec86094..eb89b502acbd 100644
--- a/drivers/clocksource/clkevt-probe.c
+++ b/drivers/clocksource/clkevt-probe.c
@@ -17,7 +17,7 @@
 
 #include 
 #include 
-#include 
+#include 
 
 extern struct of_device_id __clkevt_of_table[];
 
diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index 0968d13b3885..8c6b525eb0fa 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -173,6 +173,7 @@
KEEP(*(__##name##_of_table_end))
 
 #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
+#define CLKEVT_OF_TABLES() OF_TABLE(CONFIG_CLKEVT_OF, clkevt)
 #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
 #define CLK_OF_TABLES()OF_TABLE(CONFIG_COMMON_CLK, clk)
 #define IOMMU_OF_TABLES()  OF_TABLE(CONFIG_OF_IOMMU, iommu)
@@ -559,6 +560,7 @@
CLK_OF_TABLES() \
RESERVEDMEM_OF_TABLES() \
CLKSRC_OF_TABLES()  \
+   CLKEVT_OF_TABLES()  \
IOMMU_OF_TABLES()   \
CPU_METHOD_OF_TABLES()  \
CPUIDLE_METHOD_OF_TABLES()  \
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 5d3053c34fb3..6d7edc3082f9 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -229,7 +229,7 @@ static inline void tick_setup_hrtimer_broadcast(void) { }
 
 #ifdef CONFIG_CLKEVT_PROBE
 extern int clockevent_probe(void);
-#els
+#else
 static inline int clockevent_probe(void) { return 0; }
 #endif
 


[GIT PULL] timer fixes

2017-03-07 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: fa3aa7a54fe6d3abf128f13cd4bbd40eaa48fed2 jiffies: Revert bogus 
conversion of NSEC_PER_SEC to TICK_NSEC

This includes a fix for lockups caused by incorrect nsecs related cleanup, and 
a 
capabilities check fix for timerfd.

 Thanks,

Ingo

-->
Frederic Weisbecker (1):
  jiffies: Revert bogus conversion of NSEC_PER_SEC to TICK_NSEC

Stephen Smalley (1):
  timerfd: Only check CAP_WAKE_ALARM when it is needed


 fs/timerfd.c  | 8 
 kernel/time/jiffies.c | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/timerfd.c b/fs/timerfd.c
index 384fa759a563..c543cdb5f8ed 100644
--- a/fs/timerfd.c
+++ b/fs/timerfd.c
@@ -400,9 +400,9 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
 clockid != CLOCK_BOOTTIME_ALARM))
return -EINVAL;
 
-   if (!capable(CAP_WAKE_ALARM) &&
-   (clockid == CLOCK_REALTIME_ALARM ||
-clockid == CLOCK_BOOTTIME_ALARM))
+   if ((clockid == CLOCK_REALTIME_ALARM ||
+clockid == CLOCK_BOOTTIME_ALARM) &&
+   !capable(CAP_WAKE_ALARM))
return -EPERM;
 
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
@@ -449,7 +449,7 @@ static int do_timerfd_settime(int ufd, int flags,
return ret;
ctx = f.file->private_data;
 
-   if (!capable(CAP_WAKE_ALARM) && isalarm(ctx)) {
+   if (isalarm(ctx) && !capable(CAP_WAKE_ALARM)) {
fdput(f);
return -EPERM;
}
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index 7906b3f0c41a..497719127bf9 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -125,7 +125,7 @@ int register_refined_jiffies(long cycles_per_second)
shift_hz += cycles_per_tick/2;
do_div(shift_hz, cycles_per_tick);
/* Calculate nsec_per_tick using shift_hz */
-   nsec_per_tick = (u64)TICK_NSEC << 8;
+   nsec_per_tick = (u64)NSEC_PER_SEC << 8;
nsec_per_tick += (u32)shift_hz/2;
do_div(nsec_per_tick, (u32)shift_hz);
 


[GIT PULL] timer fixes

2017-03-07 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: fa3aa7a54fe6d3abf128f13cd4bbd40eaa48fed2 jiffies: Revert bogus 
conversion of NSEC_PER_SEC to TICK_NSEC

This includes a fix for lockups caused by incorrect nsecs related cleanup, and 
a 
capabilities check fix for timerfd.

 Thanks,

Ingo

-->
Frederic Weisbecker (1):
  jiffies: Revert bogus conversion of NSEC_PER_SEC to TICK_NSEC

Stephen Smalley (1):
  timerfd: Only check CAP_WAKE_ALARM when it is needed


 fs/timerfd.c  | 8 
 kernel/time/jiffies.c | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/timerfd.c b/fs/timerfd.c
index 384fa759a563..c543cdb5f8ed 100644
--- a/fs/timerfd.c
+++ b/fs/timerfd.c
@@ -400,9 +400,9 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
 clockid != CLOCK_BOOTTIME_ALARM))
return -EINVAL;
 
-   if (!capable(CAP_WAKE_ALARM) &&
-   (clockid == CLOCK_REALTIME_ALARM ||
-clockid == CLOCK_BOOTTIME_ALARM))
+   if ((clockid == CLOCK_REALTIME_ALARM ||
+clockid == CLOCK_BOOTTIME_ALARM) &&
+   !capable(CAP_WAKE_ALARM))
return -EPERM;
 
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
@@ -449,7 +449,7 @@ static int do_timerfd_settime(int ufd, int flags,
return ret;
ctx = f.file->private_data;
 
-   if (!capable(CAP_WAKE_ALARM) && isalarm(ctx)) {
+   if (isalarm(ctx) && !capable(CAP_WAKE_ALARM)) {
fdput(f);
return -EPERM;
}
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index 7906b3f0c41a..497719127bf9 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -125,7 +125,7 @@ int register_refined_jiffies(long cycles_per_second)
shift_hz += cycles_per_tick/2;
do_div(shift_hz, cycles_per_tick);
/* Calculate nsec_per_tick using shift_hz */
-   nsec_per_tick = (u64)TICK_NSEC << 8;
+   nsec_per_tick = (u64)NSEC_PER_SEC << 8;
nsec_per_tick += (u32)shift_hz/2;
do_div(nsec_per_tick, (u32)shift_hz);
 


[GIT pull] timer fixes for 4.10

2017-02-18 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixes::

  - Prevent deadlock on the tick broadcast lock. Found and fixed by Mike.

  - Stop using printk() in the timekeeping debug code to prevent a deadlock
against the scheduler.

Thanks,

tglx

-->
Mike Galbraith (1):
  tick/broadcast: Prevent deadlock on tick_broadcast_lock

Sergey Senozhatsky (1):
  timekeeping: Use deferred printk() in debug code


 kernel/time/tick-broadcast.c| 15 +++
 kernel/time/timekeeping_debug.c |  4 ++--
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 3109204c87cc..17ac99b60ee5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -347,17 +347,16 @@ static void tick_handle_periodic_broadcast(struct 
clock_event_device *dev)
  *
  * Called when the system enters a state where affected tick devices
  * might stop. Note: TICK_BROADCAST_FORCE cannot be undone.
- *
- * Called with interrupts disabled, so clockevents_lock is not
- * required here because the local clock event device cannot go away
- * under us.
  */
 void tick_broadcast_control(enum tick_broadcast_mode mode)
 {
struct clock_event_device *bc, *dev;
struct tick_device *td;
int cpu, bc_stopped;
+   unsigned long flags;
 
+   /* Protects also the local clockevent device. */
+   raw_spin_lock_irqsave(_broadcast_lock, flags);
td = this_cpu_ptr(_cpu_device);
dev = td->evtdev;
 
@@ -365,12 +364,11 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
 * Is the device not affected by the powerstate ?
 */
if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP))
-   return;
+   goto out;
 
if (!tick_device_is_functional(dev))
-   return;
+   goto out;
 
-   raw_spin_lock(_broadcast_lock);
cpu = smp_processor_id();
bc = tick_broadcast_device.evtdev;
bc_stopped = cpumask_empty(tick_broadcast_mask);
@@ -420,7 +418,8 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
tick_broadcast_setup_oneshot(bc);
}
}
-   raw_spin_unlock(_broadcast_lock);
+out:
+   raw_spin_unlock_irqrestore(_broadcast_lock, flags);
 }
 EXPORT_SYMBOL_GPL(tick_broadcast_control);
 
diff --git a/kernel/time/timekeeping_debug.c b/kernel/time/timekeeping_debug.c
index ca9fb800336b..38bc4d2208e8 100644
--- a/kernel/time/timekeeping_debug.c
+++ b/kernel/time/timekeeping_debug.c
@@ -75,7 +75,7 @@ void tk_debug_account_sleep_time(struct timespec64 *t)
int bin = min(fls(t->tv_sec), NUM_BINS-1);
 
sleep_time_bin[bin]++;
-   pr_info("Suspended for %lld.%03lu seconds\n", (s64)t->tv_sec,
-   t->tv_nsec / NSEC_PER_MSEC);
+   printk_deferred(KERN_INFO "Suspended for %lld.%03lu seconds\n",
+   (s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC);
 }
 


[GIT pull] timer fixes for 4.10

2017-02-18 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixes::

  - Prevent deadlock on the tick broadcast lock. Found and fixed by Mike.

  - Stop using printk() in the timekeeping debug code to prevent a deadlock
against the scheduler.

Thanks,

tglx

-->
Mike Galbraith (1):
  tick/broadcast: Prevent deadlock on tick_broadcast_lock

Sergey Senozhatsky (1):
  timekeeping: Use deferred printk() in debug code


 kernel/time/tick-broadcast.c| 15 +++
 kernel/time/timekeeping_debug.c |  4 ++--
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 3109204c87cc..17ac99b60ee5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -347,17 +347,16 @@ static void tick_handle_periodic_broadcast(struct 
clock_event_device *dev)
  *
  * Called when the system enters a state where affected tick devices
  * might stop. Note: TICK_BROADCAST_FORCE cannot be undone.
- *
- * Called with interrupts disabled, so clockevents_lock is not
- * required here because the local clock event device cannot go away
- * under us.
  */
 void tick_broadcast_control(enum tick_broadcast_mode mode)
 {
struct clock_event_device *bc, *dev;
struct tick_device *td;
int cpu, bc_stopped;
+   unsigned long flags;
 
+   /* Protects also the local clockevent device. */
+   raw_spin_lock_irqsave(_broadcast_lock, flags);
td = this_cpu_ptr(_cpu_device);
dev = td->evtdev;
 
@@ -365,12 +364,11 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
 * Is the device not affected by the powerstate ?
 */
if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP))
-   return;
+   goto out;
 
if (!tick_device_is_functional(dev))
-   return;
+   goto out;
 
-   raw_spin_lock(_broadcast_lock);
cpu = smp_processor_id();
bc = tick_broadcast_device.evtdev;
bc_stopped = cpumask_empty(tick_broadcast_mask);
@@ -420,7 +418,8 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
tick_broadcast_setup_oneshot(bc);
}
}
-   raw_spin_unlock(_broadcast_lock);
+out:
+   raw_spin_unlock_irqrestore(_broadcast_lock, flags);
 }
 EXPORT_SYMBOL_GPL(tick_broadcast_control);
 
diff --git a/kernel/time/timekeeping_debug.c b/kernel/time/timekeeping_debug.c
index ca9fb800336b..38bc4d2208e8 100644
--- a/kernel/time/timekeeping_debug.c
+++ b/kernel/time/timekeeping_debug.c
@@ -75,7 +75,7 @@ void tk_debug_account_sleep_time(struct timespec64 *t)
int bin = min(fls(t->tv_sec), NUM_BINS-1);
 
sleep_time_bin[bin]++;
-   pr_info("Suspended for %lld.%03lu seconds\n", (s64)t->tv_sec,
-   t->tv_nsec / NSEC_PER_MSEC);
+   printk_deferred(KERN_INFO "Suspended for %lld.%03lu seconds\n",
+   (s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC);
 }
 


[GIT PULL] timer fixes

2016-10-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 6bad6bccf2d717f652d37e63cf261eaa23466009 timers: Prevent base clock 
corruption when forwarding

Fix four timer locking races: two were noticed by you while reviewing the code 
while chasing for a corruption bug, and two from fixing spurious USB timeouts.

 Thanks,

Ingo

-->
Thomas Gleixner (4):
  timers: Plug locking race vs. timer migration
  timers: Lock base for same bucket optimization
  timers: Prevent base clock rewind when forwarding clock
  timers: Prevent base clock corruption when forwarding


 kernel/time/timer.c | 74 +++--
 1 file changed, 44 insertions(+), 30 deletions(-)

diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 2d47980a1bc4..c611c47de884 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -878,7 +878,7 @@ static inline struct timer_base *get_timer_base(u32 tflags)
 
 #ifdef CONFIG_NO_HZ_COMMON
 static inline struct timer_base *
-__get_target_base(struct timer_base *base, unsigned tflags)
+get_target_base(struct timer_base *base, unsigned tflags)
 {
 #ifdef CONFIG_SMP
if ((tflags & TIMER_PINNED) || !base->migration_enabled)
@@ -891,25 +891,27 @@ __get_target_base(struct timer_base *base, unsigned 
tflags)
 
 static inline void forward_timer_base(struct timer_base *base)
 {
+   unsigned long jnow = READ_ONCE(jiffies);
+
/*
 * We only forward the base when it's idle and we have a delta between
 * base clock and jiffies.
 */
-   if (!base->is_idle || (long) (jiffies - base->clk) < 2)
+   if (!base->is_idle || (long) (jnow - base->clk) < 2)
return;
 
/*
 * If the next expiry value is > jiffies, then we fast forward to
 * jiffies otherwise we forward to the next expiry value.
 */
-   if (time_after(base->next_expiry, jiffies))
-   base->clk = jiffies;
+   if (time_after(base->next_expiry, jnow))
+   base->clk = jnow;
else
base->clk = base->next_expiry;
 }
 #else
 static inline struct timer_base *
-__get_target_base(struct timer_base *base, unsigned tflags)
+get_target_base(struct timer_base *base, unsigned tflags)
 {
return get_timer_this_cpu_base(tflags);
 }
@@ -917,14 +919,6 @@ __get_target_base(struct timer_base *base, unsigned tflags)
 static inline void forward_timer_base(struct timer_base *base) { }
 #endif
 
-static inline struct timer_base *
-get_target_base(struct timer_base *base, unsigned tflags)
-{
-   struct timer_base *target = __get_target_base(base, tflags);
-
-   forward_timer_base(target);
-   return target;
-}
 
 /*
  * We are using hashed locking: Holding per_cpu(timer_bases[x]).lock means
@@ -943,7 +937,14 @@ static struct timer_base *lock_timer_base(struct 
timer_list *timer,
 {
for (;;) {
struct timer_base *base;
-   u32 tf = timer->flags;
+   u32 tf;
+
+   /*
+* We need to use READ_ONCE() here, otherwise the compiler
+* might re-read @tf between the check for TIMER_MIGRATING
+* and spin_lock().
+*/
+   tf = READ_ONCE(timer->flags);
 
if (!(tf & TIMER_MIGRATING)) {
base = get_timer_base(tf);
@@ -964,6 +965,8 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
unsigned long clk = 0, flags;
int ret = 0;
 
+   BUG_ON(!timer->function);
+
/*
 * This is a common optimization triggered by the networking code - if
 * the timer is re-modified to have the same timeout or ends up in the
@@ -972,13 +975,16 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
if (timer_pending(timer)) {
if (timer->expires == expires)
return 1;
+
/*
-* Take the current timer_jiffies of base, but without holding
-* the lock!
+* We lock timer base and calculate the bucket index right
+* here. If the timer ends up in the same bucket, then we
+* just update the expiry time and avoid the whole
+* dequeue/enqueue dance.
 */
-   base = get_timer_base(timer->flags);
-   clk = base->clk;
+   base = lock_timer_base(timer, );
 
+   clk = base->clk;
idx = calc_wheel_index(expires, clk);
 
/*
@@ -988,14 +994,14 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
 */
if (idx == timer_get_idx(timer)) {
timer->expires = expires;
-   

[GIT PULL] timer fixes

2016-10-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 6bad6bccf2d717f652d37e63cf261eaa23466009 timers: Prevent base clock 
corruption when forwarding

Fix four timer locking races: two were noticed by you while reviewing the code 
while chasing for a corruption bug, and two from fixing spurious USB timeouts.

 Thanks,

Ingo

-->
Thomas Gleixner (4):
  timers: Plug locking race vs. timer migration
  timers: Lock base for same bucket optimization
  timers: Prevent base clock rewind when forwarding clock
  timers: Prevent base clock corruption when forwarding


 kernel/time/timer.c | 74 +++--
 1 file changed, 44 insertions(+), 30 deletions(-)

diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 2d47980a1bc4..c611c47de884 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -878,7 +878,7 @@ static inline struct timer_base *get_timer_base(u32 tflags)
 
 #ifdef CONFIG_NO_HZ_COMMON
 static inline struct timer_base *
-__get_target_base(struct timer_base *base, unsigned tflags)
+get_target_base(struct timer_base *base, unsigned tflags)
 {
 #ifdef CONFIG_SMP
if ((tflags & TIMER_PINNED) || !base->migration_enabled)
@@ -891,25 +891,27 @@ __get_target_base(struct timer_base *base, unsigned 
tflags)
 
 static inline void forward_timer_base(struct timer_base *base)
 {
+   unsigned long jnow = READ_ONCE(jiffies);
+
/*
 * We only forward the base when it's idle and we have a delta between
 * base clock and jiffies.
 */
-   if (!base->is_idle || (long) (jiffies - base->clk) < 2)
+   if (!base->is_idle || (long) (jnow - base->clk) < 2)
return;
 
/*
 * If the next expiry value is > jiffies, then we fast forward to
 * jiffies otherwise we forward to the next expiry value.
 */
-   if (time_after(base->next_expiry, jiffies))
-   base->clk = jiffies;
+   if (time_after(base->next_expiry, jnow))
+   base->clk = jnow;
else
base->clk = base->next_expiry;
 }
 #else
 static inline struct timer_base *
-__get_target_base(struct timer_base *base, unsigned tflags)
+get_target_base(struct timer_base *base, unsigned tflags)
 {
return get_timer_this_cpu_base(tflags);
 }
@@ -917,14 +919,6 @@ __get_target_base(struct timer_base *base, unsigned tflags)
 static inline void forward_timer_base(struct timer_base *base) { }
 #endif
 
-static inline struct timer_base *
-get_target_base(struct timer_base *base, unsigned tflags)
-{
-   struct timer_base *target = __get_target_base(base, tflags);
-
-   forward_timer_base(target);
-   return target;
-}
 
 /*
  * We are using hashed locking: Holding per_cpu(timer_bases[x]).lock means
@@ -943,7 +937,14 @@ static struct timer_base *lock_timer_base(struct 
timer_list *timer,
 {
for (;;) {
struct timer_base *base;
-   u32 tf = timer->flags;
+   u32 tf;
+
+   /*
+* We need to use READ_ONCE() here, otherwise the compiler
+* might re-read @tf between the check for TIMER_MIGRATING
+* and spin_lock().
+*/
+   tf = READ_ONCE(timer->flags);
 
if (!(tf & TIMER_MIGRATING)) {
base = get_timer_base(tf);
@@ -964,6 +965,8 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
unsigned long clk = 0, flags;
int ret = 0;
 
+   BUG_ON(!timer->function);
+
/*
 * This is a common optimization triggered by the networking code - if
 * the timer is re-modified to have the same timeout or ends up in the
@@ -972,13 +975,16 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
if (timer_pending(timer)) {
if (timer->expires == expires)
return 1;
+
/*
-* Take the current timer_jiffies of base, but without holding
-* the lock!
+* We lock timer base and calculate the bucket index right
+* here. If the timer ends up in the same bucket, then we
+* just update the expiry time and avoid the whole
+* dequeue/enqueue dance.
 */
-   base = get_timer_base(timer->flags);
-   clk = base->clk;
+   base = lock_timer_base(timer, );
 
+   clk = base->clk;
idx = calc_wheel_index(expires, clk);
 
/*
@@ -988,14 +994,14 @@ __mod_timer(struct timer_list *timer, unsigned long 
expires, bool pending_only)
 */
if (idx == timer_get_idx(timer)) {
timer->expires = expires;
-   

[GIT pull] timer fixes for 4.8

2016-09-04 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two fixlet from the timers departement:

- A fix for scheduler stalls in the tick idle code affecting NOHZ_FULL
  kernels

- A trivial compile fix

Thanks,

tglx

-->
Daniel Lezcano (1):
  clocksource/drivers/atmel-pit: Fix compilation error

Wanpeng Li (1):
  tick/nohz: Fix softlockup on scheduler stalls in kvm guest


 drivers/clocksource/timer-atmel-pit.c | 1 +
 kernel/time/tick-sched.c  | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index 3494bc5a21d5..7f0f5b26d8c5 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -240,6 +240,7 @@ static int __init at91sam926x_pit_common_init(struct 
pit_data *data)
 static int __init at91sam926x_pit_dt_init(struct device_node *node)
 {
struct pit_data *data;
+   int ret;
 
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 204fdc86863d..2ec7c00228f3 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -908,10 +908,11 @@ static void __tick_nohz_idle_enter(struct tick_sched *ts)
ktime_t now, expires;
int cpu = smp_processor_id();
 
+   now = tick_nohz_start_idle(ts);
+
if (can_stop_idle_tick(cpu, ts)) {
int was_stopped = ts->tick_stopped;
 
-   now = tick_nohz_start_idle(ts);
ts->idle_calls++;
 
expires = tick_nohz_stop_sched_tick(ts, now, cpu);


[GIT pull] timer fixes for 4.8

2016-09-04 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two fixlet from the timers departement:

- A fix for scheduler stalls in the tick idle code affecting NOHZ_FULL
  kernels

- A trivial compile fix

Thanks,

tglx

-->
Daniel Lezcano (1):
  clocksource/drivers/atmel-pit: Fix compilation error

Wanpeng Li (1):
  tick/nohz: Fix softlockup on scheduler stalls in kvm guest


 drivers/clocksource/timer-atmel-pit.c | 1 +
 kernel/time/tick-sched.c  | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index 3494bc5a21d5..7f0f5b26d8c5 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -240,6 +240,7 @@ static int __init at91sam926x_pit_common_init(struct 
pit_data *data)
 static int __init at91sam926x_pit_dt_init(struct device_node *node)
 {
struct pit_data *data;
+   int ret;
 
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 204fdc86863d..2ec7c00228f3 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -908,10 +908,11 @@ static void __tick_nohz_idle_enter(struct tick_sched *ts)
ktime_t now, expires;
int cpu = smp_processor_id();
 
+   now = tick_nohz_start_idle(ts);
+
if (can_stop_idle_tick(cpu, ts)) {
int was_stopped = ts->tick_stopped;
 
-   now = tick_nohz_start_idle(ts);
ts->idle_calls++;
 
expires = tick_nohz_stop_sched_tick(ts, now, cpu);


[GIT pull] timer fixes for 4.8

2016-08-28 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few updates for timers & co.

 - Prevent a livelock in the timekeeping code when debugging is enabled
 - Prevent out of bounds access in the timekeeping debug code
 - Various fixes in clocksource drivers
 - A new maintainers entry

Thanks,

tglx

-->
Alexandre Belloni (1):
  clocksource/drivers/timer-atmel-pit: Enable mck clock

Baoyou Xie (1):
  clocksource/drivers/pxa: Fix include files for compilation

Chen-Yu Tsai (1):
  clocksource/drivers/sun4i: Clear interrupts after stopping timer in probe 
function

John Stultz (2):
  timekeeping: Avoid taking lock in NMI path with CONFIG_DEBUG_TIMEKEEPING
  timekeeping: Cap array access in timekeeping_debug

Marcin Nowakowski (1):
  drivers/clocksource/pistachio: Fix memory corruption in init

Mark Rutland (1):
  MAINTAINERS: Add ARM ARCHITECTED TIMER entry


 MAINTAINERS   | 9 +
 drivers/clocksource/pxa_timer.c   | 2 ++
 drivers/clocksource/sun4i_timer.c | 9 -
 drivers/clocksource/time-pistachio.c  | 8 
 drivers/clocksource/timer-atmel-pit.c | 6 ++
 kernel/time/timekeeping.c | 5 -
 kernel/time/timekeeping_debug.c   | 9 +++--
 7 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 0bbe4b105c34..4705c94f6a37 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -881,6 +881,15 @@ S: Supported
 F: drivers/gpu/drm/arc/
 F: Documentation/devicetree/bindings/display/snps,arcpgu.txt
 
+ARM ARCHITECTED TIMER DRIVER
+M: Mark Rutland 
+M: Marc Zyngier 
+L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
+S: Maintained
+F: arch/arm/include/asm/arch_timer.h
+F: arch/arm64/include/asm/arch_timer.h
+F: drivers/clocksource/arm_arch_timer.c
+
 ARM HDLCD DRM DRIVER
 M: Liviu Dudau 
 S: Supported
diff --git a/drivers/clocksource/pxa_timer.c b/drivers/clocksource/pxa_timer.c
index 937e10b84d58..3e1cb512f3ce 100644
--- a/drivers/clocksource/pxa_timer.c
+++ b/drivers/clocksource/pxa_timer.c
@@ -21,6 +21,8 @@
 #include 
 #include 
 
+#include 
+
 #include 
 
 #define OSMR0  0x00/* OS Timer 0 Match Register */
diff --git a/drivers/clocksource/sun4i_timer.c 
b/drivers/clocksource/sun4i_timer.c
index 97669ee4df2a..c83452cacb41 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -123,12 +123,16 @@ static struct clock_event_device sun4i_clockevent = {
.set_next_event = sun4i_clkevt_next_event,
 };
 
+static void sun4i_timer_clear_interrupt(void)
+{
+   writel(TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_ST_REG);
+}
 
 static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id)
 {
struct clock_event_device *evt = (struct clock_event_device *)dev_id;
 
-   writel(0x1, timer_base + TIMER_IRQ_ST_REG);
+   sun4i_timer_clear_interrupt();
evt->event_handler(evt);
 
return IRQ_HANDLED;
@@ -208,6 +212,9 @@ static int __init sun4i_timer_init(struct device_node *node)
/* Make sure timer is stopped before playing with interrupts */
sun4i_clkevt_time_stop(0);
 
+   /* clear timer0 interrupt */
+   sun4i_timer_clear_interrupt();
+
sun4i_clockevent.cpumask = cpu_possible_mask;
sun4i_clockevent.irq = irq;
 
diff --git a/drivers/clocksource/time-pistachio.c 
b/drivers/clocksource/time-pistachio.c
index a7d9a08e4b0e..a8e6c7df853d 100644
--- a/drivers/clocksource/time-pistachio.c
+++ b/drivers/clocksource/time-pistachio.c
@@ -202,10 +202,10 @@ static int __init pistachio_clksrc_of_init(struct 
device_node *node)
rate = clk_get_rate(fast_clk);
 
/* Disable irq's for clocksource usage */
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 0);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 1);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 2);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 3);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 0);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 1);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 2);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 3);
 
/* Enable timer block */
writel(TIMER_ME_GLOBAL, pcs_gpt.base);
diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index 1ffac0cb0cb7..3494bc5a21d5 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -261,6 +261,12 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
return PTR_ERR(data->mck);
}
 
+   ret = clk_prepare_enable(data->mck);
+   if (ret) {
+   pr_err("Unable to enable mck\n");
+   return ret;
+   }
+

[GIT pull] timer fixes for 4.8

2016-08-28 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A few updates for timers & co.

 - Prevent a livelock in the timekeeping code when debugging is enabled
 - Prevent out of bounds access in the timekeeping debug code
 - Various fixes in clocksource drivers
 - A new maintainers entry

Thanks,

tglx

-->
Alexandre Belloni (1):
  clocksource/drivers/timer-atmel-pit: Enable mck clock

Baoyou Xie (1):
  clocksource/drivers/pxa: Fix include files for compilation

Chen-Yu Tsai (1):
  clocksource/drivers/sun4i: Clear interrupts after stopping timer in probe 
function

John Stultz (2):
  timekeeping: Avoid taking lock in NMI path with CONFIG_DEBUG_TIMEKEEPING
  timekeeping: Cap array access in timekeeping_debug

Marcin Nowakowski (1):
  drivers/clocksource/pistachio: Fix memory corruption in init

Mark Rutland (1):
  MAINTAINERS: Add ARM ARCHITECTED TIMER entry


 MAINTAINERS   | 9 +
 drivers/clocksource/pxa_timer.c   | 2 ++
 drivers/clocksource/sun4i_timer.c | 9 -
 drivers/clocksource/time-pistachio.c  | 8 
 drivers/clocksource/timer-atmel-pit.c | 6 ++
 kernel/time/timekeeping.c | 5 -
 kernel/time/timekeeping_debug.c   | 9 +++--
 7 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 0bbe4b105c34..4705c94f6a37 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -881,6 +881,15 @@ S: Supported
 F: drivers/gpu/drm/arc/
 F: Documentation/devicetree/bindings/display/snps,arcpgu.txt
 
+ARM ARCHITECTED TIMER DRIVER
+M: Mark Rutland 
+M: Marc Zyngier 
+L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
+S: Maintained
+F: arch/arm/include/asm/arch_timer.h
+F: arch/arm64/include/asm/arch_timer.h
+F: drivers/clocksource/arm_arch_timer.c
+
 ARM HDLCD DRM DRIVER
 M: Liviu Dudau 
 S: Supported
diff --git a/drivers/clocksource/pxa_timer.c b/drivers/clocksource/pxa_timer.c
index 937e10b84d58..3e1cb512f3ce 100644
--- a/drivers/clocksource/pxa_timer.c
+++ b/drivers/clocksource/pxa_timer.c
@@ -21,6 +21,8 @@
 #include 
 #include 
 
+#include 
+
 #include 
 
 #define OSMR0  0x00/* OS Timer 0 Match Register */
diff --git a/drivers/clocksource/sun4i_timer.c 
b/drivers/clocksource/sun4i_timer.c
index 97669ee4df2a..c83452cacb41 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -123,12 +123,16 @@ static struct clock_event_device sun4i_clockevent = {
.set_next_event = sun4i_clkevt_next_event,
 };
 
+static void sun4i_timer_clear_interrupt(void)
+{
+   writel(TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_ST_REG);
+}
 
 static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id)
 {
struct clock_event_device *evt = (struct clock_event_device *)dev_id;
 
-   writel(0x1, timer_base + TIMER_IRQ_ST_REG);
+   sun4i_timer_clear_interrupt();
evt->event_handler(evt);
 
return IRQ_HANDLED;
@@ -208,6 +212,9 @@ static int __init sun4i_timer_init(struct device_node *node)
/* Make sure timer is stopped before playing with interrupts */
sun4i_clkevt_time_stop(0);
 
+   /* clear timer0 interrupt */
+   sun4i_timer_clear_interrupt();
+
sun4i_clockevent.cpumask = cpu_possible_mask;
sun4i_clockevent.irq = irq;
 
diff --git a/drivers/clocksource/time-pistachio.c 
b/drivers/clocksource/time-pistachio.c
index a7d9a08e4b0e..a8e6c7df853d 100644
--- a/drivers/clocksource/time-pistachio.c
+++ b/drivers/clocksource/time-pistachio.c
@@ -202,10 +202,10 @@ static int __init pistachio_clksrc_of_init(struct 
device_node *node)
rate = clk_get_rate(fast_clk);
 
/* Disable irq's for clocksource usage */
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 0);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 1);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 2);
-   gpt_writel(_gpt.base, 0, TIMER_IRQ_MASK, 3);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 0);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 1);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 2);
+   gpt_writel(pcs_gpt.base, 0, TIMER_IRQ_MASK, 3);
 
/* Enable timer block */
writel(TIMER_ME_GLOBAL, pcs_gpt.base);
diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index 1ffac0cb0cb7..3494bc5a21d5 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -261,6 +261,12 @@ static int __init at91sam926x_pit_dt_init(struct 
device_node *node)
return PTR_ERR(data->mck);
}
 
+   ret = clk_prepare_enable(data->mck);
+   if (ret) {
+   pr_err("Unable to enable mck\n");
+   return ret;
+   }
+
/* Get the interrupts property */
data->irq = 

[GIT PULL] timer fixes

2016-08-18 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: be5769e2061ac40b32daa83e28e1c4aac7133511 
clocksource/drivers/mips-gic-timer: Make gic_clocksource_of_init() return int

Three clocksource driver fixes.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  clocksource/drivers/kona: Fix get_counter() error handling

Gregory CLEMENT (1):
  clocksource/drivers/time-armada-370-xp: Fix the clock reference

Paul Gortmaker (1):
  clocksource/drivers/mips-gic-timer: Make gic_clocksource_of_init() return 
int


 drivers/clocksource/bcm_kona_timer.c | 16 ++--
 drivers/clocksource/mips-gic-timer.c |  2 +-
 drivers/clocksource/time-armada-370-xp.c |  1 -
 3 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 7e3fd375a627..92f6e4deee74 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -66,10 +66,10 @@ static void kona_timer_disable_and_clear(void __iomem *base)
 
 }
 
-static void
+static int
 kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
 {
-   int loop_limit = 4;
+   int loop_limit = 3;
 
/*
 * Read 64-bit free running counter
@@ -83,18 +83,19 @@ kona_timer_get_counter(void __iomem *timer_base, uint32_t 
*msw, uint32_t *lsw)
 *  if new hi-word is equal to previously read hi-word then stop.
 */
 
-   while (--loop_limit) {
+   do {
*msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
*lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
break;
-   }
+   } while (--loop_limit);
if (!loop_limit) {
pr_err("bcm_kona_timer: getting counter failed.\n");
pr_err(" Timer will be impacted\n");
+   return -ETIMEDOUT;
}
 
-   return;
+   return 0;
 }
 
 static int kona_timer_set_next_event(unsigned long clc,
@@ -112,8 +113,11 @@ static int kona_timer_set_next_event(unsigned long clc,
 
uint32_t lsw, msw;
uint32_t reg;
+   int ret;
 
-   kona_timer_get_counter(timers.tmr_regs, , );
+   ret = kona_timer_get_counter(timers.tmr_regs, , );
+   if (ret)
+   return ret;
 
/* Load the "next" event tick value */
writel(lsw + clc, timers.tmr_regs + KONA_GPTIMER_STCM0_OFFSET);
diff --git a/drivers/clocksource/mips-gic-timer.c 
b/drivers/clocksource/mips-gic-timer.c
index d91e8725917c..b4b3ab5a11ad 100644
--- a/drivers/clocksource/mips-gic-timer.c
+++ b/drivers/clocksource/mips-gic-timer.c
@@ -164,7 +164,7 @@ void __init gic_clocksource_init(unsigned int frequency)
gic_start_count();
 }
 
-static void __init gic_clocksource_of_init(struct device_node *node)
+static int __init gic_clocksource_of_init(struct device_node *node)
 {
struct clk *clk;
int ret;
diff --git a/drivers/clocksource/time-armada-370-xp.c 
b/drivers/clocksource/time-armada-370-xp.c
index 719b478d136e..3c39e6f45971 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -338,7 +338,6 @@ static int __init armada_xp_timer_init(struct device_node 
*np)
struct clk *clk = of_clk_get_by_name(np, "fixed");
int ret;
 
-   clk = of_clk_get(np, 0);
if (IS_ERR(clk)) {
pr_err("Failed to get clock");
return PTR_ERR(clk);


[GIT PULL] timer fixes

2016-08-18 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: be5769e2061ac40b32daa83e28e1c4aac7133511 
clocksource/drivers/mips-gic-timer: Make gic_clocksource_of_init() return int

Three clocksource driver fixes.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  clocksource/drivers/kona: Fix get_counter() error handling

Gregory CLEMENT (1):
  clocksource/drivers/time-armada-370-xp: Fix the clock reference

Paul Gortmaker (1):
  clocksource/drivers/mips-gic-timer: Make gic_clocksource_of_init() return 
int


 drivers/clocksource/bcm_kona_timer.c | 16 ++--
 drivers/clocksource/mips-gic-timer.c |  2 +-
 drivers/clocksource/time-armada-370-xp.c |  1 -
 3 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 7e3fd375a627..92f6e4deee74 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -66,10 +66,10 @@ static void kona_timer_disable_and_clear(void __iomem *base)
 
 }
 
-static void
+static int
 kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
 {
-   int loop_limit = 4;
+   int loop_limit = 3;
 
/*
 * Read 64-bit free running counter
@@ -83,18 +83,19 @@ kona_timer_get_counter(void __iomem *timer_base, uint32_t 
*msw, uint32_t *lsw)
 *  if new hi-word is equal to previously read hi-word then stop.
 */
 
-   while (--loop_limit) {
+   do {
*msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
*lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
break;
-   }
+   } while (--loop_limit);
if (!loop_limit) {
pr_err("bcm_kona_timer: getting counter failed.\n");
pr_err(" Timer will be impacted\n");
+   return -ETIMEDOUT;
}
 
-   return;
+   return 0;
 }
 
 static int kona_timer_set_next_event(unsigned long clc,
@@ -112,8 +113,11 @@ static int kona_timer_set_next_event(unsigned long clc,
 
uint32_t lsw, msw;
uint32_t reg;
+   int ret;
 
-   kona_timer_get_counter(timers.tmr_regs, , );
+   ret = kona_timer_get_counter(timers.tmr_regs, , );
+   if (ret)
+   return ret;
 
/* Load the "next" event tick value */
writel(lsw + clc, timers.tmr_regs + KONA_GPTIMER_STCM0_OFFSET);
diff --git a/drivers/clocksource/mips-gic-timer.c 
b/drivers/clocksource/mips-gic-timer.c
index d91e8725917c..b4b3ab5a11ad 100644
--- a/drivers/clocksource/mips-gic-timer.c
+++ b/drivers/clocksource/mips-gic-timer.c
@@ -164,7 +164,7 @@ void __init gic_clocksource_init(unsigned int frequency)
gic_start_count();
 }
 
-static void __init gic_clocksource_of_init(struct device_node *node)
+static int __init gic_clocksource_of_init(struct device_node *node)
 {
struct clk *clk;
int ret;
diff --git a/drivers/clocksource/time-armada-370-xp.c 
b/drivers/clocksource/time-armada-370-xp.c
index 719b478d136e..3c39e6f45971 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -338,7 +338,6 @@ static int __init armada_xp_timer_init(struct device_node 
*np)
struct clk *clk = of_clk_get_by_name(np, "fixed");
int ret;
 
-   clk = of_clk_get(np, 0);
if (IS_ERR(clk)) {
pr_err("Failed to get clock");
return PTR_ERR(clk);


[GIT PULL] timer fixes

2016-08-12 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 22cc1ca3c5469cf17e149be232817b9223afa5e4 x86/hpet: Fix /dev/rtc 
breakage caused by RTC cleanup

Misc fixes: a /dev/rtc regression fix, two APIC timer period calibration fixes, 
an 
ARM clocksource driver fix and a NOHZ power use regression fix.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  x86/hpet: Fix /dev/rtc breakage caused by RTC cleanup

Chris Metcalf (1):
  timers: Fix get_next_timer_interrupt() computation

Marc Zyngier (1):
  clocksource/arm_arch_timer: Force per-CPU interrupt to be level-triggered

Nicolai Stange (2):
  x86/timers/apic: Fix imprecise timer interrupts by eliminating TSC 
clockevents frequency roundoff error
  x86/timers/apic: Inform TSC deadline clockevent device about recalibration


 arch/x86/include/asm/apic.h  |  2 ++
 arch/x86/kernel/apic/apic.c  | 28 ++--
 arch/x86/kernel/hpet.c   |  2 +-
 arch/x86/kernel/tsc.c|  4 
 drivers/clocksource/arm_arch_timer.c | 26 +++---
 kernel/time/timer.c  |  5 -
 6 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index f5befd4945f2..124357773ffa 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -135,6 +135,7 @@ extern void init_apic_mappings(void);
 void register_lapic_address(unsigned long address);
 extern void setup_boot_APIC_clock(void);
 extern void setup_secondary_APIC_clock(void);
+extern void lapic_update_tsc_freq(void);
 extern int APIC_init_uniprocessor(void);
 
 #ifdef CONFIG_X86_64
@@ -170,6 +171,7 @@ static inline void init_apic_mappings(void) { }
 static inline void disable_local_APIC(void) { }
 # define setup_boot_APIC_clock x86_init_noop
 # define setup_secondary_APIC_clock x86_init_noop
+static inline void lapic_update_tsc_freq(void) { }
 #endif /* !CONFIG_X86_LOCAL_APIC */
 
 #ifdef CONFIG_X86_X2APIC
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 20abd912f0e4..cea4fc19e844 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -313,7 +313,7 @@ int lapic_get_maxlvt(void)
 
 /* Clock divisor */
 #define APIC_DIVISOR 16
-#define TSC_DIVISOR  32
+#define TSC_DIVISOR  8
 
 /*
  * This function sets up the local APIC timer, with a timeout of
@@ -565,13 +565,37 @@ static void setup_APIC_timer(void)
CLOCK_EVT_FEAT_DUMMY);
levt->set_next_event = lapic_next_deadline;
clockevents_config_and_register(levt,
-   (tsc_khz / TSC_DIVISOR) * 1000,
+   tsc_khz * (1000 / TSC_DIVISOR),
0xF, ~0UL);
} else
clockevents_register_device(levt);
 }
 
 /*
+ * Install the updated TSC frequency from recalibration at the TSC
+ * deadline clockevent devices.
+ */
+static void __lapic_update_tsc_freq(void *info)
+{
+   struct clock_event_device *levt = this_cpu_ptr(_events);
+
+   if (!this_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER))
+   return;
+
+   clockevents_update_freq(levt, tsc_khz * (1000 / TSC_DIVISOR));
+}
+
+void lapic_update_tsc_freq(void)
+{
+   /*
+* The clockevent device's ->mult and ->shift can both be
+* changed. In order to avoid races, schedule the frequency
+* update code on each CPU.
+*/
+   on_each_cpu(__lapic_update_tsc_freq, NULL, 0);
+}
+
+/*
  * In this functions we calibrate APIC bus clocks to the external timer.
  *
  * We want to do the calibration only once since we want to have local timer
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index ed16e58658a4..c6dfd801df97 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -1242,7 +1242,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
memset(_time, 0, sizeof(struct rtc_time));
 
if (hpet_rtc_flags & (RTC_UIE | RTC_AIE))
-   mc146818_set_time(_time);
+   mc146818_get_time(_time);
 
if (hpet_rtc_flags & RTC_UIE &&
curr_time.tm_sec != hpet_prev_update_sec) {
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 1ef87e887051..78b9cb5a26af 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -22,6 +22,7 @@
 #include 
 #include 
 #include 
+#include 
 
 unsigned int __read_mostly cpu_khz;/* TSC clocks / usec, not used here */
 EXPORT_SYMBOL(cpu_khz);
@@ -1249,6 +1250,9 @@ static void tsc_refine_calibration_work(struct 
work_struct *work)
(unsigned long)tsc_khz / 1000,
(unsigned long)tsc_khz % 1000);
 
+   /* Inform the TSC deadline clockevent devices about the recalibration */
+ 

[GIT PULL] timer fixes

2016-08-12 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 22cc1ca3c5469cf17e149be232817b9223afa5e4 x86/hpet: Fix /dev/rtc 
breakage caused by RTC cleanup

Misc fixes: a /dev/rtc regression fix, two APIC timer period calibration fixes, 
an 
ARM clocksource driver fix and a NOHZ power use regression fix.

 Thanks,

Ingo

-->
Arnd Bergmann (1):
  x86/hpet: Fix /dev/rtc breakage caused by RTC cleanup

Chris Metcalf (1):
  timers: Fix get_next_timer_interrupt() computation

Marc Zyngier (1):
  clocksource/arm_arch_timer: Force per-CPU interrupt to be level-triggered

Nicolai Stange (2):
  x86/timers/apic: Fix imprecise timer interrupts by eliminating TSC 
clockevents frequency roundoff error
  x86/timers/apic: Inform TSC deadline clockevent device about recalibration


 arch/x86/include/asm/apic.h  |  2 ++
 arch/x86/kernel/apic/apic.c  | 28 ++--
 arch/x86/kernel/hpet.c   |  2 +-
 arch/x86/kernel/tsc.c|  4 
 drivers/clocksource/arm_arch_timer.c | 26 +++---
 kernel/time/timer.c  |  5 -
 6 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index f5befd4945f2..124357773ffa 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -135,6 +135,7 @@ extern void init_apic_mappings(void);
 void register_lapic_address(unsigned long address);
 extern void setup_boot_APIC_clock(void);
 extern void setup_secondary_APIC_clock(void);
+extern void lapic_update_tsc_freq(void);
 extern int APIC_init_uniprocessor(void);
 
 #ifdef CONFIG_X86_64
@@ -170,6 +171,7 @@ static inline void init_apic_mappings(void) { }
 static inline void disable_local_APIC(void) { }
 # define setup_boot_APIC_clock x86_init_noop
 # define setup_secondary_APIC_clock x86_init_noop
+static inline void lapic_update_tsc_freq(void) { }
 #endif /* !CONFIG_X86_LOCAL_APIC */
 
 #ifdef CONFIG_X86_X2APIC
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 20abd912f0e4..cea4fc19e844 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -313,7 +313,7 @@ int lapic_get_maxlvt(void)
 
 /* Clock divisor */
 #define APIC_DIVISOR 16
-#define TSC_DIVISOR  32
+#define TSC_DIVISOR  8
 
 /*
  * This function sets up the local APIC timer, with a timeout of
@@ -565,13 +565,37 @@ static void setup_APIC_timer(void)
CLOCK_EVT_FEAT_DUMMY);
levt->set_next_event = lapic_next_deadline;
clockevents_config_and_register(levt,
-   (tsc_khz / TSC_DIVISOR) * 1000,
+   tsc_khz * (1000 / TSC_DIVISOR),
0xF, ~0UL);
} else
clockevents_register_device(levt);
 }
 
 /*
+ * Install the updated TSC frequency from recalibration at the TSC
+ * deadline clockevent devices.
+ */
+static void __lapic_update_tsc_freq(void *info)
+{
+   struct clock_event_device *levt = this_cpu_ptr(_events);
+
+   if (!this_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER))
+   return;
+
+   clockevents_update_freq(levt, tsc_khz * (1000 / TSC_DIVISOR));
+}
+
+void lapic_update_tsc_freq(void)
+{
+   /*
+* The clockevent device's ->mult and ->shift can both be
+* changed. In order to avoid races, schedule the frequency
+* update code on each CPU.
+*/
+   on_each_cpu(__lapic_update_tsc_freq, NULL, 0);
+}
+
+/*
  * In this functions we calibrate APIC bus clocks to the external timer.
  *
  * We want to do the calibration only once since we want to have local timer
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index ed16e58658a4..c6dfd801df97 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -1242,7 +1242,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
memset(_time, 0, sizeof(struct rtc_time));
 
if (hpet_rtc_flags & (RTC_UIE | RTC_AIE))
-   mc146818_set_time(_time);
+   mc146818_get_time(_time);
 
if (hpet_rtc_flags & RTC_UIE &&
curr_time.tm_sec != hpet_prev_update_sec) {
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 1ef87e887051..78b9cb5a26af 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -22,6 +22,7 @@
 #include 
 #include 
 #include 
+#include 
 
 unsigned int __read_mostly cpu_khz;/* TSC clocks / usec, not used here */
 EXPORT_SYMBOL(cpu_khz);
@@ -1249,6 +1250,9 @@ static void tsc_refine_calibration_work(struct 
work_struct *work)
(unsigned long)tsc_khz / 1000,
(unsigned long)tsc_khz % 1000);
 
+   /* Inform the TSC deadline clockevent devices about the recalibration */
+ 

[GIT pull] timer fixes for 4.4

2015-12-13 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus


A single fix to unbreak a clocksource driver which has more than 32bit
counter width.

Thanks,

tglx

-->
Linus Walleij (1):
  clocksource: mmio: remove artificial 32bit limitation


 drivers/clocksource/mmio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clocksource/mmio.c b/drivers/clocksource/mmio.c
index 1593ade2a815..c4f7d7a9b689 100644
--- a/drivers/clocksource/mmio.c
+++ b/drivers/clocksource/mmio.c
@@ -55,7 +55,7 @@ int __init clocksource_mmio_init(void __iomem *base, const 
char *name,
 {
struct clocksource_mmio *cs;
 
-   if (bits > 32 || bits < 16)
+   if (bits > 64 || bits < 16)
return -EINVAL;
 
cs = kzalloc(sizeof(struct clocksource_mmio), GFP_KERNEL);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.4

2015-12-13 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus


A single fix to unbreak a clocksource driver which has more than 32bit
counter width.

Thanks,

tglx

-->
Linus Walleij (1):
  clocksource: mmio: remove artificial 32bit limitation


 drivers/clocksource/mmio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clocksource/mmio.c b/drivers/clocksource/mmio.c
index 1593ade2a815..c4f7d7a9b689 100644
--- a/drivers/clocksource/mmio.c
+++ b/drivers/clocksource/mmio.c
@@ -55,7 +55,7 @@ int __init clocksource_mmio_init(void __iomem *base, const 
char *name,
 {
struct clocksource_mmio *cs;
 
-   if (bits > 32 || bits < 16)
+   if (bits > 64 || bits < 16)
return -EINVAL;
 
cs = kzalloc(sizeof(struct clocksource_mmio), GFP_KERNEL);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.4

2015-11-21 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two timer fixlets from Arnd:
- Use proper constant size in the FSL timer driver
- Prevent a build error for legacy platforms

Thanks,

tglx

-->
Arnd Bergmann (2):
  clocksource/fsl: Avoid harmless 64-bit warnings
  clocksource: Disallow drivers for ARCH_USES_GETTIMEOFFSET


 drivers/clocksource/Kconfig | 1 +
 drivers/clocksource/fsl_ftm_timer.c | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 71cfdf7c9708..2eb5f0efae90 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -1,4 +1,5 @@
 menu "Clock Source drivers"
+   depends on !ARCH_USES_GETTIMEOFFSET
 
 config CLKSRC_OF
bool
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index 10202f1fdfd7..517e1c7624d4 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -203,7 +203,7 @@ static int __init ftm_clockevent_init(unsigned long freq, 
int irq)
int err;
 
ftm_writel(0x00, priv->clkevt_base + FTM_CNTIN);
-   ftm_writel(~0UL, priv->clkevt_base + FTM_MOD);
+   ftm_writel(~0u, priv->clkevt_base + FTM_MOD);
 
ftm_reset_counter(priv->clkevt_base);
 
@@ -230,7 +230,7 @@ static int __init ftm_clocksource_init(unsigned long freq)
int err;
 
ftm_writel(0x00, priv->clksrc_base + FTM_CNTIN);
-   ftm_writel(~0UL, priv->clksrc_base + FTM_MOD);
+   ftm_writel(~0u, priv->clksrc_base + FTM_MOD);
 
ftm_reset_counter(priv->clksrc_base);
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.4

2015-11-21 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two timer fixlets from Arnd:
- Use proper constant size in the FSL timer driver
- Prevent a build error for legacy platforms

Thanks,

tglx

-->
Arnd Bergmann (2):
  clocksource/fsl: Avoid harmless 64-bit warnings
  clocksource: Disallow drivers for ARCH_USES_GETTIMEOFFSET


 drivers/clocksource/Kconfig | 1 +
 drivers/clocksource/fsl_ftm_timer.c | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 71cfdf7c9708..2eb5f0efae90 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -1,4 +1,5 @@
 menu "Clock Source drivers"
+   depends on !ARCH_USES_GETTIMEOFFSET
 
 config CLKSRC_OF
bool
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index 10202f1fdfd7..517e1c7624d4 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -203,7 +203,7 @@ static int __init ftm_clockevent_init(unsigned long freq, 
int irq)
int err;
 
ftm_writel(0x00, priv->clkevt_base + FTM_CNTIN);
-   ftm_writel(~0UL, priv->clkevt_base + FTM_MOD);
+   ftm_writel(~0u, priv->clkevt_base + FTM_MOD);
 
ftm_reset_counter(priv->clkevt_base);
 
@@ -230,7 +230,7 @@ static int __init ftm_clocksource_init(unsigned long freq)
int err;
 
ftm_writel(0x00, priv->clksrc_base + FTM_CNTIN);
-   ftm_writel(~0UL, priv->clksrc_base + FTM_MOD);
+   ftm_writel(~0u, priv->clksrc_base + FTM_MOD);
 
ftm_reset_counter(priv->clksrc_base);
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.3

2015-11-01 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The last round of minimalistic fixes for clocksource drivers:

  - Prevent multiple shutdown of the sh_mtu2 clocksource

  - Annotate a bunch of clocksource/schedclock functions with notrace
to prevent an annoying ftrace recursion issue

Thanks,

tglx

-->
Jisheng Zhang (7):
  clocksource/drivers/arm_global_timer: Prevent ftrace recursion
  clocksource/drivers/pistachio: Prevent ftrace recursion
  clocksource/drivers/samsung_pwm_timer: Prevent ftrace recursion
  clocksource/drivers/prima2: Prevent ftrace recursion
  clocksource/drivers/vf_pit_timer: Prevent ftrace recursion
  clocksource/drivers/fsl_ftm_timer: Prevent ftrace recursion
  clocksource/drivers/digicolor: Prevent ftrace recursion

Magnus Damm (1):
  clocksource/drivers/sh_mtu2: Fix multiple shutdown call issue


 drivers/clocksource/arm_global_timer.c  | 9 +++--
 drivers/clocksource/fsl_ftm_timer.c | 2 +-
 drivers/clocksource/samsung_pwm_timer.c | 2 +-
 drivers/clocksource/sh_mtu2.c   | 4 +++-
 drivers/clocksource/time-pistachio.c| 3 ++-
 drivers/clocksource/timer-digicolor.c   | 2 +-
 drivers/clocksource/timer-prima2.c  | 2 +-
 drivers/clocksource/vf_pit_timer.c  | 2 +-
 8 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/arm_global_timer.c 
b/drivers/clocksource/arm_global_timer.c
index 29ea50ac366a..a2cb6fae9295 100644
--- a/drivers/clocksource/arm_global_timer.c
+++ b/drivers/clocksource/arm_global_timer.c
@@ -60,7 +60,7 @@ static struct clock_event_device __percpu *gt_evt;
  *  different to the 32-bit upper value read previously, go back to step 2.
  *  Otherwise the 64-bit timer counter value is correct.
  */
-static u64 gt_counter_read(void)
+static u64 notrace _gt_counter_read(void)
 {
u64 counter;
u32 lower;
@@ -79,6 +79,11 @@ static u64 gt_counter_read(void)
return counter;
 }
 
+static u64 gt_counter_read(void)
+{
+   return _gt_counter_read();
+}
+
 /**
  * To ensure that updates to comparator value register do not set the
  * Interrupt Status Register proceed as follows:
@@ -201,7 +206,7 @@ static struct clocksource gt_clocksource = {
 #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
 static u64 notrace gt_sched_clock_read(void)
 {
-   return gt_counter_read();
+   return _gt_counter_read();
 }
 #endif
 
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index ef434699c80a..10202f1fdfd7 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -118,7 +118,7 @@ static inline void ftm_reset_counter(void __iomem *base)
ftm_writel(0x00, base + FTM_CNT);
 }
 
-static u64 ftm_read_sched_clock(void)
+static u64 notrace ftm_read_sched_clock(void)
 {
return ftm_readl(priv->clksrc_base + FTM_CNT);
 }
diff --git a/drivers/clocksource/samsung_pwm_timer.c 
b/drivers/clocksource/samsung_pwm_timer.c
index bc90e13338cc..9502bc4c3f6d 100644
--- a/drivers/clocksource/samsung_pwm_timer.c
+++ b/drivers/clocksource/samsung_pwm_timer.c
@@ -307,7 +307,7 @@ static void samsung_clocksource_resume(struct clocksource 
*cs)
samsung_time_start(pwm.source_id, true);
 }
 
-static cycle_t samsung_clocksource_read(struct clocksource *c)
+static cycle_t notrace samsung_clocksource_read(struct clocksource *c)
 {
return ~readl_relaxed(pwm.source_reg);
 }
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index f1985da8113f..53aa7e92a7d7 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -280,7 +280,9 @@ static int sh_mtu2_clock_event_shutdown(struct 
clock_event_device *ced)
 {
struct sh_mtu2_channel *ch = ced_to_sh_mtu2(ced);
 
-   sh_mtu2_disable(ch);
+   if (clockevent_state_periodic(ced))
+   sh_mtu2_disable(ch);
+
return 0;
 }
 
diff --git a/drivers/clocksource/time-pistachio.c 
b/drivers/clocksource/time-pistachio.c
index 18d4266c2986..bba679900054 100644
--- a/drivers/clocksource/time-pistachio.c
+++ b/drivers/clocksource/time-pistachio.c
@@ -67,7 +67,8 @@ static inline void gpt_writel(void __iomem *base, u32 value, 
u32 offset,
writel(value, base + 0x20 * gpt_id + offset);
 }
 
-static cycle_t pistachio_clocksource_read_cycles(struct clocksource *cs)
+static cycle_t notrace
+pistachio_clocksource_read_cycles(struct clocksource *cs)
 {
struct pistachio_clocksource *pcs = to_pistachio_clocksource(cs);
u32 counter, overflw;
diff --git a/drivers/clocksource/timer-digicolor.c 
b/drivers/clocksource/timer-digicolor.c
index e73947f0f86d..a536eeb634d8 100644
--- a/drivers/clocksource/timer-digicolor.c
+++ b/drivers/clocksource/timer-digicolor.c
@@ -143,7 +143,7 @@ static irqreturn_t digicolor_timer_interrupt(int irq, void 
*dev_id)

[GIT pull] timer fixes for 4.3

2015-11-01 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The last round of minimalistic fixes for clocksource drivers:

  - Prevent multiple shutdown of the sh_mtu2 clocksource

  - Annotate a bunch of clocksource/schedclock functions with notrace
to prevent an annoying ftrace recursion issue

Thanks,

tglx

-->
Jisheng Zhang (7):
  clocksource/drivers/arm_global_timer: Prevent ftrace recursion
  clocksource/drivers/pistachio: Prevent ftrace recursion
  clocksource/drivers/samsung_pwm_timer: Prevent ftrace recursion
  clocksource/drivers/prima2: Prevent ftrace recursion
  clocksource/drivers/vf_pit_timer: Prevent ftrace recursion
  clocksource/drivers/fsl_ftm_timer: Prevent ftrace recursion
  clocksource/drivers/digicolor: Prevent ftrace recursion

Magnus Damm (1):
  clocksource/drivers/sh_mtu2: Fix multiple shutdown call issue


 drivers/clocksource/arm_global_timer.c  | 9 +++--
 drivers/clocksource/fsl_ftm_timer.c | 2 +-
 drivers/clocksource/samsung_pwm_timer.c | 2 +-
 drivers/clocksource/sh_mtu2.c   | 4 +++-
 drivers/clocksource/time-pistachio.c| 3 ++-
 drivers/clocksource/timer-digicolor.c   | 2 +-
 drivers/clocksource/timer-prima2.c  | 2 +-
 drivers/clocksource/vf_pit_timer.c  | 2 +-
 8 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/arm_global_timer.c 
b/drivers/clocksource/arm_global_timer.c
index 29ea50ac366a..a2cb6fae9295 100644
--- a/drivers/clocksource/arm_global_timer.c
+++ b/drivers/clocksource/arm_global_timer.c
@@ -60,7 +60,7 @@ static struct clock_event_device __percpu *gt_evt;
  *  different to the 32-bit upper value read previously, go back to step 2.
  *  Otherwise the 64-bit timer counter value is correct.
  */
-static u64 gt_counter_read(void)
+static u64 notrace _gt_counter_read(void)
 {
u64 counter;
u32 lower;
@@ -79,6 +79,11 @@ static u64 gt_counter_read(void)
return counter;
 }
 
+static u64 gt_counter_read(void)
+{
+   return _gt_counter_read();
+}
+
 /**
  * To ensure that updates to comparator value register do not set the
  * Interrupt Status Register proceed as follows:
@@ -201,7 +206,7 @@ static struct clocksource gt_clocksource = {
 #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
 static u64 notrace gt_sched_clock_read(void)
 {
-   return gt_counter_read();
+   return _gt_counter_read();
 }
 #endif
 
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
index ef434699c80a..10202f1fdfd7 100644
--- a/drivers/clocksource/fsl_ftm_timer.c
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -118,7 +118,7 @@ static inline void ftm_reset_counter(void __iomem *base)
ftm_writel(0x00, base + FTM_CNT);
 }
 
-static u64 ftm_read_sched_clock(void)
+static u64 notrace ftm_read_sched_clock(void)
 {
return ftm_readl(priv->clksrc_base + FTM_CNT);
 }
diff --git a/drivers/clocksource/samsung_pwm_timer.c 
b/drivers/clocksource/samsung_pwm_timer.c
index bc90e13338cc..9502bc4c3f6d 100644
--- a/drivers/clocksource/samsung_pwm_timer.c
+++ b/drivers/clocksource/samsung_pwm_timer.c
@@ -307,7 +307,7 @@ static void samsung_clocksource_resume(struct clocksource 
*cs)
samsung_time_start(pwm.source_id, true);
 }
 
-static cycle_t samsung_clocksource_read(struct clocksource *c)
+static cycle_t notrace samsung_clocksource_read(struct clocksource *c)
 {
return ~readl_relaxed(pwm.source_reg);
 }
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index f1985da8113f..53aa7e92a7d7 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -280,7 +280,9 @@ static int sh_mtu2_clock_event_shutdown(struct 
clock_event_device *ced)
 {
struct sh_mtu2_channel *ch = ced_to_sh_mtu2(ced);
 
-   sh_mtu2_disable(ch);
+   if (clockevent_state_periodic(ced))
+   sh_mtu2_disable(ch);
+
return 0;
 }
 
diff --git a/drivers/clocksource/time-pistachio.c 
b/drivers/clocksource/time-pistachio.c
index 18d4266c2986..bba679900054 100644
--- a/drivers/clocksource/time-pistachio.c
+++ b/drivers/clocksource/time-pistachio.c
@@ -67,7 +67,8 @@ static inline void gpt_writel(void __iomem *base, u32 value, 
u32 offset,
writel(value, base + 0x20 * gpt_id + offset);
 }
 
-static cycle_t pistachio_clocksource_read_cycles(struct clocksource *cs)
+static cycle_t notrace
+pistachio_clocksource_read_cycles(struct clocksource *cs)
 {
struct pistachio_clocksource *pcs = to_pistachio_clocksource(cs);
u32 counter, overflw;
diff --git a/drivers/clocksource/timer-digicolor.c 
b/drivers/clocksource/timer-digicolor.c
index e73947f0f86d..a536eeb634d8 100644
--- a/drivers/clocksource/timer-digicolor.c
+++ b/drivers/clocksource/timer-digicolor.c
@@ -143,7 +143,7 @@ static irqreturn_t digicolor_timer_interrupt(int irq, void 
*dev_id)

[GIT PULL] timer fixes

2015-10-03 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 67dfae0cd72fec5cd158b6e5fb1647b7dbe0834c clocksource: Fix abs() 
usage w/ 64bit values

An abs64() fix in the watchdog driver, and two clocksource driver NO_IRQ 
assumption fixes.

 Thanks,

Ingo

-->
Daniel Lezcano (2):
  clocksource/drivers/rockchip: Fix bad NO_IRQ usage
  clocksource/drivers/keystone: Fix bad NO_IRQ usage

John Stultz (1):
  clocksource: Fix abs() usage w/ 64bit values


 drivers/clocksource/rockchip_timer.c | 2 +-
 drivers/clocksource/timer-keystone.c | 2 +-
 kernel/time/clocksource.c| 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/clocksource/rockchip_timer.c 
b/drivers/clocksource/rockchip_timer.c
index bb2c2b050964..d3c1742ded1a 100644
--- a/drivers/clocksource/rockchip_timer.c
+++ b/drivers/clocksource/rockchip_timer.c
@@ -148,7 +148,7 @@ static void __init rk_timer_init(struct device_node *np)
bc_timer.freq = clk_get_rate(timer_clk);
 
irq = irq_of_parse_and_map(np, 0);
-   if (irq == NO_IRQ) {
+   if (!irq) {
pr_err("Failed to map interrupts for '%s'\n", TIMER_NAME);
return;
}
diff --git a/drivers/clocksource/timer-keystone.c 
b/drivers/clocksource/timer-keystone.c
index edacf3902e10..1cea08cf603e 100644
--- a/drivers/clocksource/timer-keystone.c
+++ b/drivers/clocksource/timer-keystone.c
@@ -152,7 +152,7 @@ static void __init keystone_timer_init(struct device_node 
*np)
int irq, error;
 
irq  = irq_of_parse_and_map(np, 0);
-   if (irq == NO_IRQ) {
+   if (!irq) {
pr_err("%s: failed to map interrupts\n", __func__);
return;
}
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 841b72f720e8..3a38775b50c2 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -217,7 +217,7 @@ static void clocksource_watchdog(unsigned long data)
continue;
 
/* Check the deviation from the watchdog clocksource. */
-   if ((abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD)) {
+   if (abs64(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD) {
pr_warn("timekeeping watchdog: Marking clocksource '%s' 
as unstable because the skew is too large:\n",
cs->name);
pr_warn("  '%s' wd_now: %llx 
wd_last: %llx mask: %llx\n",
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-10-03 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 67dfae0cd72fec5cd158b6e5fb1647b7dbe0834c clocksource: Fix abs() 
usage w/ 64bit values

An abs64() fix in the watchdog driver, and two clocksource driver NO_IRQ 
assumption fixes.

 Thanks,

Ingo

-->
Daniel Lezcano (2):
  clocksource/drivers/rockchip: Fix bad NO_IRQ usage
  clocksource/drivers/keystone: Fix bad NO_IRQ usage

John Stultz (1):
  clocksource: Fix abs() usage w/ 64bit values


 drivers/clocksource/rockchip_timer.c | 2 +-
 drivers/clocksource/timer-keystone.c | 2 +-
 kernel/time/clocksource.c| 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/clocksource/rockchip_timer.c 
b/drivers/clocksource/rockchip_timer.c
index bb2c2b050964..d3c1742ded1a 100644
--- a/drivers/clocksource/rockchip_timer.c
+++ b/drivers/clocksource/rockchip_timer.c
@@ -148,7 +148,7 @@ static void __init rk_timer_init(struct device_node *np)
bc_timer.freq = clk_get_rate(timer_clk);
 
irq = irq_of_parse_and_map(np, 0);
-   if (irq == NO_IRQ) {
+   if (!irq) {
pr_err("Failed to map interrupts for '%s'\n", TIMER_NAME);
return;
}
diff --git a/drivers/clocksource/timer-keystone.c 
b/drivers/clocksource/timer-keystone.c
index edacf3902e10..1cea08cf603e 100644
--- a/drivers/clocksource/timer-keystone.c
+++ b/drivers/clocksource/timer-keystone.c
@@ -152,7 +152,7 @@ static void __init keystone_timer_init(struct device_node 
*np)
int irq, error;
 
irq  = irq_of_parse_and_map(np, 0);
-   if (irq == NO_IRQ) {
+   if (!irq) {
pr_err("%s: failed to map interrupts\n", __func__);
return;
}
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 841b72f720e8..3a38775b50c2 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -217,7 +217,7 @@ static void clocksource_watchdog(unsigned long data)
continue;
 
/* Check the deviation from the watchdog clocksource. */
-   if ((abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD)) {
+   if (abs64(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD) {
pr_warn("timekeeping watchdog: Marking clocksource '%s' 
as unstable because the skew is too large:\n",
cs->name);
pr_warn("  '%s' wd_now: %llx 
wd_last: %llx mask: %llx\n",
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-09-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: eef7635a22f6b144206b5ca2f1398f637acffc4d clockevents: Remove unused 
set_mode() callback

An fix for an abs()/abs64() bug that caused too slow NTP convergence on 32-bit 
kernels, plus a removal of an obsolete clockevents driver facility after all 
users 
got converted during the merge window.

 Thanks,

Ingo

-->
John Stultz (1):
  time: Fix timekeeping_freqadjust()'s incorrect use of abs() instead of 
abs64()

Viresh Kumar (1):
  clockevents: Remove unused set_mode() callback


 include/linux/clockchips.h | 29 +
 kernel/time/clockevents.c  | 42 +---
 kernel/time/tick-common.c  |  1 -
 kernel/time/timekeeping.c  |  2 +-
 kernel/time/timer_list.c   | 54 +-
 5 files changed, 31 insertions(+), 97 deletions(-)

diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 31ce435981fe..bdcf358dfce2 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -18,15 +18,6 @@
 struct clock_event_device;
 struct module;
 
-/* Clock event mode commands for legacy ->set_mode(): OBSOLETE */
-enum clock_event_mode {
-   CLOCK_EVT_MODE_UNUSED,
-   CLOCK_EVT_MODE_SHUTDOWN,
-   CLOCK_EVT_MODE_PERIODIC,
-   CLOCK_EVT_MODE_ONESHOT,
-   CLOCK_EVT_MODE_RESUME,
-};
-
 /*
  * Possible states of a clock event device.
  *
@@ -86,16 +77,14 @@ enum clock_event_state {
  * @min_delta_ns:  minimum delta value in ns
  * @mult:  nanosecond to cycles multiplier
  * @shift: nanoseconds to cycles divisor (power of two)
- * @mode:  operating mode, relevant only to ->set_mode(), OBSOLETE
  * @state_use_accessors:current state of the device, assigned by the core code
  * @features:  features
  * @retries:   number of forced programming retries
- * @set_mode:  legacy set mode function, only for modes <= 
CLOCK_EVT_MODE_RESUME.
- * @set_state_periodic:switch state to periodic, if !set_mode
- * @set_state_oneshot: switch state to oneshot, if !set_mode
- * @set_state_oneshot_stopped: switch state to oneshot_stopped, if !set_mode
- * @set_state_shutdown:switch state to shutdown, if !set_mode
- * @tick_resume:   resume clkevt device, if !set_mode
+ * @set_state_periodic:switch state to periodic
+ * @set_state_oneshot: switch state to oneshot
+ * @set_state_oneshot_stopped: switch state to oneshot_stopped
+ * @set_state_shutdown:switch state to shutdown
+ * @tick_resume:   resume clkevt device
  * @broadcast: function to broadcast events
  * @min_delta_ticks:   minimum delta value in ticks stored for reconfiguration
  * @max_delta_ticks:   maximum delta value in ticks stored for reconfiguration
@@ -116,18 +105,10 @@ struct clock_event_device {
u64 min_delta_ns;
u32 mult;
u32 shift;
-   enum clock_event_mode   mode;
enum clock_event_state  state_use_accessors;
unsigned intfeatures;
unsigned long   retries;
 
-   /*
-* State transition callback(s): Only one of the two groups should be
-* defined:
-* - set_mode(), only for modes <= CLOCK_EVT_MODE_RESUME.
-* - set_state_{shutdown|periodic|oneshot|oneshot_stopped}(), 
tick_resume().
-*/
-   void(*set_mode)(enum clock_event_mode mode, struct 
clock_event_device *);
int (*set_state_periodic)(struct clock_event_device 
*);
int (*set_state_oneshot)(struct clock_event_device 
*);
int (*set_state_oneshot_stopped)(struct 
clock_event_device *);
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index 50eb107f1198..a9b76a40319e 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -97,20 +97,6 @@ EXPORT_SYMBOL_GPL(clockevent_delta2ns);
 static int __clockevents_switch_state(struct clock_event_device *dev,
  enum clock_event_state state)
 {
-   /* Transition with legacy set_mode() callback */
-   if (dev->set_mode) {
-   /* Legacy callback doesn't support new modes */
-   if (state > CLOCK_EVT_STATE_ONESHOT)
-   return -ENOSYS;
-   /*
-* 'clock_event_state' and 'clock_event_mode' have 1-to-1
-* mapping until *_ONESHOT, and so a simple cast will work.
-*/
-   dev->set_mode((enum clock_event_mode)state, dev);
-   dev->mode = (enum clock_event_mode)state;
-   return 0;
-   }
-
if (dev->features & CLOCK_EVT_FEAT_DUMMY)
return 0;
 
@@ 

[GIT PULL] timer fixes

2015-09-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: eef7635a22f6b144206b5ca2f1398f637acffc4d clockevents: Remove unused 
set_mode() callback

An fix for an abs()/abs64() bug that caused too slow NTP convergence on 32-bit 
kernels, plus a removal of an obsolete clockevents driver facility after all 
users 
got converted during the merge window.

 Thanks,

Ingo

-->
John Stultz (1):
  time: Fix timekeeping_freqadjust()'s incorrect use of abs() instead of 
abs64()

Viresh Kumar (1):
  clockevents: Remove unused set_mode() callback


 include/linux/clockchips.h | 29 +
 kernel/time/clockevents.c  | 42 +---
 kernel/time/tick-common.c  |  1 -
 kernel/time/timekeeping.c  |  2 +-
 kernel/time/timer_list.c   | 54 +-
 5 files changed, 31 insertions(+), 97 deletions(-)

diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 31ce435981fe..bdcf358dfce2 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -18,15 +18,6 @@
 struct clock_event_device;
 struct module;
 
-/* Clock event mode commands for legacy ->set_mode(): OBSOLETE */
-enum clock_event_mode {
-   CLOCK_EVT_MODE_UNUSED,
-   CLOCK_EVT_MODE_SHUTDOWN,
-   CLOCK_EVT_MODE_PERIODIC,
-   CLOCK_EVT_MODE_ONESHOT,
-   CLOCK_EVT_MODE_RESUME,
-};
-
 /*
  * Possible states of a clock event device.
  *
@@ -86,16 +77,14 @@ enum clock_event_state {
  * @min_delta_ns:  minimum delta value in ns
  * @mult:  nanosecond to cycles multiplier
  * @shift: nanoseconds to cycles divisor (power of two)
- * @mode:  operating mode, relevant only to ->set_mode(), OBSOLETE
  * @state_use_accessors:current state of the device, assigned by the core code
  * @features:  features
  * @retries:   number of forced programming retries
- * @set_mode:  legacy set mode function, only for modes <= 
CLOCK_EVT_MODE_RESUME.
- * @set_state_periodic:switch state to periodic, if !set_mode
- * @set_state_oneshot: switch state to oneshot, if !set_mode
- * @set_state_oneshot_stopped: switch state to oneshot_stopped, if !set_mode
- * @set_state_shutdown:switch state to shutdown, if !set_mode
- * @tick_resume:   resume clkevt device, if !set_mode
+ * @set_state_periodic:switch state to periodic
+ * @set_state_oneshot: switch state to oneshot
+ * @set_state_oneshot_stopped: switch state to oneshot_stopped
+ * @set_state_shutdown:switch state to shutdown
+ * @tick_resume:   resume clkevt device
  * @broadcast: function to broadcast events
  * @min_delta_ticks:   minimum delta value in ticks stored for reconfiguration
  * @max_delta_ticks:   maximum delta value in ticks stored for reconfiguration
@@ -116,18 +105,10 @@ struct clock_event_device {
u64 min_delta_ns;
u32 mult;
u32 shift;
-   enum clock_event_mode   mode;
enum clock_event_state  state_use_accessors;
unsigned intfeatures;
unsigned long   retries;
 
-   /*
-* State transition callback(s): Only one of the two groups should be
-* defined:
-* - set_mode(), only for modes <= CLOCK_EVT_MODE_RESUME.
-* - set_state_{shutdown|periodic|oneshot|oneshot_stopped}(), 
tick_resume().
-*/
-   void(*set_mode)(enum clock_event_mode mode, struct 
clock_event_device *);
int (*set_state_periodic)(struct clock_event_device 
*);
int (*set_state_oneshot)(struct clock_event_device 
*);
int (*set_state_oneshot_stopped)(struct 
clock_event_device *);
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index 50eb107f1198..a9b76a40319e 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -97,20 +97,6 @@ EXPORT_SYMBOL_GPL(clockevent_delta2ns);
 static int __clockevents_switch_state(struct clock_event_device *dev,
  enum clock_event_state state)
 {
-   /* Transition with legacy set_mode() callback */
-   if (dev->set_mode) {
-   /* Legacy callback doesn't support new modes */
-   if (state > CLOCK_EVT_STATE_ONESHOT)
-   return -ENOSYS;
-   /*
-* 'clock_event_state' and 'clock_event_mode' have 1-to-1
-* mapping until *_ONESHOT, and so a simple cast will work.
-*/
-   dev->set_mode((enum clock_event_mode)state, dev);
-   dev->mode = (enum clock_event_mode)state;
-   return 0;
-   }
-
if (dev->features & CLOCK_EVT_FEAT_DUMMY)
return 0;
 
@@ 

[GIT pull] timer fixes for 4.2

2015-08-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two minimalistic fixes for 4.2 regressions:

 - Eric fixed a thinko in the timer_list base switching code caused by
   the overhaul of the timer wheel. It can cause a cpu to see the
   wrong base for a timer while we move the timer around.

 - Guenter fixed a regression for IMX if booted w/o device tree, where
   the timer interrupt is not initialized and therefor the machine
   fails to boot.

Thanks,

tglx

-->
Eric Dumazet (1):
  timer: Write timer->flags atomically

Guenter Roeck (1):
  clocksource/imx: Fix boot with non-DT systems


 drivers/clocksource/timer-imx-gpt.c | 1 +
 kernel/time/timer.c | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/timer-imx-gpt.c 
b/drivers/clocksource/timer-imx-gpt.c
index 2d59038dec43..86c7eb66bdfb 100644
--- a/drivers/clocksource/timer-imx-gpt.c
+++ b/drivers/clocksource/timer-imx-gpt.c
@@ -462,6 +462,7 @@ void __init mxc_timer_init(unsigned long pbase, int irq, 
enum imx_gpt_type type)
BUG_ON(!imxtm->base);
 
imxtm->type = type;
+   imxtm->irq = irq;
 
_mxc_timer_init(imxtm);
 }
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 5e097fa9faf7..84190f02b521 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -807,8 +807,8 @@ __mod_timer(struct timer_list *timer, unsigned long expires,
spin_unlock(>lock);
base = new_base;
spin_lock(>lock);
-   timer->flags &= ~TIMER_BASEMASK;
-   timer->flags |= base->cpu;
+   WRITE_ONCE(timer->flags,
+  (timer->flags & ~TIMER_BASEMASK) | 
base->cpu);
}
}
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.2

2015-08-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two minimalistic fixes for 4.2 regressions:

 - Eric fixed a thinko in the timer_list base switching code caused by
   the overhaul of the timer wheel. It can cause a cpu to see the
   wrong base for a timer while we move the timer around.

 - Guenter fixed a regression for IMX if booted w/o device tree, where
   the timer interrupt is not initialized and therefor the machine
   fails to boot.

Thanks,

tglx

--
Eric Dumazet (1):
  timer: Write timer-flags atomically

Guenter Roeck (1):
  clocksource/imx: Fix boot with non-DT systems


 drivers/clocksource/timer-imx-gpt.c | 1 +
 kernel/time/timer.c | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/timer-imx-gpt.c 
b/drivers/clocksource/timer-imx-gpt.c
index 2d59038dec43..86c7eb66bdfb 100644
--- a/drivers/clocksource/timer-imx-gpt.c
+++ b/drivers/clocksource/timer-imx-gpt.c
@@ -462,6 +462,7 @@ void __init mxc_timer_init(unsigned long pbase, int irq, 
enum imx_gpt_type type)
BUG_ON(!imxtm-base);
 
imxtm-type = type;
+   imxtm-irq = irq;
 
_mxc_timer_init(imxtm);
 }
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 5e097fa9faf7..84190f02b521 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -807,8 +807,8 @@ __mod_timer(struct timer_list *timer, unsigned long expires,
spin_unlock(base-lock);
base = new_base;
spin_lock(base-lock);
-   timer-flags = ~TIMER_BASEMASK;
-   timer-flags |= base-cpu;
+   WRITE_ONCE(timer-flags,
+  (timer-flags  ~TIMER_BASEMASK) | 
base-cpu);
}
}
 
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 4.2

2015-07-01 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

This pull request contains:

 - a build regression fix introduced by the timeconst move
 - a hotplug regression fix introduced by the timer wheel diet
 - a cpu hotplug bug fix for the exynos clocksource driver

Thanks,

tglx

-->
Damian Eppel (1):
  clocksource: exynos_mct: Avoid blocking calls in the cpu hotplug notifier

Thomas Gleixner (2):
  timer: Fix hotplug regression
  time: Remove development rules from Kbuild/Makefile


 Kbuild   |  1 -
 drivers/clocksource/exynos_mct.c | 43 
 kernel/time/Makefile |  2 --
 kernel/time/timer.c  |  3 ++-
 4 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/Kbuild b/Kbuild
index df99a5f53beb..f55cefd9bf29 100644
--- a/Kbuild
+++ b/Kbuild
@@ -52,7 +52,6 @@ $(obj)/$(bounds-file): kernel/bounds.s FORCE
 
 timeconst-file := include/generated/timeconst.h
 
-#always  += $(timeconst-file)
 targets += $(timeconst-file)
 
 quiet_cmd_gentimeconst = GEN $@
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 935b05936dbd..9064ff743598 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -462,15 +462,12 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
 
if (mct_int_type == MCT_INT_SPI) {
-   evt->irq = mct_irqs[MCT_L0_IRQ + cpu];
-   if (request_irq(evt->irq, exynos4_mct_tick_isr,
-   IRQF_TIMER | IRQF_NOBALANCING,
-   evt->name, mevt)) {
-   pr_err("exynos-mct: cannot register IRQ %d\n",
-   evt->irq);
+
+   if (evt->irq == -1)
return -EIO;
-   }
-   irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu));
+
+   irq_force_affinity(evt->irq, cpumask_of(cpu));
+   enable_irq(evt->irq);
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -483,10 +480,12 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
 static void exynos4_local_timer_stop(struct clock_event_device *evt)
 {
evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
-   if (mct_int_type == MCT_INT_SPI)
-   free_irq(evt->irq, this_cpu_ptr(_mct_tick));
-   else
+   if (mct_int_type == MCT_INT_SPI) {
+   if (evt->irq != -1)
+   disable_irq_nosync(evt->irq);
+   } else {
disable_percpu_irq(mct_irqs[MCT_L0_IRQ]);
+   }
 }
 
 static int exynos4_mct_cpu_notify(struct notifier_block *self,
@@ -518,7 +517,7 @@ static struct notifier_block exynos4_mct_cpu_nb = {
 
 static void __init exynos4_timer_resources(struct device_node *np, void 
__iomem *base)
 {
-   int err;
+   int err, cpu;
struct mct_clock_event_device *mevt = this_cpu_ptr(_mct_tick);
struct clk *mct_clk, *tick_clk;
 
@@ -545,7 +544,25 @@ static void __init exynos4_timer_resources(struct 
device_node *np, void __iomem
WARN(err, "MCT: can't request IRQ %d (%d)\n",
 mct_irqs[MCT_L0_IRQ], err);
} else {
-   irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
+   for_each_possible_cpu(cpu) {
+   int mct_irq = mct_irqs[MCT_L0_IRQ + cpu];
+   struct mct_clock_event_device *pcpu_mevt =
+   per_cpu_ptr(_mct_tick, cpu);
+
+   pcpu_mevt->evt.irq = -1;
+
+   irq_set_status_flags(mct_irq, IRQ_NOAUTOEN);
+   if (request_irq(mct_irq,
+   exynos4_mct_tick_isr,
+   IRQF_TIMER | IRQF_NOBALANCING,
+   pcpu_mevt->name, pcpu_mevt)) {
+   pr_err("exynos-mct: cannot register IRQ 
(cpu%d)\n",
+   cpu);
+
+   continue;
+   }
+   pcpu_mevt->evt.irq = mct_irq;
+   }
}
 
err = register_cpu_notifier(_mct_cpu_nb);
diff --git a/kernel/time/Makefile b/kernel/time/Makefile
index ffc4cc3dcd47..49eca0beed32 100644
--- a/kernel/time/Makefile
+++ b/kernel/time/Makefile
@@ -12,5 +12,3 @@ obj-$(CONFIG_TICK_ONESHOT)+= 
tick-oneshot.o tick-sched.o
 obj-$(CONFIG_TIMER_STATS)  += timer_stats.o
 obj-$(CONFIG_DEBUG_FS) += timekeeping_debug.o
 obj-$(CONFIG_TEST_UDELAY)  += test_udelay.o

[GIT pull] timer fixes for 4.2

2015-07-01 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

This pull request contains:

 - a build regression fix introduced by the timeconst move
 - a hotplug regression fix introduced by the timer wheel diet
 - a cpu hotplug bug fix for the exynos clocksource driver

Thanks,

tglx

--
Damian Eppel (1):
  clocksource: exynos_mct: Avoid blocking calls in the cpu hotplug notifier

Thomas Gleixner (2):
  timer: Fix hotplug regression
  time: Remove development rules from Kbuild/Makefile


 Kbuild   |  1 -
 drivers/clocksource/exynos_mct.c | 43 
 kernel/time/Makefile |  2 --
 kernel/time/timer.c  |  3 ++-
 4 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/Kbuild b/Kbuild
index df99a5f53beb..f55cefd9bf29 100644
--- a/Kbuild
+++ b/Kbuild
@@ -52,7 +52,6 @@ $(obj)/$(bounds-file): kernel/bounds.s FORCE
 
 timeconst-file := include/generated/timeconst.h
 
-#always  += $(timeconst-file)
 targets += $(timeconst-file)
 
 quiet_cmd_gentimeconst = GEN $@
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 935b05936dbd..9064ff743598 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -462,15 +462,12 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
exynos4_mct_write(TICK_BASE_CNT, mevt-base + MCT_L_TCNTB_OFFSET);
 
if (mct_int_type == MCT_INT_SPI) {
-   evt-irq = mct_irqs[MCT_L0_IRQ + cpu];
-   if (request_irq(evt-irq, exynos4_mct_tick_isr,
-   IRQF_TIMER | IRQF_NOBALANCING,
-   evt-name, mevt)) {
-   pr_err(exynos-mct: cannot register IRQ %d\n,
-   evt-irq);
+
+   if (evt-irq == -1)
return -EIO;
-   }
-   irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu));
+
+   irq_force_affinity(evt-irq, cpumask_of(cpu));
+   enable_irq(evt-irq);
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -483,10 +480,12 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
 static void exynos4_local_timer_stop(struct clock_event_device *evt)
 {
evt-set_mode(CLOCK_EVT_MODE_UNUSED, evt);
-   if (mct_int_type == MCT_INT_SPI)
-   free_irq(evt-irq, this_cpu_ptr(percpu_mct_tick));
-   else
+   if (mct_int_type == MCT_INT_SPI) {
+   if (evt-irq != -1)
+   disable_irq_nosync(evt-irq);
+   } else {
disable_percpu_irq(mct_irqs[MCT_L0_IRQ]);
+   }
 }
 
 static int exynos4_mct_cpu_notify(struct notifier_block *self,
@@ -518,7 +517,7 @@ static struct notifier_block exynos4_mct_cpu_nb = {
 
 static void __init exynos4_timer_resources(struct device_node *np, void 
__iomem *base)
 {
-   int err;
+   int err, cpu;
struct mct_clock_event_device *mevt = this_cpu_ptr(percpu_mct_tick);
struct clk *mct_clk, *tick_clk;
 
@@ -545,7 +544,25 @@ static void __init exynos4_timer_resources(struct 
device_node *np, void __iomem
WARN(err, MCT: can't request IRQ %d (%d)\n,
 mct_irqs[MCT_L0_IRQ], err);
} else {
-   irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
+   for_each_possible_cpu(cpu) {
+   int mct_irq = mct_irqs[MCT_L0_IRQ + cpu];
+   struct mct_clock_event_device *pcpu_mevt =
+   per_cpu_ptr(percpu_mct_tick, cpu);
+
+   pcpu_mevt-evt.irq = -1;
+
+   irq_set_status_flags(mct_irq, IRQ_NOAUTOEN);
+   if (request_irq(mct_irq,
+   exynos4_mct_tick_isr,
+   IRQF_TIMER | IRQF_NOBALANCING,
+   pcpu_mevt-name, pcpu_mevt)) {
+   pr_err(exynos-mct: cannot register IRQ 
(cpu%d)\n,
+   cpu);
+
+   continue;
+   }
+   pcpu_mevt-evt.irq = mct_irq;
+   }
}
 
err = register_cpu_notifier(exynos4_mct_cpu_nb);
diff --git a/kernel/time/Makefile b/kernel/time/Makefile
index ffc4cc3dcd47..49eca0beed32 100644
--- a/kernel/time/Makefile
+++ b/kernel/time/Makefile
@@ -12,5 +12,3 @@ obj-$(CONFIG_TICK_ONESHOT)+= 
tick-oneshot.o tick-sched.o
 obj-$(CONFIG_TIMER_STATS)  += timer_stats.o
 obj-$(CONFIG_DEBUG_FS) += timekeeping_debug.o
 obj-$(CONFIG_TEST_UDELAY)  += 

[GIT PULL] timer fixes

2015-03-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 6e206020324c50a95486f6b279a53512febed92d clocksource/drivers/sun5i: 
Fix cpufreq interaction with sched_clock()

Two clocksource driver fixes, and an idle loop RCU warning fix.

 Thanks,

Ingo

-->
Maxime Ripard (1):
  clocksource/drivers/sun5i: Fix cpufreq interaction with sched_clock()

Preeti U Murthy (1):
  timers/tick/broadcast-hrtimer: Fix suspicious RCU usage in idle loop

Richard Weinberger (1):
  clocksource/drivers: Fix various !CONFIG_HAS_IOMEM build errors


 drivers/clocksource/Kconfig  |  3 +++
 drivers/clocksource/timer-sun5i.c|  7 ---
 kernel/time/tick-broadcast-hrtimer.c | 11 +--
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 68161f7a07d6..a0b036ccb118 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -192,6 +192,7 @@ config SYS_SUPPORTS_EM_STI
 config SH_TIMER_CMT
bool "Renesas CMT timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_CMT
help
  This enables build of a clocksource and clockevent driver for
@@ -201,6 +202,7 @@ config SH_TIMER_CMT
 config SH_TIMER_MTU2
bool "Renesas MTU2 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_MTU2
help
  This enables build of a clockevent driver for the Multi-Function
@@ -210,6 +212,7 @@ config SH_TIMER_MTU2
 config SH_TIMER_TMU
bool "Renesas TMU timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_TMU
help
  This enables build of a clocksource and clockevent driver for
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 5dcbf90b8015..58597fbcc046 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -17,7 +17,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -137,11 +136,6 @@ static struct irqaction sun5i_timer_irq = {
.dev_id = _clockevent,
 };
 
-static u64 sun5i_timer_sched_read(void)
-{
-   return ~readl(timer_base + TIMER_CNTVAL_LO_REG(1));
-}
-
 static void __init sun5i_timer_init(struct device_node *node)
 {
struct reset_control *rstc;
@@ -172,7 +166,6 @@ static void __init sun5i_timer_init(struct device_node 
*node)
writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD,
   timer_base + TIMER_CTL_REG(1));
 
-   sched_clock_register(sun5i_timer_sched_read, 32, rate);
clocksource_mmio_init(timer_base + TIMER_CNTVAL_LO_REG(1), node->name,
  rate, 340, 32, clocksource_mmio_readl_down);
 
diff --git a/kernel/time/tick-broadcast-hrtimer.c 
b/kernel/time/tick-broadcast-hrtimer.c
index eb682d5c697c..6aac4beedbbe 100644
--- a/kernel/time/tick-broadcast-hrtimer.c
+++ b/kernel/time/tick-broadcast-hrtimer.c
@@ -49,6 +49,7 @@ static void bc_set_mode(enum clock_event_mode mode,
  */
 static int bc_set_next(ktime_t expires, struct clock_event_device *bc)
 {
+   int bc_moved;
/*
 * We try to cancel the timer first. If the callback is on
 * flight on some other cpu then we let it handle it. If we
@@ -60,9 +61,15 @@ static int bc_set_next(ktime_t expires, struct 
clock_event_device *bc)
 * restart the timer because we are in the callback, but we
 * can set the expiry time and let the callback return
 * HRTIMER_RESTART.
+*
+* Since we are in the idle loop at this point and because
+* hrtimer_{start/cancel} functions call into tracing,
+* calls to these functions must be bound within RCU_NONIDLE.
 */
-   if (hrtimer_try_to_cancel() >= 0) {
-   hrtimer_start(, expires, HRTIMER_MODE_ABS_PINNED);
+   RCU_NONIDLE(bc_moved = (hrtimer_try_to_cancel() >= 0) ?
+   !hrtimer_start(, expires, HRTIMER_MODE_ABS_PINNED) :
+   0);
+   if (bc_moved) {
/* Bind the "device" to the cpu */
bc->bound_on = smp_processor_id();
} else if (bc->bound_on == smp_processor_id()) {
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-03-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 6e206020324c50a95486f6b279a53512febed92d clocksource/drivers/sun5i: 
Fix cpufreq interaction with sched_clock()

Two clocksource driver fixes, and an idle loop RCU warning fix.

 Thanks,

Ingo

--
Maxime Ripard (1):
  clocksource/drivers/sun5i: Fix cpufreq interaction with sched_clock()

Preeti U Murthy (1):
  timers/tick/broadcast-hrtimer: Fix suspicious RCU usage in idle loop

Richard Weinberger (1):
  clocksource/drivers: Fix various !CONFIG_HAS_IOMEM build errors


 drivers/clocksource/Kconfig  |  3 +++
 drivers/clocksource/timer-sun5i.c|  7 ---
 kernel/time/tick-broadcast-hrtimer.c | 11 +--
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 68161f7a07d6..a0b036ccb118 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -192,6 +192,7 @@ config SYS_SUPPORTS_EM_STI
 config SH_TIMER_CMT
bool Renesas CMT timer driver if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_CMT
help
  This enables build of a clocksource and clockevent driver for
@@ -201,6 +202,7 @@ config SH_TIMER_CMT
 config SH_TIMER_MTU2
bool Renesas MTU2 timer driver if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_MTU2
help
  This enables build of a clockevent driver for the Multi-Function
@@ -210,6 +212,7 @@ config SH_TIMER_MTU2
 config SH_TIMER_TMU
bool Renesas TMU timer driver if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
+   depends on HAS_IOMEM
default SYS_SUPPORTS_SH_TMU
help
  This enables build of a clocksource and clockevent driver for
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 5dcbf90b8015..58597fbcc046 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -17,7 +17,6 @@
 #include linux/irq.h
 #include linux/irqreturn.h
 #include linux/reset.h
-#include linux/sched_clock.h
 #include linux/of.h
 #include linux/of_address.h
 #include linux/of_irq.h
@@ -137,11 +136,6 @@ static struct irqaction sun5i_timer_irq = {
.dev_id = sun5i_clockevent,
 };
 
-static u64 sun5i_timer_sched_read(void)
-{
-   return ~readl(timer_base + TIMER_CNTVAL_LO_REG(1));
-}
-
 static void __init sun5i_timer_init(struct device_node *node)
 {
struct reset_control *rstc;
@@ -172,7 +166,6 @@ static void __init sun5i_timer_init(struct device_node 
*node)
writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD,
   timer_base + TIMER_CTL_REG(1));
 
-   sched_clock_register(sun5i_timer_sched_read, 32, rate);
clocksource_mmio_init(timer_base + TIMER_CNTVAL_LO_REG(1), node-name,
  rate, 340, 32, clocksource_mmio_readl_down);
 
diff --git a/kernel/time/tick-broadcast-hrtimer.c 
b/kernel/time/tick-broadcast-hrtimer.c
index eb682d5c697c..6aac4beedbbe 100644
--- a/kernel/time/tick-broadcast-hrtimer.c
+++ b/kernel/time/tick-broadcast-hrtimer.c
@@ -49,6 +49,7 @@ static void bc_set_mode(enum clock_event_mode mode,
  */
 static int bc_set_next(ktime_t expires, struct clock_event_device *bc)
 {
+   int bc_moved;
/*
 * We try to cancel the timer first. If the callback is on
 * flight on some other cpu then we let it handle it. If we
@@ -60,9 +61,15 @@ static int bc_set_next(ktime_t expires, struct 
clock_event_device *bc)
 * restart the timer because we are in the callback, but we
 * can set the expiry time and let the callback return
 * HRTIMER_RESTART.
+*
+* Since we are in the idle loop at this point and because
+* hrtimer_{start/cancel} functions call into tracing,
+* calls to these functions must be bound within RCU_NONIDLE.
 */
-   if (hrtimer_try_to_cancel(bctimer) = 0) {
-   hrtimer_start(bctimer, expires, HRTIMER_MODE_ABS_PINNED);
+   RCU_NONIDLE(bc_moved = (hrtimer_try_to_cancel(bctimer) = 0) ?
+   !hrtimer_start(bctimer, expires, HRTIMER_MODE_ABS_PINNED) :
+   0);
+   if (bc_moved) {
/* Bind the device to the cpu */
bc-bound_on = smp_processor_id();
} else if (bc-bound_on == smp_processor_id()) {
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-03-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 9ab2b7f3acfa5490f36c9e5774a2bfecd01943db Merge branch 
'clockevents/4.0-rc2' of http://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Two clocksource driver fixes.

 Thanks,

Ingo

-->
Yongbae Park (2):
  clocksource: efm32: Fix a NULL pointer dereference
  clockevents: sun5i: Fix setup_irq init sequence


 drivers/clocksource/time-efm32.c  | 4 ++--
 drivers/clocksource/timer-sun5i.c | 8 
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/clocksource/time-efm32.c b/drivers/clocksource/time-efm32.c
index bba62f9deefb..ec57ba2bbd87 100644
--- a/drivers/clocksource/time-efm32.c
+++ b/drivers/clocksource/time-efm32.c
@@ -225,12 +225,12 @@ static int __init efm32_clockevent_init(struct 
device_node *np)
clock_event_ddata.base = base;
clock_event_ddata.periodic_top = DIV_ROUND_CLOSEST(rate, 1024 * HZ);
 
-   setup_irq(irq, _clock_event_irq);
-
clockevents_config_and_register(_event_ddata.evtdev,
DIV_ROUND_CLOSEST(rate, 1024),
0xf, 0x);
 
+   setup_irq(irq, _clock_event_irq);
+
return 0;
 
 err_get_irq:
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 02268448dc85..5dcbf90b8015 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -178,10 +178,6 @@ static void __init sun5i_timer_init(struct device_node 
*node)
 
ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
 
-   ret = setup_irq(irq, _timer_irq);
-   if (ret)
-   pr_warn("failed to setup irq %d\n", irq);
-
/* Enable timer0 interrupt */
val = readl(timer_base + TIMER_IRQ_EN_REG);
writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG);
@@ -191,6 +187,10 @@ static void __init sun5i_timer_init(struct device_node 
*node)
 
clockevents_config_and_register(_clockevent, rate,
TIMER_SYNC_TICKS, 0x);
+
+   ret = setup_irq(irq, _timer_irq);
+   if (ret)
+   pr_warn("failed to setup irq %d\n", irq);
 }
 CLOCKSOURCE_OF_DECLARE(sun5i_a13, "allwinner,sun5i-a13-hstimer",
   sun5i_timer_init);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-03-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 9ab2b7f3acfa5490f36c9e5774a2bfecd01943db Merge branch 
'clockevents/4.0-rc2' of http://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Two clocksource driver fixes.

 Thanks,

Ingo

--
Yongbae Park (2):
  clocksource: efm32: Fix a NULL pointer dereference
  clockevents: sun5i: Fix setup_irq init sequence


 drivers/clocksource/time-efm32.c  | 4 ++--
 drivers/clocksource/timer-sun5i.c | 8 
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/clocksource/time-efm32.c b/drivers/clocksource/time-efm32.c
index bba62f9deefb..ec57ba2bbd87 100644
--- a/drivers/clocksource/time-efm32.c
+++ b/drivers/clocksource/time-efm32.c
@@ -225,12 +225,12 @@ static int __init efm32_clockevent_init(struct 
device_node *np)
clock_event_ddata.base = base;
clock_event_ddata.periodic_top = DIV_ROUND_CLOSEST(rate, 1024 * HZ);
 
-   setup_irq(irq, efm32_clock_event_irq);
-
clockevents_config_and_register(clock_event_ddata.evtdev,
DIV_ROUND_CLOSEST(rate, 1024),
0xf, 0x);
 
+   setup_irq(irq, efm32_clock_event_irq);
+
return 0;
 
 err_get_irq:
diff --git a/drivers/clocksource/timer-sun5i.c 
b/drivers/clocksource/timer-sun5i.c
index 02268448dc85..5dcbf90b8015 100644
--- a/drivers/clocksource/timer-sun5i.c
+++ b/drivers/clocksource/timer-sun5i.c
@@ -178,10 +178,6 @@ static void __init sun5i_timer_init(struct device_node 
*node)
 
ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
 
-   ret = setup_irq(irq, sun5i_timer_irq);
-   if (ret)
-   pr_warn(failed to setup irq %d\n, irq);
-
/* Enable timer0 interrupt */
val = readl(timer_base + TIMER_IRQ_EN_REG);
writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG);
@@ -191,6 +187,10 @@ static void __init sun5i_timer_init(struct device_node 
*node)
 
clockevents_config_and_register(sun5i_clockevent, rate,
TIMER_SYNC_TICKS, 0x);
+
+   ret = setup_irq(irq, sun5i_timer_irq);
+   if (ret)
+   pr_warn(failed to setup irq %d\n, irq);
 }
 CLOCKSOURCE_OF_DECLARE(sun5i_a13, allwinner,sun5i-a13-hstimer,
   sun5i_timer_init);
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-03-01 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: e3eff6fe7d8a877d94f5dbb8fea46b4f8ca4ce5a Merge branch 
'clockevents/4.0-rc1' of git://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Three clockevents/clocksource driver fixes.

 Thanks,

Ingo

-->
Daniel Lezcano (1):
  clockevents: asm9260: Fix compilation error with sparc/sparc64 
allyesconfig

Matthias Brugger (1):
  clocksource: mtk: Fix race conditions in probe code

Robert Jarzmik (1):
  clocksource: pxa: Fix section mismatch


 arch/arm/mach-asm9260/Kconfig   |  2 ++
 drivers/clocksource/Kconfig | 16 +---
 drivers/clocksource/mtk_timer.c |  9 +
 drivers/clocksource/pxa_timer.c |  2 +-
 4 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/arch/arm/mach-asm9260/Kconfig b/arch/arm/mach-asm9260/Kconfig
index 8423be76080e..52241207a82a 100644
--- a/arch/arm/mach-asm9260/Kconfig
+++ b/arch/arm/mach-asm9260/Kconfig
@@ -2,5 +2,7 @@ config MACH_ASM9260
bool "Alphascale ASM9260"
depends on ARCH_MULTI_V5
select CPU_ARM926T
+   select ASM9260_TIMER
+   select GENERIC_CLOCKEVENTS
help
  Support for Alphascale ASM9260 based platform.
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 1c2506f68122..68161f7a07d6 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -63,6 +63,11 @@ config VT8500_TIMER
 config CADENCE_TTC_TIMER
bool
 
+config ASM9260_TIMER
+   bool
+   select CLKSRC_MMIO
+   select CLKSRC_OF
+
 config CLKSRC_NOMADIK_MTU
bool
depends on (ARCH_NOMADIK || ARCH_U8500)
@@ -245,15 +250,4 @@ config CLKSRC_PXA
help
  This enables OST0 support available on PXA and SA-11x0
  platforms.
-
-config ASM9260_TIMER
-   bool "Alphascale ASM9260 timer driver"
-   depends on GENERIC_CLOCKEVENTS
-   select CLKSRC_MMIO
-   select CLKSRC_OF
-   default y if MACH_ASM9260
-   help
- This enables build of a clocksource and clockevent driver for
- the 32-bit System Timer hardware available on a Alphascale ASM9260.
-
 endmenu
diff --git a/drivers/clocksource/mtk_timer.c b/drivers/clocksource/mtk_timer.c
index 32a3d25795d3..68ab42356d0e 100644
--- a/drivers/clocksource/mtk_timer.c
+++ b/drivers/clocksource/mtk_timer.c
@@ -224,6 +224,8 @@ static void __init mtk_timer_init(struct device_node *node)
}
rate = clk_get_rate(clk);
 
+   mtk_timer_global_reset(evt);
+
if (request_irq(evt->dev.irq, mtk_timer_interrupt,
IRQF_TIMER | IRQF_IRQPOLL, "mtk_timer", evt)) {
pr_warn("failed to setup irq %d\n", evt->dev.irq);
@@ -232,8 +234,6 @@ static void __init mtk_timer_init(struct device_node *node)
 
evt->ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
 
-   mtk_timer_global_reset(evt);
-
/* Configure clock source */
mtk_timer_setup(evt, GPT_CLK_SRC, TIMER_CTRL_OP_FREERUN);
clocksource_mmio_init(evt->gpt_base + TIMER_CNT_REG(GPT_CLK_SRC),
@@ -241,10 +241,11 @@ static void __init mtk_timer_init(struct device_node 
*node)
 
/* Configure clock event */
mtk_timer_setup(evt, GPT_CLK_EVT, TIMER_CTRL_OP_REPEAT);
-   mtk_timer_enable_irq(evt, GPT_CLK_EVT);
-
clockevents_config_and_register(>dev, rate, 0x3,
0x);
+
+   mtk_timer_enable_irq(evt, GPT_CLK_EVT);
+
return;
 
 err_clk_disable:
diff --git a/drivers/clocksource/pxa_timer.c b/drivers/clocksource/pxa_timer.c
index 941f3f344e08..d9438af2bbd6 100644
--- a/drivers/clocksource/pxa_timer.c
+++ b/drivers/clocksource/pxa_timer.c
@@ -163,7 +163,7 @@ static struct irqaction pxa_ost0_irq = {
.dev_id = _pxa_osmr0,
 };
 
-static void pxa_timer_common_init(int irq, unsigned long clock_tick_rate)
+static void __init pxa_timer_common_init(int irq, unsigned long 
clock_tick_rate)
 {
timer_writel(0, OIER);
timer_writel(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2015-03-01 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: e3eff6fe7d8a877d94f5dbb8fea46b4f8ca4ce5a Merge branch 
'clockevents/4.0-rc1' of git://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Three clockevents/clocksource driver fixes.

 Thanks,

Ingo

--
Daniel Lezcano (1):
  clockevents: asm9260: Fix compilation error with sparc/sparc64 
allyesconfig

Matthias Brugger (1):
  clocksource: mtk: Fix race conditions in probe code

Robert Jarzmik (1):
  clocksource: pxa: Fix section mismatch


 arch/arm/mach-asm9260/Kconfig   |  2 ++
 drivers/clocksource/Kconfig | 16 +---
 drivers/clocksource/mtk_timer.c |  9 +
 drivers/clocksource/pxa_timer.c |  2 +-
 4 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/arch/arm/mach-asm9260/Kconfig b/arch/arm/mach-asm9260/Kconfig
index 8423be76080e..52241207a82a 100644
--- a/arch/arm/mach-asm9260/Kconfig
+++ b/arch/arm/mach-asm9260/Kconfig
@@ -2,5 +2,7 @@ config MACH_ASM9260
bool Alphascale ASM9260
depends on ARCH_MULTI_V5
select CPU_ARM926T
+   select ASM9260_TIMER
+   select GENERIC_CLOCKEVENTS
help
  Support for Alphascale ASM9260 based platform.
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 1c2506f68122..68161f7a07d6 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -63,6 +63,11 @@ config VT8500_TIMER
 config CADENCE_TTC_TIMER
bool
 
+config ASM9260_TIMER
+   bool
+   select CLKSRC_MMIO
+   select CLKSRC_OF
+
 config CLKSRC_NOMADIK_MTU
bool
depends on (ARCH_NOMADIK || ARCH_U8500)
@@ -245,15 +250,4 @@ config CLKSRC_PXA
help
  This enables OST0 support available on PXA and SA-11x0
  platforms.
-
-config ASM9260_TIMER
-   bool Alphascale ASM9260 timer driver
-   depends on GENERIC_CLOCKEVENTS
-   select CLKSRC_MMIO
-   select CLKSRC_OF
-   default y if MACH_ASM9260
-   help
- This enables build of a clocksource and clockevent driver for
- the 32-bit System Timer hardware available on a Alphascale ASM9260.
-
 endmenu
diff --git a/drivers/clocksource/mtk_timer.c b/drivers/clocksource/mtk_timer.c
index 32a3d25795d3..68ab42356d0e 100644
--- a/drivers/clocksource/mtk_timer.c
+++ b/drivers/clocksource/mtk_timer.c
@@ -224,6 +224,8 @@ static void __init mtk_timer_init(struct device_node *node)
}
rate = clk_get_rate(clk);
 
+   mtk_timer_global_reset(evt);
+
if (request_irq(evt-dev.irq, mtk_timer_interrupt,
IRQF_TIMER | IRQF_IRQPOLL, mtk_timer, evt)) {
pr_warn(failed to setup irq %d\n, evt-dev.irq);
@@ -232,8 +234,6 @@ static void __init mtk_timer_init(struct device_node *node)
 
evt-ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
 
-   mtk_timer_global_reset(evt);
-
/* Configure clock source */
mtk_timer_setup(evt, GPT_CLK_SRC, TIMER_CTRL_OP_FREERUN);
clocksource_mmio_init(evt-gpt_base + TIMER_CNT_REG(GPT_CLK_SRC),
@@ -241,10 +241,11 @@ static void __init mtk_timer_init(struct device_node 
*node)
 
/* Configure clock event */
mtk_timer_setup(evt, GPT_CLK_EVT, TIMER_CTRL_OP_REPEAT);
-   mtk_timer_enable_irq(evt, GPT_CLK_EVT);
-
clockevents_config_and_register(evt-dev, rate, 0x3,
0x);
+
+   mtk_timer_enable_irq(evt, GPT_CLK_EVT);
+
return;
 
 err_clk_disable:
diff --git a/drivers/clocksource/pxa_timer.c b/drivers/clocksource/pxa_timer.c
index 941f3f344e08..d9438af2bbd6 100644
--- a/drivers/clocksource/pxa_timer.c
+++ b/drivers/clocksource/pxa_timer.c
@@ -163,7 +163,7 @@ static struct irqaction pxa_ost0_irq = {
.dev_id = ckevt_pxa_osmr0,
 };
 
-static void pxa_timer_common_init(int irq, unsigned long clock_tick_rate)
+static void __init pxa_timer_common_init(int irq, unsigned long 
clock_tick_rate)
 {
timer_writel(0, OIER);
timer_writel(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR);
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.19

2015-01-25 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A set of small fixes:
  - Regression fix for exynos_mct clocksource
  - Trivial build fix for kona clocksource
  - Functional one liner fix for the sh_tmu clocksource
  - Two validation fixes to prevent (root only) data corruption in the
kernel via settimeofday and adjtimex. Tagged for stable.

Thanks,

tglx

-->
Magnus Damm (1):
  clocksource: sh_tmu: Set cpu_possible_mask to fix SMP broadcast

Olof Johansson (1):
  clocksource: kona: fix __iomem annotation

Sasha Levin (2):
  time: settimeofday: Validate the values of tv from user
  time: adjtimex: Validate the ADJ_FREQUENCY values

Tobias Jakobi (1):
  clocksource: exynos_mct: Fix bitmask regression for exynos4_mct_write


 drivers/clocksource/bcm_kona_timer.c |  9 -
 drivers/clocksource/exynos_mct.c |  4 ++--
 drivers/clocksource/sh_tmu.c |  2 +-
 include/linux/time.h | 13 +
 kernel/time/ntp.c|  7 +++
 kernel/time/time.c   |  4 
 6 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 0595dc6c453e..f1e33d08dd83 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -68,9 +68,8 @@ static void kona_timer_disable_and_clear(void __iomem *base)
 }
 
 static void
-kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw)
+kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
 {
-   void __iomem *base = IOMEM(timer_base);
int loop_limit = 4;
 
/*
@@ -86,9 +85,9 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
uint32_t *lsw)
 */
 
while (--loop_limit) {
-   *msw = readl(base + KONA_GPTIMER_STCHI_OFFSET);
-   *lsw = readl(base + KONA_GPTIMER_STCLO_OFFSET);
-   if (*msw == readl(base + KONA_GPTIMER_STCHI_OFFSET))
+   *msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
+   *lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
+   if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
break;
}
if (!loop_limit) {
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 9403061a2acc..83564c9cfdbe 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -97,8 +97,8 @@ static void exynos4_mct_write(unsigned int value, unsigned 
long offset)
writel_relaxed(value, reg_base + offset);
 
if (likely(offset >= EXYNOS4_MCT_L_BASE(0))) {
-   stat_addr = (offset & ~EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET;
-   switch (offset & EXYNOS4_MCT_L_MASK) {
+   stat_addr = (offset & EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET;
+   switch (offset & ~EXYNOS4_MCT_L_MASK) {
case MCT_L_TCON_OFFSET:
mask = 1 << 3;  /* L_TCON write status */
break;
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
index 0f665b8f2461..f150ca82bfaf 100644
--- a/drivers/clocksource/sh_tmu.c
+++ b/drivers/clocksource/sh_tmu.c
@@ -428,7 +428,7 @@ static void sh_tmu_register_clockevent(struct 
sh_tmu_channel *ch,
ced->features = CLOCK_EVT_FEAT_PERIODIC;
ced->features |= CLOCK_EVT_FEAT_ONESHOT;
ced->rating = 200;
-   ced->cpumask = cpumask_of(0);
+   ced->cpumask = cpu_possible_mask;
ced->set_next_event = sh_tmu_clock_event_next;
ced->set_mode = sh_tmu_clock_event_mode;
ced->suspend = sh_tmu_clock_event_suspend;
diff --git a/include/linux/time.h b/include/linux/time.h
index 203c2ad40d71..beebe3a02d43 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -110,6 +110,19 @@ static inline bool timespec_valid_strict(const struct 
timespec *ts)
return true;
 }
 
+static inline bool timeval_valid(const struct timeval *tv)
+{
+   /* Dates before 1970 are bogus */
+   if (tv->tv_sec < 0)
+   return false;
+
+   /* Can't have more microseconds then a second */
+   if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC)
+   return false;
+
+   return true;
+}
+
 extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
 
 #define CURRENT_TIME   (current_kernel_time())
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 87a346fd6d61..28bf91c60a0b 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -633,6 +633,13 @@ int ntp_validate_timex(struct timex *txc)
if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME)))
return -EPERM;
 
+   if (txc->modes & ADJ_FREQUENCY) {
+   if (LONG_MIN / PPM_SCALE > 

[GIT pull] timer fixes for 3.19

2015-01-25 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A set of small fixes:
  - Regression fix for exynos_mct clocksource
  - Trivial build fix for kona clocksource
  - Functional one liner fix for the sh_tmu clocksource
  - Two validation fixes to prevent (root only) data corruption in the
kernel via settimeofday and adjtimex. Tagged for stable.

Thanks,

tglx

--
Magnus Damm (1):
  clocksource: sh_tmu: Set cpu_possible_mask to fix SMP broadcast

Olof Johansson (1):
  clocksource: kona: fix __iomem annotation

Sasha Levin (2):
  time: settimeofday: Validate the values of tv from user
  time: adjtimex: Validate the ADJ_FREQUENCY values

Tobias Jakobi (1):
  clocksource: exynos_mct: Fix bitmask regression for exynos4_mct_write


 drivers/clocksource/bcm_kona_timer.c |  9 -
 drivers/clocksource/exynos_mct.c |  4 ++--
 drivers/clocksource/sh_tmu.c |  2 +-
 include/linux/time.h | 13 +
 kernel/time/ntp.c|  7 +++
 kernel/time/time.c   |  4 
 6 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 0595dc6c453e..f1e33d08dd83 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -68,9 +68,8 @@ static void kona_timer_disable_and_clear(void __iomem *base)
 }
 
 static void
-kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw)
+kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
 {
-   void __iomem *base = IOMEM(timer_base);
int loop_limit = 4;
 
/*
@@ -86,9 +85,9 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
uint32_t *lsw)
 */
 
while (--loop_limit) {
-   *msw = readl(base + KONA_GPTIMER_STCHI_OFFSET);
-   *lsw = readl(base + KONA_GPTIMER_STCLO_OFFSET);
-   if (*msw == readl(base + KONA_GPTIMER_STCHI_OFFSET))
+   *msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
+   *lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
+   if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
break;
}
if (!loop_limit) {
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 9403061a2acc..83564c9cfdbe 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -97,8 +97,8 @@ static void exynos4_mct_write(unsigned int value, unsigned 
long offset)
writel_relaxed(value, reg_base + offset);
 
if (likely(offset = EXYNOS4_MCT_L_BASE(0))) {
-   stat_addr = (offset  ~EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET;
-   switch (offset  EXYNOS4_MCT_L_MASK) {
+   stat_addr = (offset  EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET;
+   switch (offset  ~EXYNOS4_MCT_L_MASK) {
case MCT_L_TCON_OFFSET:
mask = 1  3;  /* L_TCON write status */
break;
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
index 0f665b8f2461..f150ca82bfaf 100644
--- a/drivers/clocksource/sh_tmu.c
+++ b/drivers/clocksource/sh_tmu.c
@@ -428,7 +428,7 @@ static void sh_tmu_register_clockevent(struct 
sh_tmu_channel *ch,
ced-features = CLOCK_EVT_FEAT_PERIODIC;
ced-features |= CLOCK_EVT_FEAT_ONESHOT;
ced-rating = 200;
-   ced-cpumask = cpumask_of(0);
+   ced-cpumask = cpu_possible_mask;
ced-set_next_event = sh_tmu_clock_event_next;
ced-set_mode = sh_tmu_clock_event_mode;
ced-suspend = sh_tmu_clock_event_suspend;
diff --git a/include/linux/time.h b/include/linux/time.h
index 203c2ad40d71..beebe3a02d43 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -110,6 +110,19 @@ static inline bool timespec_valid_strict(const struct 
timespec *ts)
return true;
 }
 
+static inline bool timeval_valid(const struct timeval *tv)
+{
+   /* Dates before 1970 are bogus */
+   if (tv-tv_sec  0)
+   return false;
+
+   /* Can't have more microseconds then a second */
+   if (tv-tv_usec  0 || tv-tv_usec = USEC_PER_SEC)
+   return false;
+
+   return true;
+}
+
 extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
 
 #define CURRENT_TIME   (current_kernel_time())
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 87a346fd6d61..28bf91c60a0b 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -633,6 +633,13 @@ int ntp_validate_timex(struct timex *txc)
if ((txc-modes  ADJ_SETOFFSET)  (!capable(CAP_SYS_TIME)))
return -EPERM;
 
+   if (txc-modes  ADJ_FREQUENCY) {
+   if (LONG_MIN / PPM_SCALE  txc-freq)
+   

[GIT pull] timer fixes for 3.17

2014-09-13 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The timer department is not too proud about the following fixes:

- Deal with a long standing rounding bug in the timeval to jiffies
  conversion. It's a real issue and this fix fell through the cracks
  for quite some time.

- Another round of alarmtimer fixes. Finally this code gets used more
  widely and the subtle issues hidden for quite some time are noticed
  and fixed. Nothing really exciting, just the itty bitty details
  which bite the serious users here and there.

Thanks,

tglx

-->
Andrew Hunter (1):
  jiffies: Fix timeval conversion to jiffies

Richard Larocque (3):
  alarmtimer: Return relative times in timer_gettime
  alarmtimer: Do not signal SIGEV_NONE timers
  alarmtimer: Lock k_itimer during timer callback


 include/linux/jiffies.h  | 12 ---
 kernel/time/alarmtimer.c | 34 +++--
 kernel/time/time.c   | 56 +++-
 3 files changed, 54 insertions(+), 48 deletions(-)

diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index 1f44466c1e9d..c367cbdf73ab 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -258,23 +258,11 @@ extern unsigned long preset_lpj;
 #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
 #endif
 #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
-#define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19)
 #define SEC_CONVERSION ((unsigned long)u64)NSEC_PER_SEC << SEC_JIFFIE_SC) 
+\
 TICK_NSEC -1) / (u64)TICK_NSEC))
 
 #define NSEC_CONVERSION ((unsigned long)u64)1 << NSEC_JIFFIE_SC) +\
 TICK_NSEC -1) / (u64)TICK_NSEC))
-#define USEC_CONVERSION  \
-((unsigned long)u64)NSEC_PER_USEC << USEC_JIFFIE_SC) +\
-TICK_NSEC -1) / (u64)TICK_NSEC))
-/*
- * USEC_ROUND is used in the timeval to jiffie conversion.  See there
- * for more details.  It is the scaled resolution rounding value.  Note
- * that it is a 64-bit value.  Since, when it is applied, we are already
- * in jiffies (albit scaled), it is nothing but the bits we will shift
- * off.
- */
-#define USEC_ROUND (u64)(((u64)1 << USEC_JIFFIE_SC) - 1)
 /*
  * The maximum jiffie value is (MAX_INT >> 1).  Here we translate that
  * into seconds.  The 64-bit case will overflow if we are not careful,
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 4aec4a457431..a7077d3ae52f 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -464,18 +464,26 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid)
 static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
ktime_t now)
 {
+   unsigned long flags;
struct k_itimer *ptr = container_of(alarm, struct k_itimer,
it.alarm.alarmtimer);
-   if (posix_timer_event(ptr, 0) != 0)
-   ptr->it_overrun++;
+   enum alarmtimer_restart result = ALARMTIMER_NORESTART;
+
+   spin_lock_irqsave(>it_lock, flags);
+   if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) {
+   if (posix_timer_event(ptr, 0) != 0)
+   ptr->it_overrun++;
+   }
 
/* Re-add periodic timers */
if (ptr->it.alarm.interval.tv64) {
ptr->it_overrun += alarm_forward(alarm, now,
ptr->it.alarm.interval);
-   return ALARMTIMER_RESTART;
+   result = ALARMTIMER_RESTART;
}
-   return ALARMTIMER_NORESTART;
+   spin_unlock_irqrestore(>it_lock, flags);
+
+   return result;
 }
 
 /**
@@ -541,18 +549,22 @@ static int alarm_timer_create(struct k_itimer *new_timer)
  * @new_timer: k_itimer pointer
  * @cur_setting: itimerspec data to fill
  *
- * Copies the itimerspec data out from the k_itimer
+ * Copies out the current itimerspec data
  */
 static void alarm_timer_get(struct k_itimer *timr,
struct itimerspec *cur_setting)
 {
-   memset(cur_setting, 0, sizeof(struct itimerspec));
+   ktime_t relative_expiry_time =
+   alarm_expires_remaining(&(timr->it.alarm.alarmtimer));
+
+   if (ktime_to_ns(relative_expiry_time) > 0) {
+   cur_setting->it_value = ktime_to_timespec(relative_expiry_time);
+   } else {
+   cur_setting->it_value.tv_sec = 0;
+   cur_setting->it_value.tv_nsec = 0;
+   }
 
-   cur_setting->it_interval =
-   ktime_to_timespec(timr->it.alarm.interval);
-   cur_setting->it_value =
-   ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires);
-   return;
+   cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval);

[GIT pull] timer fixes for 3.17

2014-09-13 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The timer department is not too proud about the following fixes:

- Deal with a long standing rounding bug in the timeval to jiffies
  conversion. It's a real issue and this fix fell through the cracks
  for quite some time.

- Another round of alarmtimer fixes. Finally this code gets used more
  widely and the subtle issues hidden for quite some time are noticed
  and fixed. Nothing really exciting, just the itty bitty details
  which bite the serious users here and there.

Thanks,

tglx

--
Andrew Hunter (1):
  jiffies: Fix timeval conversion to jiffies

Richard Larocque (3):
  alarmtimer: Return relative times in timer_gettime
  alarmtimer: Do not signal SIGEV_NONE timers
  alarmtimer: Lock k_itimer during timer callback


 include/linux/jiffies.h  | 12 ---
 kernel/time/alarmtimer.c | 34 +++--
 kernel/time/time.c   | 56 +++-
 3 files changed, 54 insertions(+), 48 deletions(-)

diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index 1f44466c1e9d..c367cbdf73ab 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -258,23 +258,11 @@ extern unsigned long preset_lpj;
 #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
 #endif
 #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
-#define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19)
 #define SEC_CONVERSION ((unsigned long)u64)NSEC_PER_SEC  SEC_JIFFIE_SC) 
+\
 TICK_NSEC -1) / (u64)TICK_NSEC))
 
 #define NSEC_CONVERSION ((unsigned long)u64)1  NSEC_JIFFIE_SC) +\
 TICK_NSEC -1) / (u64)TICK_NSEC))
-#define USEC_CONVERSION  \
-((unsigned long)u64)NSEC_PER_USEC  USEC_JIFFIE_SC) +\
-TICK_NSEC -1) / (u64)TICK_NSEC))
-/*
- * USEC_ROUND is used in the timeval to jiffie conversion.  See there
- * for more details.  It is the scaled resolution rounding value.  Note
- * that it is a 64-bit value.  Since, when it is applied, we are already
- * in jiffies (albit scaled), it is nothing but the bits we will shift
- * off.
- */
-#define USEC_ROUND (u64)(((u64)1  USEC_JIFFIE_SC) - 1)
 /*
  * The maximum jiffie value is (MAX_INT  1).  Here we translate that
  * into seconds.  The 64-bit case will overflow if we are not careful,
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 4aec4a457431..a7077d3ae52f 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -464,18 +464,26 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid)
 static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
ktime_t now)
 {
+   unsigned long flags;
struct k_itimer *ptr = container_of(alarm, struct k_itimer,
it.alarm.alarmtimer);
-   if (posix_timer_event(ptr, 0) != 0)
-   ptr-it_overrun++;
+   enum alarmtimer_restart result = ALARMTIMER_NORESTART;
+
+   spin_lock_irqsave(ptr-it_lock, flags);
+   if ((ptr-it_sigev_notify  ~SIGEV_THREAD_ID) != SIGEV_NONE) {
+   if (posix_timer_event(ptr, 0) != 0)
+   ptr-it_overrun++;
+   }
 
/* Re-add periodic timers */
if (ptr-it.alarm.interval.tv64) {
ptr-it_overrun += alarm_forward(alarm, now,
ptr-it.alarm.interval);
-   return ALARMTIMER_RESTART;
+   result = ALARMTIMER_RESTART;
}
-   return ALARMTIMER_NORESTART;
+   spin_unlock_irqrestore(ptr-it_lock, flags);
+
+   return result;
 }
 
 /**
@@ -541,18 +549,22 @@ static int alarm_timer_create(struct k_itimer *new_timer)
  * @new_timer: k_itimer pointer
  * @cur_setting: itimerspec data to fill
  *
- * Copies the itimerspec data out from the k_itimer
+ * Copies out the current itimerspec data
  */
 static void alarm_timer_get(struct k_itimer *timr,
struct itimerspec *cur_setting)
 {
-   memset(cur_setting, 0, sizeof(struct itimerspec));
+   ktime_t relative_expiry_time =
+   alarm_expires_remaining((timr-it.alarm.alarmtimer));
+
+   if (ktime_to_ns(relative_expiry_time)  0) {
+   cur_setting-it_value = ktime_to_timespec(relative_expiry_time);
+   } else {
+   cur_setting-it_value.tv_sec = 0;
+   cur_setting-it_value.tv_nsec = 0;
+   }
 
-   cur_setting-it_interval =
-   ktime_to_timespec(timr-it.alarm.interval);
-   cur_setting-it_value =
-   ktime_to_timespec(timr-it.alarm.alarmtimer.node.expires);
-   return;
+   cur_setting-it_interval = ktime_to_timespec(timr-it.alarm.interval);
 }
 
 /**
diff --git 

[GIT pull] timer fixes for 3.16

2014-08-03 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two fixes in the timer area:
* A long standing lock inversion due to a printk
* Suspend related hrtimer corruption in sched_clock

Thanks,

tglx

-->
Jan Kara (1):
  timer: Fix lock inversion between hrtimer_bases.lock and scheduler locks

Stephen Boyd (1):
  sched_clock: Avoid corrupting hrtimer tree during suspend


 kernel/time/clockevents.c | 10 ++
 kernel/time/sched_clock.c |  4 +++-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index ad362c2..9c94c19 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -146,7 +146,8 @@ static int clockevents_increase_min_delta(struct 
clock_event_device *dev)
 {
/* Nothing to do if we already reached the limit */
if (dev->min_delta_ns >= MIN_DELTA_LIMIT) {
-   printk(KERN_WARNING "CE: Reprogramming failure. Giving up\n");
+   printk_deferred(KERN_WARNING
+   "CE: Reprogramming failure. Giving up\n");
dev->next_event.tv64 = KTIME_MAX;
return -ETIME;
}
@@ -159,9 +160,10 @@ static int clockevents_increase_min_delta(struct 
clock_event_device *dev)
if (dev->min_delta_ns > MIN_DELTA_LIMIT)
dev->min_delta_ns = MIN_DELTA_LIMIT;
 
-   printk(KERN_WARNING "CE: %s increased min_delta_ns to %llu nsec\n",
-  dev->name ? dev->name : "?",
-  (unsigned long long) dev->min_delta_ns);
+   printk_deferred(KERN_WARNING
+   "CE: %s increased min_delta_ns to %llu nsec\n",
+   dev->name ? dev->name : "?",
+   (unsigned long long) dev->min_delta_ns);
return 0;
 }
 
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 445106d..01d2d15 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -191,7 +191,8 @@ void __init sched_clock_postinit(void)
 
 static int sched_clock_suspend(void)
 {
-   sched_clock_poll(_clock_timer);
+   update_sched_clock();
+   hrtimer_cancel(_clock_timer);
cd.suspended = true;
return 0;
 }
@@ -199,6 +200,7 @@ static int sched_clock_suspend(void)
 static void sched_clock_resume(void)
 {
cd.epoch_cyc = read_sched_clock();
+   hrtimer_start(_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
cd.suspended = false;
 }
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.16

2014-08-03 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two fixes in the timer area:
* A long standing lock inversion due to a printk
* Suspend related hrtimer corruption in sched_clock

Thanks,

tglx

--
Jan Kara (1):
  timer: Fix lock inversion between hrtimer_bases.lock and scheduler locks

Stephen Boyd (1):
  sched_clock: Avoid corrupting hrtimer tree during suspend


 kernel/time/clockevents.c | 10 ++
 kernel/time/sched_clock.c |  4 +++-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index ad362c2..9c94c19 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -146,7 +146,8 @@ static int clockevents_increase_min_delta(struct 
clock_event_device *dev)
 {
/* Nothing to do if we already reached the limit */
if (dev-min_delta_ns = MIN_DELTA_LIMIT) {
-   printk(KERN_WARNING CE: Reprogramming failure. Giving up\n);
+   printk_deferred(KERN_WARNING
+   CE: Reprogramming failure. Giving up\n);
dev-next_event.tv64 = KTIME_MAX;
return -ETIME;
}
@@ -159,9 +160,10 @@ static int clockevents_increase_min_delta(struct 
clock_event_device *dev)
if (dev-min_delta_ns  MIN_DELTA_LIMIT)
dev-min_delta_ns = MIN_DELTA_LIMIT;
 
-   printk(KERN_WARNING CE: %s increased min_delta_ns to %llu nsec\n,
-  dev-name ? dev-name : ?,
-  (unsigned long long) dev-min_delta_ns);
+   printk_deferred(KERN_WARNING
+   CE: %s increased min_delta_ns to %llu nsec\n,
+   dev-name ? dev-name : ?,
+   (unsigned long long) dev-min_delta_ns);
return 0;
 }
 
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 445106d..01d2d15 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -191,7 +191,8 @@ void __init sched_clock_postinit(void)
 
 static int sched_clock_suspend(void)
 {
-   sched_clock_poll(sched_clock_timer);
+   update_sched_clock();
+   hrtimer_cancel(sched_clock_timer);
cd.suspended = true;
return 0;
 }
@@ -199,6 +200,7 @@ static int sched_clock_suspend(void)
 static void sched_clock_resume(void)
 {
cd.epoch_cyc = read_sched_clock();
+   hrtimer_start(sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
cd.suspended = false;
 }
 
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-05-27 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixlets for ARM SoC clocksource drivers:

* Avoid calling functions which might sleep from interrupt [disabled]
  context in tcb_clksrc used on Atmel SoCs.

* Use irq_force_affinity() to pin the per cpu timer interrupt on a not
  yet online cpu in the SiRFprimaII driver.

Thanks,

tglx

-->
David Jander (1):
  clocksource: tcb_clksrc: Make tc_mode interrupt safe

Zhiwu Song (1):
  clocksource: marco: Fix the affinity set for local timer of CPU1


 drivers/clocksource/tcb_clksrc.c  |8 
 drivers/clocksource/timer-marco.c |2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c
index 00fdd11..a8d7ea1 100644
--- a/drivers/clocksource/tcb_clksrc.c
+++ b/drivers/clocksource/tcb_clksrc.c
@@ -100,7 +100,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
|| tcd->clkevt.mode == CLOCK_EVT_MODE_ONESHOT) {
__raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR));
__raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR));
-   clk_disable_unprepare(tcd->clk);
+   clk_disable(tcd->clk);
}
 
switch (m) {
@@ -109,7 +109,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
 * of oneshot, we get lower overhead and improved accuracy.
 */
case CLOCK_EVT_MODE_PERIODIC:
-   clk_prepare_enable(tcd->clk);
+   clk_enable(tcd->clk);
 
/* slow clock, count up to RC, then irq and restart */
__raw_writel(timer_clock
@@ -126,7 +126,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
break;
 
case CLOCK_EVT_MODE_ONESHOT:
-   clk_prepare_enable(tcd->clk);
+   clk_enable(tcd->clk);
 
/* slow clock, count up to RC, then irq and stop */
__raw_writel(timer_clock | ATMEL_TC_CPCSTOP
@@ -194,7 +194,7 @@ static int __init setup_clkevents(struct atmel_tc *tc, int 
clk32k_divisor_idx)
ret = clk_prepare_enable(t2_clk);
if (ret)
return ret;
-   clk_disable_unprepare(t2_clk);
+   clk_disable(t2_clk);
 
clkevt.regs = tc->regs;
clkevt.clk = t2_clk;
diff --git a/drivers/clocksource/timer-marco.c 
b/drivers/clocksource/timer-marco.c
index b52e1c0..7f5374d 100644
--- a/drivers/clocksource/timer-marco.c
+++ b/drivers/clocksource/timer-marco.c
@@ -199,7 +199,7 @@ static int sirfsoc_local_timer_setup(struct 
clock_event_device *ce)
 
action->dev_id = ce;
BUG_ON(setup_irq(ce->irq, action));
-   irq_set_affinity(action->irq, cpumask_of(cpu));
+   irq_force_affinity(action->irq, cpumask_of(cpu));
 
clockevents_register_device(ce);
return 0;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-05-27 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Two small fixlets for ARM SoC clocksource drivers:

* Avoid calling functions which might sleep from interrupt [disabled]
  context in tcb_clksrc used on Atmel SoCs.

* Use irq_force_affinity() to pin the per cpu timer interrupt on a not
  yet online cpu in the SiRFprimaII driver.

Thanks,

tglx

--
David Jander (1):
  clocksource: tcb_clksrc: Make tc_mode interrupt safe

Zhiwu Song (1):
  clocksource: marco: Fix the affinity set for local timer of CPU1


 drivers/clocksource/tcb_clksrc.c  |8 
 drivers/clocksource/timer-marco.c |2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c
index 00fdd11..a8d7ea1 100644
--- a/drivers/clocksource/tcb_clksrc.c
+++ b/drivers/clocksource/tcb_clksrc.c
@@ -100,7 +100,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
|| tcd-clkevt.mode == CLOCK_EVT_MODE_ONESHOT) {
__raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR));
__raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR));
-   clk_disable_unprepare(tcd-clk);
+   clk_disable(tcd-clk);
}
 
switch (m) {
@@ -109,7 +109,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
 * of oneshot, we get lower overhead and improved accuracy.
 */
case CLOCK_EVT_MODE_PERIODIC:
-   clk_prepare_enable(tcd-clk);
+   clk_enable(tcd-clk);
 
/* slow clock, count up to RC, then irq and restart */
__raw_writel(timer_clock
@@ -126,7 +126,7 @@ static void tc_mode(enum clock_event_mode m, struct 
clock_event_device *d)
break;
 
case CLOCK_EVT_MODE_ONESHOT:
-   clk_prepare_enable(tcd-clk);
+   clk_enable(tcd-clk);
 
/* slow clock, count up to RC, then irq and stop */
__raw_writel(timer_clock | ATMEL_TC_CPCSTOP
@@ -194,7 +194,7 @@ static int __init setup_clkevents(struct atmel_tc *tc, int 
clk32k_divisor_idx)
ret = clk_prepare_enable(t2_clk);
if (ret)
return ret;
-   clk_disable_unprepare(t2_clk);
+   clk_disable(t2_clk);
 
clkevt.regs = tc-regs;
clkevt.clk = t2_clk;
diff --git a/drivers/clocksource/timer-marco.c 
b/drivers/clocksource/timer-marco.c
index b52e1c0..7f5374d 100644
--- a/drivers/clocksource/timer-marco.c
+++ b/drivers/clocksource/timer-marco.c
@@ -199,7 +199,7 @@ static int sirfsoc_local_timer_setup(struct 
clock_event_device *ce)
 
action-dev_id = ce;
BUG_ON(setup_irq(ce-irq, action));
-   irq_set_affinity(action-irq, cpumask_of(cpu));
+   irq_force_affinity(action-irq, cpumask_of(cpu));
 
clockevents_register_device(ce);
return 0;
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-05-17 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A single bug fix for a long standing issue:

 * Updating the expiry value of a relative timer _after_ letting the
   idle logic select a target cpu for the timer based on its stale
   expiry value is outright stupid. Thanks to Viresh for spotting the
   brainfart.

Thanks,

tglx

-->
Viresh Kumar (1):
  hrtimer: Set expiry time before switch_hrtimer_base()


 kernel/hrtimer.c |8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 6b715c0..e0501fe 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -990,11 +990,8 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, 
ktime_t tim,
/* Remove an active timer from the queue: */
ret = remove_hrtimer(timer, base);
 
-   /* Switch the timer base, if necessary: */
-   new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
-
if (mode & HRTIMER_MODE_REL) {
-   tim = ktime_add_safe(tim, new_base->get_time());
+   tim = ktime_add_safe(tim, base->get_time());
/*
 * CONFIG_TIME_LOW_RES is a temporary way for architectures
 * to signal that they simply return xtime in
@@ -1009,6 +1006,9 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, 
ktime_t tim,
 
hrtimer_set_expires_range_ns(timer, tim, delta_ns);
 
+   /* Switch the timer base, if necessary: */
+   new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
+
timer_stats_hrtimer_set_start_info(timer);
 
leftmost = enqueue_hrtimer(timer, new_base);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-05-17 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

A single bug fix for a long standing issue:

 * Updating the expiry value of a relative timer _after_ letting the
   idle logic select a target cpu for the timer based on its stale
   expiry value is outright stupid. Thanks to Viresh for spotting the
   brainfart.

Thanks,

tglx

--
Viresh Kumar (1):
  hrtimer: Set expiry time before switch_hrtimer_base()


 kernel/hrtimer.c |8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 6b715c0..e0501fe 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -990,11 +990,8 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, 
ktime_t tim,
/* Remove an active timer from the queue: */
ret = remove_hrtimer(timer, base);
 
-   /* Switch the timer base, if necessary: */
-   new_base = switch_hrtimer_base(timer, base, mode  HRTIMER_MODE_PINNED);
-
if (mode  HRTIMER_MODE_REL) {
-   tim = ktime_add_safe(tim, new_base-get_time());
+   tim = ktime_add_safe(tim, base-get_time());
/*
 * CONFIG_TIME_LOW_RES is a temporary way for architectures
 * to signal that they simply return xtime in
@@ -1009,6 +1006,9 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, 
ktime_t tim,
 
hrtimer_set_expires_range_ns(timer, tim, delta_ns);
 
+   /* Switch the timer base, if necessary: */
+   new_base = switch_hrtimer_base(timer, base, mode  HRTIMER_MODE_PINNED);
+
timer_stats_hrtimer_set_start_info(timer);
 
leftmost = enqueue_hrtimer(timer, new_base);
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-04-17 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Viresh unearthed the following three hickups in the timer/timekeeping
code:

- Negated check for the result of a clock event selection

- A missing early exit in the jiffies update path which causes
  update_wall_time to be called for nothing causing lock contention
  and wasted cycles in the timer interrupt

- Checking a variable in the NOHZ code enable code for true which can
  only be set by that very code after the check succeeds. That results
  in a rock solid runtime disablement of that feature.

Thanks,

tglx

-->
Viresh Kumar (3):
  tick-common: Fix wrong check in tick_check_replacement()
  tick-sched: Don't call update_wall_time() when delta is lesser than 
tick_period
  tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz()


 kernel/time/tick-common.c |2 +-
 kernel/time/tick-sched.c  |5 -
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index 0156612..0a0608e 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -276,7 +276,7 @@ static bool tick_check_preferred(struct clock_event_device 
*curdev,
 bool tick_check_replacement(struct clock_event_device *curdev,
struct clock_event_device *newdev)
 {
-   if (tick_check_percpu(curdev, newdev, smp_processor_id()))
+   if (!tick_check_percpu(curdev, newdev, smp_processor_id()))
return false;
 
return tick_check_preferred(curdev, newdev);
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 9f8af69..6558b7a 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -84,6 +84,9 @@ static void tick_do_update_jiffies64(ktime_t now)
 
/* Keep the tick_next_period variable up to date */
tick_next_period = ktime_add(last_jiffies_update, tick_period);
+   } else {
+   write_sequnlock(_lock);
+   return;
}
write_sequnlock(_lock);
update_wall_time();
@@ -967,7 +970,7 @@ static void tick_nohz_switch_to_nohz(void)
struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
ktime_t next;
 
-   if (!tick_nohz_active)
+   if (!tick_nohz_enabled)
return;
 
local_irq_disable();
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT pull] timer fixes for 3.15

2014-04-17 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

Viresh unearthed the following three hickups in the timer/timekeeping
code:

- Negated check for the result of a clock event selection

- A missing early exit in the jiffies update path which causes
  update_wall_time to be called for nothing causing lock contention
  and wasted cycles in the timer interrupt

- Checking a variable in the NOHZ code enable code for true which can
  only be set by that very code after the check succeeds. That results
  in a rock solid runtime disablement of that feature.

Thanks,

tglx

--
Viresh Kumar (3):
  tick-common: Fix wrong check in tick_check_replacement()
  tick-sched: Don't call update_wall_time() when delta is lesser than 
tick_period
  tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz()


 kernel/time/tick-common.c |2 +-
 kernel/time/tick-sched.c  |5 -
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index 0156612..0a0608e 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -276,7 +276,7 @@ static bool tick_check_preferred(struct clock_event_device 
*curdev,
 bool tick_check_replacement(struct clock_event_device *curdev,
struct clock_event_device *newdev)
 {
-   if (tick_check_percpu(curdev, newdev, smp_processor_id()))
+   if (!tick_check_percpu(curdev, newdev, smp_processor_id()))
return false;
 
return tick_check_preferred(curdev, newdev);
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 9f8af69..6558b7a 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -84,6 +84,9 @@ static void tick_do_update_jiffies64(ktime_t now)
 
/* Keep the tick_next_period variable up to date */
tick_next_period = ktime_add(last_jiffies_update, tick_period);
+   } else {
+   write_sequnlock(jiffies_lock);
+   return;
}
write_sequnlock(jiffies_lock);
update_wall_time();
@@ -967,7 +970,7 @@ static void tick_nohz_switch_to_nohz(void)
struct tick_sched *ts = __get_cpu_var(tick_cpu_sched);
ktime_t next;
 
-   if (!tick_nohz_active)
+   if (!tick_nohz_enabled)
return;
 
local_irq_disable();
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT Pull] timer fixes for 3.14

2014-02-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
timers-urgent-for-linus

Short summary:

  * Serialize the registration of a new sched_clock in the
currently ARM only generic sched_clock facilty to avoid
sched_clock havoc

Thanks,

tglx

-->
Stephen Boyd (1):
  sched_clock: Prevent callers from seeing half-updated data


 kernel/time/sched_clock.c |   46 -
 1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 0abb364..4d23dc4 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -116,20 +116,42 @@ static enum hrtimer_restart sched_clock_poll(struct 
hrtimer *hrt)
 void __init sched_clock_register(u64 (*read)(void), int bits,
 unsigned long rate)
 {
+   u64 res, wrap, new_mask, new_epoch, cyc, ns;
+   u32 new_mult, new_shift;
+   ktime_t new_wrap_kt;
unsigned long r;
-   u64 res, wrap;
char r_unit;
 
if (cd.rate > rate)
return;
 
WARN_ON(!irqs_disabled());
-   read_sched_clock = read;
-   sched_clock_mask = CLOCKSOURCE_MASK(bits);
-   cd.rate = rate;
 
/* calculate the mult/shift to convert counter ticks to ns. */
-   clocks_calc_mult_shift(, , rate, NSEC_PER_SEC, 3600);
+   clocks_calc_mult_shift(_mult, _shift, rate, NSEC_PER_SEC, 3600);
+
+   new_mask = CLOCKSOURCE_MASK(bits);
+
+   /* calculate how many ns until we wrap */
+   wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask);
+   new_wrap_kt = ns_to_ktime(wrap - (wrap >> 3));
+
+   /* update epoch for new counter and update epoch_ns from old counter*/
+   new_epoch = read();
+   cyc = read_sched_clock();
+   ns = cd.epoch_ns + cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask,
+ cd.mult, cd.shift);
+
+   raw_write_seqcount_begin();
+   read_sched_clock = read;
+   sched_clock_mask = new_mask;
+   cd.rate = rate;
+   cd.wrap_kt = new_wrap_kt;
+   cd.mult = new_mult;
+   cd.shift = new_shift;
+   cd.epoch_cyc = new_epoch;
+   cd.epoch_ns = ns;
+   raw_write_seqcount_end();
 
r = rate;
if (r >= 400) {
@@ -141,22 +163,12 @@ void __init sched_clock_register(u64 (*read)(void), int 
bits,
} else
r_unit = ' ';
 
-   /* calculate how many ns until we wrap */
-   wrap = clocks_calc_max_nsecs(cd.mult, cd.shift, 0, sched_clock_mask);
-   cd.wrap_kt = ns_to_ktime(wrap - (wrap >> 3));
-
/* calculate the ns resolution of this counter */
-   res = cyc_to_ns(1ULL, cd.mult, cd.shift);
+   res = cyc_to_ns(1ULL, new_mult, new_shift);
+
pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps 
every %lluns\n",
bits, r, r_unit, res, wrap);
 
-   update_sched_clock();
-
-   /*
-* Ensure that sched_clock() starts off at 0ns
-*/
-   cd.epoch_ns = 0;
-
/* Enable IRQ time accounting if we have a fast enough sched_clock */
if (irqtime > 0 || (irqtime == -1 && rate >= 100))
enable_sched_clock_irqtime();
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT Pull] timer fixes for 3.14

2014-02-22 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
timers-urgent-for-linus

Short summary:

  * Serialize the registration of a new sched_clock in the
currently ARM only generic sched_clock facilty to avoid
sched_clock havoc

Thanks,

tglx

--
Stephen Boyd (1):
  sched_clock: Prevent callers from seeing half-updated data


 kernel/time/sched_clock.c |   46 -
 1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 0abb364..4d23dc4 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -116,20 +116,42 @@ static enum hrtimer_restart sched_clock_poll(struct 
hrtimer *hrt)
 void __init sched_clock_register(u64 (*read)(void), int bits,
 unsigned long rate)
 {
+   u64 res, wrap, new_mask, new_epoch, cyc, ns;
+   u32 new_mult, new_shift;
+   ktime_t new_wrap_kt;
unsigned long r;
-   u64 res, wrap;
char r_unit;
 
if (cd.rate  rate)
return;
 
WARN_ON(!irqs_disabled());
-   read_sched_clock = read;
-   sched_clock_mask = CLOCKSOURCE_MASK(bits);
-   cd.rate = rate;
 
/* calculate the mult/shift to convert counter ticks to ns. */
-   clocks_calc_mult_shift(cd.mult, cd.shift, rate, NSEC_PER_SEC, 3600);
+   clocks_calc_mult_shift(new_mult, new_shift, rate, NSEC_PER_SEC, 3600);
+
+   new_mask = CLOCKSOURCE_MASK(bits);
+
+   /* calculate how many ns until we wrap */
+   wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask);
+   new_wrap_kt = ns_to_ktime(wrap - (wrap  3));
+
+   /* update epoch for new counter and update epoch_ns from old counter*/
+   new_epoch = read();
+   cyc = read_sched_clock();
+   ns = cd.epoch_ns + cyc_to_ns((cyc - cd.epoch_cyc)  sched_clock_mask,
+ cd.mult, cd.shift);
+
+   raw_write_seqcount_begin(cd.seq);
+   read_sched_clock = read;
+   sched_clock_mask = new_mask;
+   cd.rate = rate;
+   cd.wrap_kt = new_wrap_kt;
+   cd.mult = new_mult;
+   cd.shift = new_shift;
+   cd.epoch_cyc = new_epoch;
+   cd.epoch_ns = ns;
+   raw_write_seqcount_end(cd.seq);
 
r = rate;
if (r = 400) {
@@ -141,22 +163,12 @@ void __init sched_clock_register(u64 (*read)(void), int 
bits,
} else
r_unit = ' ';
 
-   /* calculate how many ns until we wrap */
-   wrap = clocks_calc_max_nsecs(cd.mult, cd.shift, 0, sched_clock_mask);
-   cd.wrap_kt = ns_to_ktime(wrap - (wrap  3));
-
/* calculate the ns resolution of this counter */
-   res = cyc_to_ns(1ULL, cd.mult, cd.shift);
+   res = cyc_to_ns(1ULL, new_mult, new_shift);
+
pr_info(sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps 
every %lluns\n,
bits, r, r_unit, res, wrap);
 
-   update_sched_clock();
-
-   /*
-* Ensure that sched_clock() starts off at 0ns
-*/
-   cd.epoch_ns = 0;
-
/* Enable IRQ time accounting if we have a fast enough sched_clock */
if (irqtime  0 || (irqtime == -1  rate = 100))
enable_sched_clock_irqtime();
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [GIT Pull] timer fixes for 3.14

2014-02-18 Thread Preeti U Murthy
On 02/19/2014 12:10 AM, Thomas Gleixner wrote:
> On Tue, 18 Feb 2014, Preeti Murthy wrote:
> 
>> Hi Thomas,
>>
>> With regard to the patch: "tick: Clear broadcast pending bit when
>> switching to oneshot"
>> isn't BROADCAST_EXIT called atleast after initializing the high
>> resolution timers while
>> handling the broadcast IPI and before re-entering idle? This should
>> clear the cpu bit
>> in the pending mask right?
>>
>> idle()
>> |__BROADCAST_ENTER
>> |__halt()
>>   |__broadcast_ipi
>>   |__init_highres()->clear oneshot mask
>>   |__return from interrupt->BROADCAST_EXIT (clear pending mask)
> 
> Unfortunately not:
> 
>  if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
> clear pending mask;
>  }
> 
>>|__re-enter idle
> 
> Go figure :)

Ah right! Thanks :)

Regards
Preeti U Murthy
> 
> Thanks,
> 
>   tglx
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [GIT Pull] timer fixes for 3.14

2014-02-18 Thread Thomas Gleixner
On Tue, 18 Feb 2014, Preeti Murthy wrote:

> Hi Thomas,
> 
> With regard to the patch: "tick: Clear broadcast pending bit when
> switching to oneshot"
> isn't BROADCAST_EXIT called atleast after initializing the high
> resolution timers while
> handling the broadcast IPI and before re-entering idle? This should
> clear the cpu bit
> in the pending mask right?
> 
> idle()
> |__BROADCAST_ENTER
> |__halt()
>   |__broadcast_ipi
>   |__init_highres()->clear oneshot mask
>   |__return from interrupt->BROADCAST_EXIT (clear pending mask)

Unfortunately not:

 if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
  clear pending mask;
 }

>|__re-enter idle

Go figure :)
 
Thanks,

tglx
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [GIT Pull] timer fixes for 3.14

2014-02-18 Thread Thomas Gleixner
On Tue, 18 Feb 2014, Preeti Murthy wrote:

 Hi Thomas,
 
 With regard to the patch: tick: Clear broadcast pending bit when
 switching to oneshot
 isn't BROADCAST_EXIT called atleast after initializing the high
 resolution timers while
 handling the broadcast IPI and before re-entering idle? This should
 clear the cpu bit
 in the pending mask right?
 
 idle()
 |__BROADCAST_ENTER
 |__halt()
   |__broadcast_ipi
   |__init_highres()-clear oneshot mask
   |__return from interrupt-BROADCAST_EXIT (clear pending mask)

Unfortunately not:

 if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
  clear pending mask;
 }

|__re-enter idle

Go figure :)
 
Thanks,

tglx
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [GIT Pull] timer fixes for 3.14

2014-02-18 Thread Preeti U Murthy
On 02/19/2014 12:10 AM, Thomas Gleixner wrote:
 On Tue, 18 Feb 2014, Preeti Murthy wrote:
 
 Hi Thomas,

 With regard to the patch: tick: Clear broadcast pending bit when
 switching to oneshot
 isn't BROADCAST_EXIT called atleast after initializing the high
 resolution timers while
 handling the broadcast IPI and before re-entering idle? This should
 clear the cpu bit
 in the pending mask right?

 idle()
 |__BROADCAST_ENTER
 |__halt()
   |__broadcast_ipi
   |__init_highres()-clear oneshot mask
   |__return from interrupt-BROADCAST_EXIT (clear pending mask)
 
 Unfortunately not:
 
  if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
 clear pending mask;
  }
 
|__re-enter idle
 
 Go figure :)

Ah right! Thanks :)

Regards
Preeti U Murthy
 
 Thanks,
 
   tglx
 

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [GIT Pull] timer fixes for 3.14

2014-02-17 Thread Preeti Murthy
Hi Thomas,

With regard to the patch: "tick: Clear broadcast pending bit when
switching to oneshot"
isn't BROADCAST_EXIT called atleast after initializing the high
resolution timers while
handling the broadcast IPI and before re-entering idle? This should
clear the cpu bit
in the pending mask right?

idle()
|__BROADCAST_ENTER
|__halt()
  |__broadcast_ipi
  |__init_highres()->clear oneshot mask
  |__return from interrupt->BROADCAST_EXIT (clear pending mask)
   |__re-enter idle

When the cpu re-enters idle and does a BROADCAST_ENTER again, the
pending mask is cleared
and hence should not trigger a WARN_ON().

Thanks

Regards
Preeti U Murthy

On Sun, Feb 16, 2014 at 12:51 AM, Thomas Gleixner  wrote:
> Linus,
>
> please pull the latest timers-urgent-for-linus git tree from:
>
>git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
> timers-urgent-for-linus
>
> The following trilogy of patches brings you:
>
>  * Fix for a long standing math overflow issue with HZ < 60
>
>  * An onliner fix for a corner case in the dreaded tick broadcast
>mechanism affecting a certain range of AMD machines which are
>infested with the infamous automagic C1E power control misfeature
>
>  * A fix for one of the ARM platforms which allows the kernel to
>proceed and boot instead of stupidly panicing for no good
>reason. The patch is slightly larger than necessary, but it's less
>ugly than the alternative 5 liner.
>
>
> Thanks,
>
> tglx
>
> -->
> Mikulas Patocka (1):
>   time: Fix overflow when HZ is smaller than 60
>
> Thomas Gleixner (1):
>   tick: Clear broadcast pending bit when switching to oneshot
>
> Tim Kryger (1):
>   clocksource: Kona: Print warning rather than panic
>
>
>  drivers/clocksource/bcm_kona_timer.c |   54 
> ++
>  kernel/time/jiffies.c|6 
>  kernel/time/tick-broadcast.c |1 +
>  3 files changed, 35 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/clocksource/bcm_kona_timer.c 
> b/drivers/clocksource/bcm_kona_timer.c
> index 974b2db..0595dc6 100644
> --- a/drivers/clocksource/bcm_kona_timer.c
> +++ b/drivers/clocksource/bcm_kona_timer.c
> @@ -99,31 +99,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
> uint32_t *lsw)
> return;
>  }
>
> -static void __init kona_timers_init(struct device_node *node)
> -{
> -   u32 freq;
> -   struct clk *external_clk;
> -
> -   external_clk = of_clk_get_by_name(node, NULL);
> -
> -   if (!IS_ERR(external_clk)) {
> -   arch_timer_rate = clk_get_rate(external_clk);
> -   clk_prepare_enable(external_clk);
> -   } else if (!of_property_read_u32(node, "clock-frequency", )) {
> -   arch_timer_rate = freq;
> -   } else {
> -   panic("unable to determine clock-frequency");
> -   }
> -
> -   /* Setup IRQ numbers */
> -   timers.tmr_irq = irq_of_parse_and_map(node, 0);
> -
> -   /* Setup IO addresses */
> -   timers.tmr_regs = of_iomap(node, 0);
> -
> -   kona_timer_disable_and_clear(timers.tmr_regs);
> -}
> -
>  static int kona_timer_set_next_event(unsigned long clc,
>   struct clock_event_device *unused)
>  {
> @@ -198,7 +173,34 @@ static struct irqaction kona_timer_irq = {
>
>  static void __init kona_timer_init(struct device_node *node)
>  {
> -   kona_timers_init(node);
> +   u32 freq;
> +   struct clk *external_clk;
> +
> +   if (!of_device_is_available(node)) {
> +   pr_info("Kona Timer v1 marked as disabled in device tree\n");
> +   return;
> +   }
> +
> +   external_clk = of_clk_get_by_name(node, NULL);
> +
> +   if (!IS_ERR(external_clk)) {
> +   arch_timer_rate = clk_get_rate(external_clk);
> +   clk_prepare_enable(external_clk);
> +   } else if (!of_property_read_u32(node, "clock-frequency", )) {
> +   arch_timer_rate = freq;
> +   } else {
> +   pr_err("Kona Timer v1 unable to determine clock-frequency");
> +   return;
> +   }
> +
> +   /* Setup IRQ numbers */
> +   timers.tmr_irq = irq_of_parse_and_map(node, 0);
> +
> +   /* Setup IO addresses */
> +   timers.tmr_regs = of_iomap(node, 0);
> +
> +   kona_timer_disable_and_clear(timers.tmr_regs);
> +
> kona_timer_clockevents_init();
> setup_irq(timers.tmr_irq, _timer_irq);
> kona_timer_set_next_event((arch_timer_rate / HZ), NULL);
> diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
> index 7a925ba..a6a5bf5 100644
> --- a/kernel/time/jiffies.c
> +++ b/kernel/time/jiffies.c
> @@ -51,7 +51,13 @@
>   * HZ shrinks, so values greater than 8 overflow 32bits when
>   * HZ=100.
>   */
> +#if HZ < 34
> +#define JIFFIES_SHIFT  6
> +#elif HZ < 67
> +#define JIFFIES_SHIFT  7
> +#else
>  #define JIFFIES_SHIFT  8
> +#endif
>
>  static cycle_t 

Re: [GIT Pull] timer fixes for 3.14

2014-02-17 Thread Preeti Murthy
Hi Thomas,

With regard to the patch: tick: Clear broadcast pending bit when
switching to oneshot
isn't BROADCAST_EXIT called atleast after initializing the high
resolution timers while
handling the broadcast IPI and before re-entering idle? This should
clear the cpu bit
in the pending mask right?

idle()
|__BROADCAST_ENTER
|__halt()
  |__broadcast_ipi
  |__init_highres()-clear oneshot mask
  |__return from interrupt-BROADCAST_EXIT (clear pending mask)
   |__re-enter idle

When the cpu re-enters idle and does a BROADCAST_ENTER again, the
pending mask is cleared
and hence should not trigger a WARN_ON().

Thanks

Regards
Preeti U Murthy

On Sun, Feb 16, 2014 at 12:51 AM, Thomas Gleixner t...@linutronix.de wrote:
 Linus,

 please pull the latest timers-urgent-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
 timers-urgent-for-linus

 The following trilogy of patches brings you:

  * Fix for a long standing math overflow issue with HZ  60

  * An onliner fix for a corner case in the dreaded tick broadcast
mechanism affecting a certain range of AMD machines which are
infested with the infamous automagic C1E power control misfeature

  * A fix for one of the ARM platforms which allows the kernel to
proceed and boot instead of stupidly panicing for no good
reason. The patch is slightly larger than necessary, but it's less
ugly than the alternative 5 liner.


 Thanks,

 tglx

 --
 Mikulas Patocka (1):
   time: Fix overflow when HZ is smaller than 60

 Thomas Gleixner (1):
   tick: Clear broadcast pending bit when switching to oneshot

 Tim Kryger (1):
   clocksource: Kona: Print warning rather than panic


  drivers/clocksource/bcm_kona_timer.c |   54 
 ++
  kernel/time/jiffies.c|6 
  kernel/time/tick-broadcast.c |1 +
  3 files changed, 35 insertions(+), 26 deletions(-)

 diff --git a/drivers/clocksource/bcm_kona_timer.c 
 b/drivers/clocksource/bcm_kona_timer.c
 index 974b2db..0595dc6 100644
 --- a/drivers/clocksource/bcm_kona_timer.c
 +++ b/drivers/clocksource/bcm_kona_timer.c
 @@ -99,31 +99,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
 uint32_t *lsw)
 return;
  }

 -static void __init kona_timers_init(struct device_node *node)
 -{
 -   u32 freq;
 -   struct clk *external_clk;
 -
 -   external_clk = of_clk_get_by_name(node, NULL);
 -
 -   if (!IS_ERR(external_clk)) {
 -   arch_timer_rate = clk_get_rate(external_clk);
 -   clk_prepare_enable(external_clk);
 -   } else if (!of_property_read_u32(node, clock-frequency, freq)) {
 -   arch_timer_rate = freq;
 -   } else {
 -   panic(unable to determine clock-frequency);
 -   }
 -
 -   /* Setup IRQ numbers */
 -   timers.tmr_irq = irq_of_parse_and_map(node, 0);
 -
 -   /* Setup IO addresses */
 -   timers.tmr_regs = of_iomap(node, 0);
 -
 -   kona_timer_disable_and_clear(timers.tmr_regs);
 -}
 -
  static int kona_timer_set_next_event(unsigned long clc,
   struct clock_event_device *unused)
  {
 @@ -198,7 +173,34 @@ static struct irqaction kona_timer_irq = {

  static void __init kona_timer_init(struct device_node *node)
  {
 -   kona_timers_init(node);
 +   u32 freq;
 +   struct clk *external_clk;
 +
 +   if (!of_device_is_available(node)) {
 +   pr_info(Kona Timer v1 marked as disabled in device tree\n);
 +   return;
 +   }
 +
 +   external_clk = of_clk_get_by_name(node, NULL);
 +
 +   if (!IS_ERR(external_clk)) {
 +   arch_timer_rate = clk_get_rate(external_clk);
 +   clk_prepare_enable(external_clk);
 +   } else if (!of_property_read_u32(node, clock-frequency, freq)) {
 +   arch_timer_rate = freq;
 +   } else {
 +   pr_err(Kona Timer v1 unable to determine clock-frequency);
 +   return;
 +   }
 +
 +   /* Setup IRQ numbers */
 +   timers.tmr_irq = irq_of_parse_and_map(node, 0);
 +
 +   /* Setup IO addresses */
 +   timers.tmr_regs = of_iomap(node, 0);
 +
 +   kona_timer_disable_and_clear(timers.tmr_regs);
 +
 kona_timer_clockevents_init();
 setup_irq(timers.tmr_irq, kona_timer_irq);
 kona_timer_set_next_event((arch_timer_rate / HZ), NULL);
 diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
 index 7a925ba..a6a5bf5 100644
 --- a/kernel/time/jiffies.c
 +++ b/kernel/time/jiffies.c
 @@ -51,7 +51,13 @@
   * HZ shrinks, so values greater than 8 overflow 32bits when
   * HZ=100.
   */
 +#if HZ  34
 +#define JIFFIES_SHIFT  6
 +#elif HZ  67
 +#define JIFFIES_SHIFT  7
 +#else
  #define JIFFIES_SHIFT  8
 +#endif

  static cycle_t jiffies_read(struct clocksource *cs)
  {
 diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
 index 

[GIT Pull] timer fixes for 3.14

2014-02-15 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The following trilogy of patches brings you:

 * Fix for a long standing math overflow issue with HZ < 60

 * An onliner fix for a corner case in the dreaded tick broadcast
   mechanism affecting a certain range of AMD machines which are
   infested with the infamous automagic C1E power control misfeature

 * A fix for one of the ARM platforms which allows the kernel to
   proceed and boot instead of stupidly panicing for no good
   reason. The patch is slightly larger than necessary, but it's less
   ugly than the alternative 5 liner.


Thanks,

tglx

-->
Mikulas Patocka (1):
  time: Fix overflow when HZ is smaller than 60

Thomas Gleixner (1):
  tick: Clear broadcast pending bit when switching to oneshot

Tim Kryger (1):
  clocksource: Kona: Print warning rather than panic


 drivers/clocksource/bcm_kona_timer.c |   54 ++
 kernel/time/jiffies.c|6 
 kernel/time/tick-broadcast.c |1 +
 3 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 974b2db..0595dc6 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -99,31 +99,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
uint32_t *lsw)
return;
 }
 
-static void __init kona_timers_init(struct device_node *node)
-{
-   u32 freq;
-   struct clk *external_clk;
-
-   external_clk = of_clk_get_by_name(node, NULL);
-
-   if (!IS_ERR(external_clk)) {
-   arch_timer_rate = clk_get_rate(external_clk);
-   clk_prepare_enable(external_clk);
-   } else if (!of_property_read_u32(node, "clock-frequency", )) {
-   arch_timer_rate = freq;
-   } else {
-   panic("unable to determine clock-frequency");
-   }
-
-   /* Setup IRQ numbers */
-   timers.tmr_irq = irq_of_parse_and_map(node, 0);
-
-   /* Setup IO addresses */
-   timers.tmr_regs = of_iomap(node, 0);
-
-   kona_timer_disable_and_clear(timers.tmr_regs);
-}
-
 static int kona_timer_set_next_event(unsigned long clc,
  struct clock_event_device *unused)
 {
@@ -198,7 +173,34 @@ static struct irqaction kona_timer_irq = {
 
 static void __init kona_timer_init(struct device_node *node)
 {
-   kona_timers_init(node);
+   u32 freq;
+   struct clk *external_clk;
+
+   if (!of_device_is_available(node)) {
+   pr_info("Kona Timer v1 marked as disabled in device tree\n");
+   return;
+   }
+
+   external_clk = of_clk_get_by_name(node, NULL);
+
+   if (!IS_ERR(external_clk)) {
+   arch_timer_rate = clk_get_rate(external_clk);
+   clk_prepare_enable(external_clk);
+   } else if (!of_property_read_u32(node, "clock-frequency", )) {
+   arch_timer_rate = freq;
+   } else {
+   pr_err("Kona Timer v1 unable to determine clock-frequency");
+   return;
+   }
+
+   /* Setup IRQ numbers */
+   timers.tmr_irq = irq_of_parse_and_map(node, 0);
+
+   /* Setup IO addresses */
+   timers.tmr_regs = of_iomap(node, 0);
+
+   kona_timer_disable_and_clear(timers.tmr_regs);
+
kona_timer_clockevents_init();
setup_irq(timers.tmr_irq, _timer_irq);
kona_timer_set_next_event((arch_timer_rate / HZ), NULL);
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index 7a925ba..a6a5bf5 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -51,7 +51,13 @@
  * HZ shrinks, so values greater than 8 overflow 32bits when
  * HZ=100.
  */
+#if HZ < 34
+#define JIFFIES_SHIFT  6
+#elif HZ < 67
+#define JIFFIES_SHIFT  7
+#else
 #define JIFFIES_SHIFT  8
+#endif
 
 static cycle_t jiffies_read(struct clocksource *cs)
 {
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 43780ab..98977a5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -756,6 +756,7 @@ out:
 static void tick_broadcast_clear_oneshot(int cpu)
 {
cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
+   cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
 }
 
 static void tick_broadcast_init_next_event(struct cpumask *mask,
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT Pull] timer fixes for 3.14

2014-02-15 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

The following trilogy of patches brings you:

 * Fix for a long standing math overflow issue with HZ  60

 * An onliner fix for a corner case in the dreaded tick broadcast
   mechanism affecting a certain range of AMD machines which are
   infested with the infamous automagic C1E power control misfeature

 * A fix for one of the ARM platforms which allows the kernel to
   proceed and boot instead of stupidly panicing for no good
   reason. The patch is slightly larger than necessary, but it's less
   ugly than the alternative 5 liner.


Thanks,

tglx

--
Mikulas Patocka (1):
  time: Fix overflow when HZ is smaller than 60

Thomas Gleixner (1):
  tick: Clear broadcast pending bit when switching to oneshot

Tim Kryger (1):
  clocksource: Kona: Print warning rather than panic


 drivers/clocksource/bcm_kona_timer.c |   54 ++
 kernel/time/jiffies.c|6 
 kernel/time/tick-broadcast.c |1 +
 3 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/drivers/clocksource/bcm_kona_timer.c 
b/drivers/clocksource/bcm_kona_timer.c
index 974b2db..0595dc6 100644
--- a/drivers/clocksource/bcm_kona_timer.c
+++ b/drivers/clocksource/bcm_kona_timer.c
@@ -99,31 +99,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, 
uint32_t *lsw)
return;
 }
 
-static void __init kona_timers_init(struct device_node *node)
-{
-   u32 freq;
-   struct clk *external_clk;
-
-   external_clk = of_clk_get_by_name(node, NULL);
-
-   if (!IS_ERR(external_clk)) {
-   arch_timer_rate = clk_get_rate(external_clk);
-   clk_prepare_enable(external_clk);
-   } else if (!of_property_read_u32(node, clock-frequency, freq)) {
-   arch_timer_rate = freq;
-   } else {
-   panic(unable to determine clock-frequency);
-   }
-
-   /* Setup IRQ numbers */
-   timers.tmr_irq = irq_of_parse_and_map(node, 0);
-
-   /* Setup IO addresses */
-   timers.tmr_regs = of_iomap(node, 0);
-
-   kona_timer_disable_and_clear(timers.tmr_regs);
-}
-
 static int kona_timer_set_next_event(unsigned long clc,
  struct clock_event_device *unused)
 {
@@ -198,7 +173,34 @@ static struct irqaction kona_timer_irq = {
 
 static void __init kona_timer_init(struct device_node *node)
 {
-   kona_timers_init(node);
+   u32 freq;
+   struct clk *external_clk;
+
+   if (!of_device_is_available(node)) {
+   pr_info(Kona Timer v1 marked as disabled in device tree\n);
+   return;
+   }
+
+   external_clk = of_clk_get_by_name(node, NULL);
+
+   if (!IS_ERR(external_clk)) {
+   arch_timer_rate = clk_get_rate(external_clk);
+   clk_prepare_enable(external_clk);
+   } else if (!of_property_read_u32(node, clock-frequency, freq)) {
+   arch_timer_rate = freq;
+   } else {
+   pr_err(Kona Timer v1 unable to determine clock-frequency);
+   return;
+   }
+
+   /* Setup IRQ numbers */
+   timers.tmr_irq = irq_of_parse_and_map(node, 0);
+
+   /* Setup IO addresses */
+   timers.tmr_regs = of_iomap(node, 0);
+
+   kona_timer_disable_and_clear(timers.tmr_regs);
+
kona_timer_clockevents_init();
setup_irq(timers.tmr_irq, kona_timer_irq);
kona_timer_set_next_event((arch_timer_rate / HZ), NULL);
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index 7a925ba..a6a5bf5 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -51,7 +51,13 @@
  * HZ shrinks, so values greater than 8 overflow 32bits when
  * HZ=100.
  */
+#if HZ  34
+#define JIFFIES_SHIFT  6
+#elif HZ  67
+#define JIFFIES_SHIFT  7
+#else
 #define JIFFIES_SHIFT  8
+#endif
 
 static cycle_t jiffies_read(struct clocksource *cs)
 {
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 43780ab..98977a5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -756,6 +756,7 @@ out:
 static void tick_broadcast_clear_oneshot(int cpu)
 {
cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
+   cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
 }
 
 static void tick_broadcast_init_next_event(struct cpumask *mask,
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2013-12-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 5d5119a476f77b57381ddd66d4f7034a5447480b Merge branch 
'clockevents/fixes' of git://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Five self-contained fixlets:

 - fix clocksource driver build bug
 - fix two sched_clock() bugs triggering on specific hardware
 - fix devicetree enumeration bug affecting specific hardware
 - fix irq handler registration race resulting in boot crash
 - fix device node refcount bug

 Thanks,

Ingo

-->
Axel Lin (1):
  clocksource: time-efm32: Select CLKSRC_MMIO

Dinh Nguyen (2):
  clocksource: dw_apb_timer_of: Fix read_sched_clock
  clocksource: dw_apb_timer_of: Fix support for dts binding 
"snps,dw-apb-timer"

Ezequiel Garcia (1):
  clocksource: armada-370-xp: Register sched_clock after the counter reset

Marc Zyngier (1):
  clocksource: sunxi: Stop timer from ticking before enabling interrupts

Thierry Reding (1):
  clocksource: clksrc-of: Do not drop unheld reference on device node


 drivers/clocksource/Kconfig  |  1 +
 drivers/clocksource/clksrc-of.c  |  1 -
 drivers/clocksource/dw_apb_timer_of.c|  7 ---
 drivers/clocksource/sun4i_timer.c|  3 +++
 drivers/clocksource/time-armada-370-xp.c | 10 +-
 5 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 5c07a56..634c4d6 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -75,6 +75,7 @@ config CLKSRC_DBX500_PRCMU_SCHED_CLOCK
 config CLKSRC_EFM32
bool "Clocksource for Energy Micro's EFM32 SoCs" if !ARCH_EFM32
depends on OF && ARM && (ARCH_EFM32 || COMPILE_TEST)
+   select CLKSRC_MMIO
default ARCH_EFM32
help
  Support to use the timers of EFM32 SoCs as clock source and clock
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c
index 35639cf4..b9ddd9e 100644
--- a/drivers/clocksource/clksrc-of.c
+++ b/drivers/clocksource/clksrc-of.c
@@ -35,6 +35,5 @@ void __init clocksource_of_init(void)
 
init_func = match->data;
init_func(np);
-   of_node_put(np);
}
 }
diff --git a/drivers/clocksource/dw_apb_timer_of.c 
b/drivers/clocksource/dw_apb_timer_of.c
index 45ba8ae..2a2ea27 100644
--- a/drivers/clocksource/dw_apb_timer_of.c
+++ b/drivers/clocksource/dw_apb_timer_of.c
@@ -108,12 +108,11 @@ static void __init add_clocksource(struct device_node 
*source_timer)
 
 static u64 read_sched_clock(void)
 {
-   return __raw_readl(sched_io_base);
+   return ~__raw_readl(sched_io_base);
 }
 
 static const struct of_device_id sptimer_ids[] __initconst = {
{ .compatible = "picochip,pc3x2-rtc" },
-   { .compatible = "snps,dw-apb-timer-sp" },
{ /* Sentinel */ },
 };
 
@@ -151,4 +150,6 @@ static void __init dw_apb_timer_init(struct device_node 
*timer)
num_called++;
 }
 CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init);
-CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer_osc, "snps,dw-apb-timer-osc", 
dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer_sp, "snps,dw-apb-timer-sp", 
dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer", dw_apb_timer_init);
diff --git a/drivers/clocksource/sun4i_timer.c 
b/drivers/clocksource/sun4i_timer.c
index 2fb4695..a4f6119 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node 
*node)
writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
   timer_base + TIMER_CTL_REG(0));
 
+   /* Make sure timer is stopped before playing with interrupts */
+   sun4i_clkevt_time_stop(0);
+
ret = setup_irq(irq, _timer_irq);
if (ret)
pr_warn("failed to setup irq %d\n", irq);
diff --git a/drivers/clocksource/time-armada-370-xp.c 
b/drivers/clocksource/time-armada-370-xp.c
index d8e47e5..4e7f680 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -256,11 +256,6 @@ static void __init armada_370_xp_timer_common_init(struct 
device_node *np)
ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
 
/*
-* Set scale and timer for sched_clock.
-*/
-   sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk);
-
-   /*
 * Setup free-running clocksource timer (interrupts
 * disabled).
 */
@@ -270,6 +265,11 @@ static void __init armada_370_xp_timer_common_init(struct 
device_node *np)
timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN |
 TIMER0_DIV(TIMER_DIVIDER_SHIFT));
 
+   /*
+* Set 

[GIT PULL] timer fixes

2013-12-17 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   # HEAD: 5d5119a476f77b57381ddd66d4f7034a5447480b Merge branch 
'clockevents/fixes' of git://git.linaro.org/people/daniel.lezcano/linux into 
timers/urgent

Five self-contained fixlets:

 - fix clocksource driver build bug
 - fix two sched_clock() bugs triggering on specific hardware
 - fix devicetree enumeration bug affecting specific hardware
 - fix irq handler registration race resulting in boot crash
 - fix device node refcount bug

 Thanks,

Ingo

--
Axel Lin (1):
  clocksource: time-efm32: Select CLKSRC_MMIO

Dinh Nguyen (2):
  clocksource: dw_apb_timer_of: Fix read_sched_clock
  clocksource: dw_apb_timer_of: Fix support for dts binding 
snps,dw-apb-timer

Ezequiel Garcia (1):
  clocksource: armada-370-xp: Register sched_clock after the counter reset

Marc Zyngier (1):
  clocksource: sunxi: Stop timer from ticking before enabling interrupts

Thierry Reding (1):
  clocksource: clksrc-of: Do not drop unheld reference on device node


 drivers/clocksource/Kconfig  |  1 +
 drivers/clocksource/clksrc-of.c  |  1 -
 drivers/clocksource/dw_apb_timer_of.c|  7 ---
 drivers/clocksource/sun4i_timer.c|  3 +++
 drivers/clocksource/time-armada-370-xp.c | 10 +-
 5 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 5c07a56..634c4d6 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -75,6 +75,7 @@ config CLKSRC_DBX500_PRCMU_SCHED_CLOCK
 config CLKSRC_EFM32
bool Clocksource for Energy Micro's EFM32 SoCs if !ARCH_EFM32
depends on OF  ARM  (ARCH_EFM32 || COMPILE_TEST)
+   select CLKSRC_MMIO
default ARCH_EFM32
help
  Support to use the timers of EFM32 SoCs as clock source and clock
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c
index 35639cf4..b9ddd9e 100644
--- a/drivers/clocksource/clksrc-of.c
+++ b/drivers/clocksource/clksrc-of.c
@@ -35,6 +35,5 @@ void __init clocksource_of_init(void)
 
init_func = match-data;
init_func(np);
-   of_node_put(np);
}
 }
diff --git a/drivers/clocksource/dw_apb_timer_of.c 
b/drivers/clocksource/dw_apb_timer_of.c
index 45ba8ae..2a2ea27 100644
--- a/drivers/clocksource/dw_apb_timer_of.c
+++ b/drivers/clocksource/dw_apb_timer_of.c
@@ -108,12 +108,11 @@ static void __init add_clocksource(struct device_node 
*source_timer)
 
 static u64 read_sched_clock(void)
 {
-   return __raw_readl(sched_io_base);
+   return ~__raw_readl(sched_io_base);
 }
 
 static const struct of_device_id sptimer_ids[] __initconst = {
{ .compatible = picochip,pc3x2-rtc },
-   { .compatible = snps,dw-apb-timer-sp },
{ /* Sentinel */ },
 };
 
@@ -151,4 +150,6 @@ static void __init dw_apb_timer_init(struct device_node 
*timer)
num_called++;
 }
 CLOCKSOURCE_OF_DECLARE(pc3x2_timer, picochip,pc3x2-timer, dw_apb_timer_init);
-CLOCKSOURCE_OF_DECLARE(apb_timer, snps,dw-apb-timer-osc, dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer_osc, snps,dw-apb-timer-osc, 
dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer_sp, snps,dw-apb-timer-sp, 
dw_apb_timer_init);
+CLOCKSOURCE_OF_DECLARE(apb_timer, snps,dw-apb-timer, dw_apb_timer_init);
diff --git a/drivers/clocksource/sun4i_timer.c 
b/drivers/clocksource/sun4i_timer.c
index 2fb4695..a4f6119 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node 
*node)
writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
   timer_base + TIMER_CTL_REG(0));
 
+   /* Make sure timer is stopped before playing with interrupts */
+   sun4i_clkevt_time_stop(0);
+
ret = setup_irq(irq, sun4i_timer_irq);
if (ret)
pr_warn(failed to setup irq %d\n, irq);
diff --git a/drivers/clocksource/time-armada-370-xp.c 
b/drivers/clocksource/time-armada-370-xp.c
index d8e47e5..4e7f680 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -256,11 +256,6 @@ static void __init armada_370_xp_timer_common_init(struct 
device_node *np)
ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
 
/*
-* Set scale and timer for sched_clock.
-*/
-   sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk);
-
-   /*
 * Setup free-running clocksource timer (interrupts
 * disabled).
 */
@@ -270,6 +265,11 @@ static void __init armada_370_xp_timer_common_init(struct 
device_node *np)
timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN |
 TIMER0_DIV(TIMER_DIVIDER_SHIFT));
 
+   /*
+* Set scale and timer for 

[GIT pull] timer fixes for 3.13

2013-12-03 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

- timekeeping: Cure a subtle drift issue on GENERIC_TIME_VSYSCALL_OLD
- nohz: Make CONFIG_NO_HZ=n and nohz=off command line option behave
  the same way. Fixes a long standing load accounting wreckage.
- clocksource/ARM: Kconfig update to avoid ARM=n wreckage
- clocksource/ARM: Fixlets for the AT91 and SH clocksource/clockevents
- Trivial documentation update and kzalloc conversion from akpms pile

Thanks,

tglx

-->
Andrew Morton (1):
  tick: Document tick_do_timer_cpu

Joe Perches (1):
  timer: Convert kmalloc_node(...GFP_ZERO...) to kzalloc_node(...)

Laurent Pinchart (4):
  clocksource: sh_mtu2: Release clock when sh_mtu2_register() fails
  clocksource: sh_mtu2: Add clk_prepare/unprepare support
  clocksource: sh_tmu: Release clock when sh_tmu_register() fails
  clocksource: sh_tmu: Add clk_prepare/unprepare support

Martin Schwidefsky (1):
  time: Fix 1ns/tick drift w/ GENERIC_TIME_VSYSCALL_OLD

Stephen Boyd (1):
  clocksource: arm_arch_timer: Hide eventstream Kconfig on non-ARM

Thomas Gleixner (2):
  NOHZ: Check for nohz active instead of nohz enabled
  nohz: Fix another inconsistency between CONFIG_NO_HZ=n and nohz=off

Uwe Kleine-König (1):
  ARM: at91: rm9200: switch back to clockevents_config_and_register


 arch/arm/mach-at91/at91rm9200_time.c |7 ++-
 drivers/clocksource/Kconfig  |1 +
 drivers/clocksource/sh_mtu2.c|   16 ++--
 drivers/clocksource/sh_tmu.c |   20 +---
 kernel/rcu/tree_plugin.h |4 ++--
 kernel/time/tick-common.c|   15 +++
 kernel/time/tick-sched.c |   25 -
 kernel/time/timekeeping.c|2 +-
 kernel/timer.c   |5 ++---
 9 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-at91/at91rm9200_time.c 
b/arch/arm/mach-at91/at91rm9200_time.c
index f607deb..bc7b363 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct 
clock_event_device *dev)
 static struct clock_event_device clkevt = {
.name   = "at91_tick",
.features   = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-   .shift  = 32,
.rating = 150,
.set_next_event = clkevt32k_next_event,
.set_mode   = clkevt32k_mode,
@@ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void)
at91_st_write(AT91_ST_RTMR, 1);
 
/* Setup timer clockevent, with minimum of two ticks (important!!) */
-   clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
-   clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, );
-   clkevt.min_delta_ns = clockevent_delta2ns(2, ) + 1;
clkevt.cpumask = cpumask_of(0);
-   clockevents_register_device();
+   clockevents_config_and_register(, AT91_SLOW_CLOCK,
+   2, AT91_ST_ALMV);
 
/* register clocksource */
clocksource_register_hz(, AT91_SLOW_CLOCK);
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index bdb953e..5c07a56 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -87,6 +87,7 @@ config ARM_ARCH_TIMER
 config ARM_ARCH_TIMER_EVTSTREAM
bool "Support for ARM architected timer event stream generation"
default y if ARM_ARCH_TIMER
+   depends on ARM_ARCH_TIMER
help
  This option enables support for event stream generation based on
  the ARM architected timer. It is used for waking up CPUs executing
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index 4aac9ee..3cf1283 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -313,8 +313,20 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct 
platform_device *pdev)
goto err1;
}
 
-   return sh_mtu2_register(p, (char *)dev_name(>pdev->dev),
-   cfg->clockevent_rating);
+   ret = clk_prepare(p->clk);
+   if (ret < 0)
+   goto err2;
+
+   ret = sh_mtu2_register(p, (char *)dev_name(>pdev->dev),
+  cfg->clockevent_rating);
+   if (ret < 0)
+   goto err3;
+
+   return 0;
+ err3:
+   clk_unprepare(p->clk);
+ err2:
+   clk_put(p->clk);
  err1:
iounmap(p->mapbase);
  err0:
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
index 78b8dae..63557cd 100644
--- a/drivers/clocksource/sh_tmu.c
+++ b/drivers/clocksource/sh_tmu.c
@@ -472,12 +472,26 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct 
platform_device *pdev)
ret = PTR_ERR(p->clk);
  

[GIT pull] timer fixes for 3.13

2013-12-03 Thread Thomas Gleixner
Linus,

please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

- timekeeping: Cure a subtle drift issue on GENERIC_TIME_VSYSCALL_OLD
- nohz: Make CONFIG_NO_HZ=n and nohz=off command line option behave
  the same way. Fixes a long standing load accounting wreckage.
- clocksource/ARM: Kconfig update to avoid ARM=n wreckage
- clocksource/ARM: Fixlets for the AT91 and SH clocksource/clockevents
- Trivial documentation update and kzalloc conversion from akpms pile

Thanks,

tglx

--
Andrew Morton (1):
  tick: Document tick_do_timer_cpu

Joe Perches (1):
  timer: Convert kmalloc_node(...GFP_ZERO...) to kzalloc_node(...)

Laurent Pinchart (4):
  clocksource: sh_mtu2: Release clock when sh_mtu2_register() fails
  clocksource: sh_mtu2: Add clk_prepare/unprepare support
  clocksource: sh_tmu: Release clock when sh_tmu_register() fails
  clocksource: sh_tmu: Add clk_prepare/unprepare support

Martin Schwidefsky (1):
  time: Fix 1ns/tick drift w/ GENERIC_TIME_VSYSCALL_OLD

Stephen Boyd (1):
  clocksource: arm_arch_timer: Hide eventstream Kconfig on non-ARM

Thomas Gleixner (2):
  NOHZ: Check for nohz active instead of nohz enabled
  nohz: Fix another inconsistency between CONFIG_NO_HZ=n and nohz=off

Uwe Kleine-König (1):
  ARM: at91: rm9200: switch back to clockevents_config_and_register


 arch/arm/mach-at91/at91rm9200_time.c |7 ++-
 drivers/clocksource/Kconfig  |1 +
 drivers/clocksource/sh_mtu2.c|   16 ++--
 drivers/clocksource/sh_tmu.c |   20 +---
 kernel/rcu/tree_plugin.h |4 ++--
 kernel/time/tick-common.c|   15 +++
 kernel/time/tick-sched.c |   25 -
 kernel/time/timekeeping.c|2 +-
 kernel/timer.c   |5 ++---
 9 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-at91/at91rm9200_time.c 
b/arch/arm/mach-at91/at91rm9200_time.c
index f607deb..bc7b363 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct 
clock_event_device *dev)
 static struct clock_event_device clkevt = {
.name   = at91_tick,
.features   = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-   .shift  = 32,
.rating = 150,
.set_next_event = clkevt32k_next_event,
.set_mode   = clkevt32k_mode,
@@ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void)
at91_st_write(AT91_ST_RTMR, 1);
 
/* Setup timer clockevent, with minimum of two ticks (important!!) */
-   clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
-   clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, clkevt);
-   clkevt.min_delta_ns = clockevent_delta2ns(2, clkevt) + 1;
clkevt.cpumask = cpumask_of(0);
-   clockevents_register_device(clkevt);
+   clockevents_config_and_register(clkevt, AT91_SLOW_CLOCK,
+   2, AT91_ST_ALMV);
 
/* register clocksource */
clocksource_register_hz(clk32k, AT91_SLOW_CLOCK);
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index bdb953e..5c07a56 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -87,6 +87,7 @@ config ARM_ARCH_TIMER
 config ARM_ARCH_TIMER_EVTSTREAM
bool Support for ARM architected timer event stream generation
default y if ARM_ARCH_TIMER
+   depends on ARM_ARCH_TIMER
help
  This option enables support for event stream generation based on
  the ARM architected timer. It is used for waking up CPUs executing
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index 4aac9ee..3cf1283 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -313,8 +313,20 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct 
platform_device *pdev)
goto err1;
}
 
-   return sh_mtu2_register(p, (char *)dev_name(p-pdev-dev),
-   cfg-clockevent_rating);
+   ret = clk_prepare(p-clk);
+   if (ret  0)
+   goto err2;
+
+   ret = sh_mtu2_register(p, (char *)dev_name(p-pdev-dev),
+  cfg-clockevent_rating);
+   if (ret  0)
+   goto err3;
+
+   return 0;
+ err3:
+   clk_unprepare(p-clk);
+ err2:
+   clk_put(p-clk);
  err1:
iounmap(p-mapbase);
  err0:
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
index 78b8dae..63557cd 100644
--- a/drivers/clocksource/sh_tmu.c
+++ b/drivers/clocksource/sh_tmu.c
@@ -472,12 +472,26 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct 
platform_device *pdev)
ret = 

[GIT PULL] timer fixes

2013-09-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   HEAD: 2199a5574b6d94b9ca26c6345356f45ec60fef8b clocksource: em_sti: Set 
cpu_possible_mask to fix SMP broadcast

A handful of ARM clocksource/clockevent driver fixes.

Thanks,

Ingo

-->
Jean Pihet (1):
  arm: clocksource: mvebu: Use the main timer as clock source from DT

Magnus Damm (1):
  clocksource: em_sti: Set cpu_possible_mask to fix SMP broadcast

Sebastian Hesselbarth (1):
  clocksource: of: Respect device tree node status

Tomasz Figa (1):
  clocksource: exynos_mct: Set IRQ affinity when the CPU goes online


 drivers/clocksource/Kconfig  |  1 +
 drivers/clocksource/clksrc-of.c  |  3 +++
 drivers/clocksource/em_sti.c |  2 +-
 drivers/clocksource/exynos_mct.c | 10 +-
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 41c6946..971d796 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -26,6 +26,7 @@ config DW_APB_TIMER_OF
 
 config ARMADA_370_XP_TIMER
bool
+   select CLKSRC_OF
 
 config ORION_TIMER
select CLKSRC_OF
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c
index 37f5325..b9ddd9e 100644
--- a/drivers/clocksource/clksrc-of.c
+++ b/drivers/clocksource/clksrc-of.c
@@ -30,6 +30,9 @@ void __init clocksource_of_init(void)
clocksource_of_init_fn init_func;
 
for_each_matching_node_and_match(np, __clksrc_of_table, ) {
+   if (!of_device_is_available(np))
+   continue;
+
init_func = match->data;
init_func(np);
}
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c
index b9c81b7..3a5909c 100644
--- a/drivers/clocksource/em_sti.c
+++ b/drivers/clocksource/em_sti.c
@@ -301,7 +301,7 @@ static void em_sti_register_clockevent(struct em_sti_priv 
*p)
ced->name = dev_name(>pdev->dev);
ced->features = CLOCK_EVT_FEAT_ONESHOT;
ced->rating = 200;
-   ced->cpumask = cpumask_of(0);
+   ced->cpumask = cpu_possible_mask;
ced->set_next_event = em_sti_clock_event_next;
ced->set_mode = em_sti_clock_event_mode;
 
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5b34768..62b0de6 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
evt->irq);
return -EIO;
}
-   irq_set_affinity(evt->irq, cpumask_of(cpu));
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block 
*self,
   unsigned long action, void *hcpu)
 {
struct mct_clock_event_device *mevt;
+   unsigned int cpu;
 
/*
 * Grab cpu pointer in each case to avoid spurious
@@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block 
*self,
mevt = this_cpu_ptr(_mct_tick);
exynos4_local_timer_setup(>evt);
break;
+   case CPU_ONLINE:
+   cpu = (unsigned long)hcpu;
+   if (mct_int_type == MCT_INT_SPI)
+   irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu],
+   cpumask_of(cpu));
+   break;
case CPU_DYING:
mevt = this_cpu_ptr(_mct_tick);
exynos4_local_timer_stop(>evt);
@@ -500,6 +506,8 @@ static void __init exynos4_timer_resources(struct 
device_node *np, void __iomem
 _mct_tick);
WARN(err, "MCT: can't request IRQ %d (%d)\n",
 mct_irqs[MCT_L0_IRQ], err);
+   } else {
+   irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
}
 
err = register_cpu_notifier(_mct_cpu_nb);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2013-09-28 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   HEAD: 2199a5574b6d94b9ca26c6345356f45ec60fef8b clocksource: em_sti: Set 
cpu_possible_mask to fix SMP broadcast

A handful of ARM clocksource/clockevent driver fixes.

Thanks,

Ingo

--
Jean Pihet (1):
  arm: clocksource: mvebu: Use the main timer as clock source from DT

Magnus Damm (1):
  clocksource: em_sti: Set cpu_possible_mask to fix SMP broadcast

Sebastian Hesselbarth (1):
  clocksource: of: Respect device tree node status

Tomasz Figa (1):
  clocksource: exynos_mct: Set IRQ affinity when the CPU goes online


 drivers/clocksource/Kconfig  |  1 +
 drivers/clocksource/clksrc-of.c  |  3 +++
 drivers/clocksource/em_sti.c |  2 +-
 drivers/clocksource/exynos_mct.c | 10 +-
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 41c6946..971d796 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -26,6 +26,7 @@ config DW_APB_TIMER_OF
 
 config ARMADA_370_XP_TIMER
bool
+   select CLKSRC_OF
 
 config ORION_TIMER
select CLKSRC_OF
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c
index 37f5325..b9ddd9e 100644
--- a/drivers/clocksource/clksrc-of.c
+++ b/drivers/clocksource/clksrc-of.c
@@ -30,6 +30,9 @@ void __init clocksource_of_init(void)
clocksource_of_init_fn init_func;
 
for_each_matching_node_and_match(np, __clksrc_of_table, match) {
+   if (!of_device_is_available(np))
+   continue;
+
init_func = match-data;
init_func(np);
}
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c
index b9c81b7..3a5909c 100644
--- a/drivers/clocksource/em_sti.c
+++ b/drivers/clocksource/em_sti.c
@@ -301,7 +301,7 @@ static void em_sti_register_clockevent(struct em_sti_priv 
*p)
ced-name = dev_name(p-pdev-dev);
ced-features = CLOCK_EVT_FEAT_ONESHOT;
ced-rating = 200;
-   ced-cpumask = cpumask_of(0);
+   ced-cpumask = cpu_possible_mask;
ced-set_next_event = em_sti_clock_event_next;
ced-set_mode = em_sti_clock_event_mode;
 
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5b34768..62b0de6 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct 
clock_event_device *evt)
evt-irq);
return -EIO;
}
-   irq_set_affinity(evt-irq, cpumask_of(cpu));
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block 
*self,
   unsigned long action, void *hcpu)
 {
struct mct_clock_event_device *mevt;
+   unsigned int cpu;
 
/*
 * Grab cpu pointer in each case to avoid spurious
@@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block 
*self,
mevt = this_cpu_ptr(percpu_mct_tick);
exynos4_local_timer_setup(mevt-evt);
break;
+   case CPU_ONLINE:
+   cpu = (unsigned long)hcpu;
+   if (mct_int_type == MCT_INT_SPI)
+   irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu],
+   cpumask_of(cpu));
+   break;
case CPU_DYING:
mevt = this_cpu_ptr(percpu_mct_tick);
exynos4_local_timer_stop(mevt-evt);
@@ -500,6 +506,8 @@ static void __init exynos4_timer_resources(struct 
device_node *np, void __iomem
 percpu_mct_tick);
WARN(err, MCT: can't request IRQ %d (%d)\n,
 mct_irqs[MCT_L0_IRQ], err);
+   } else {
+   irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
}
 
err = register_cpu_notifier(exynos4_mct_cpu_nb);
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2013-08-19 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   HEAD: ae920eb24277e4a174a3ca575ce42b98b18a6748 Merge branch 
'fortglx/3.11/time' of git://git.linaro.org/people/jstultz/linux into 
timers/urgent

Three small fixlets.

 Thanks,

Ingo

-->
Baruch Siach (1):
  sched_clock: Fix integer overflow

Li Zhong (1):
  nohz: fix compile warning in tick_nohz_init()

Steven Rostedt (1):
  nohz: Do not warn about unstable tsc unless user uses nohz_full


 kernel/time/sched_clock.c | 2 +-
 kernel/time/tick-sched.c  | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index a326f27..0b479a6 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -121,7 +121,7 @@ void __init setup_sched_clock(u32 (*read)(void), int bits, 
unsigned long rate)
BUG_ON(bits > 32);
WARN_ON(!irqs_disabled());
read_sched_clock = read;
-   sched_clock_mask = (1 << bits) - 1;
+   sched_clock_mask = (1ULL << bits) - 1;
cd.rate = rate;
 
/* calculate the mult/shift to convert counter ticks to ns. */
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index e80183f..9563c74 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -182,7 +182,8 @@ static bool can_stop_full_tick(void)
 * Don't allow the user to think they can get
 * full NO_HZ with this machine.
 */
-   WARN_ONCE(1, "NO_HZ FULL will not work with unstable sched 
clock");
+   WARN_ONCE(have_nohz_full_mask,
+ "NO_HZ FULL will not work with unstable sched clock");
return false;
}
 #endif
@@ -343,8 +344,6 @@ static int tick_nohz_init_all(void)
 
 void __init tick_nohz_init(void)
 {
-   int cpu;
-
if (!have_nohz_full_mask) {
if (tick_nohz_init_all() < 0)
return;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[GIT PULL] timer fixes

2013-08-19 Thread Ingo Molnar
Linus,

Please pull the latest timers-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
timers-urgent-for-linus

   HEAD: ae920eb24277e4a174a3ca575ce42b98b18a6748 Merge branch 
'fortglx/3.11/time' of git://git.linaro.org/people/jstultz/linux into 
timers/urgent

Three small fixlets.

 Thanks,

Ingo

--
Baruch Siach (1):
  sched_clock: Fix integer overflow

Li Zhong (1):
  nohz: fix compile warning in tick_nohz_init()

Steven Rostedt (1):
  nohz: Do not warn about unstable tsc unless user uses nohz_full


 kernel/time/sched_clock.c | 2 +-
 kernel/time/tick-sched.c  | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index a326f27..0b479a6 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -121,7 +121,7 @@ void __init setup_sched_clock(u32 (*read)(void), int bits, 
unsigned long rate)
BUG_ON(bits  32);
WARN_ON(!irqs_disabled());
read_sched_clock = read;
-   sched_clock_mask = (1  bits) - 1;
+   sched_clock_mask = (1ULL  bits) - 1;
cd.rate = rate;
 
/* calculate the mult/shift to convert counter ticks to ns. */
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index e80183f..9563c74 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -182,7 +182,8 @@ static bool can_stop_full_tick(void)
 * Don't allow the user to think they can get
 * full NO_HZ with this machine.
 */
-   WARN_ONCE(1, NO_HZ FULL will not work with unstable sched 
clock);
+   WARN_ONCE(have_nohz_full_mask,
+ NO_HZ FULL will not work with unstable sched clock);
return false;
}
 #endif
@@ -343,8 +344,6 @@ static int tick_nohz_init_all(void)
 
 void __init tick_nohz_init(void)
 {
-   int cpu;
-
if (!have_nohz_full_mask) {
if (tick_nohz_init_all()  0)
return;
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


  1   2   >