All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@kernel.org>,
	Linux PM list <linux-pm@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>
Subject: [PATCH 18/20]  clockevents: Make tick handover explicit
Date: Thu, 02 Apr 2015 00:24:04 +0200	[thread overview]
Message-ID: <1889903.Zmz9h0EYfy@vostro.rjw.lan> (raw)
In-Reply-To: <2112147.0kYCHhbEJT@vostro.rjw.lan>

From: Thomas Gleixner <tglx@linutronix.de>

clockevents_notify() is a leftover from the early design of the
clockevents facility. It's really not a notification mechanism, it's a
multiplex call. We are way better off to have explicit calls instead of this
monstrosity.

Split out the tick_handover call and invoke it explicitely from the
hotplug code. Temporary solution will be cleaned up in later patches.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
[ rjw: Rebase ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 include/linux/clockchips.h  |    1 -
 include/linux/tick.h        |    2 ++
 kernel/cpu.c                |    3 +++
 kernel/time/clockevents.c   |    4 ----
 kernel/time/hrtimer.c       |    4 ----
 kernel/time/tick-common.c   |    9 ++++++---
 kernel/time/tick-internal.h |    1 -
 7 files changed, 11 insertions(+), 13 deletions(-)

Index: linux-pm/include/linux/clockchips.h
===================================================================
--- linux-pm.orig/include/linux/clockchips.h
+++ linux-pm/include/linux/clockchips.h
@@ -11,7 +11,6 @@
 /* Clock event notification values */
 enum clock_event_nofitiers {
 	CLOCK_EVT_NOTIFY_ADD,
-	CLOCK_EVT_NOTIFY_CPU_DYING,
 	CLOCK_EVT_NOTIFY_CPU_DEAD,
 };
 
Index: linux-pm/include/linux/tick.h
===================================================================
--- linux-pm.orig/include/linux/tick.h
+++ linux-pm/include/linux/tick.h
@@ -19,12 +19,14 @@ extern void tick_unfreeze(void);
 extern void tick_suspend_local(void);
 /* Should be core only, but XEN resume magic and ARM BL switcher require it */
 extern void tick_resume_local(void);
+extern void tick_handover_do_timer(void);
 #else /* CONFIG_GENERIC_CLOCKEVENTS */
 static inline void tick_init(void) { }
 static inline void tick_freeze(void) { }
 static inline void tick_unfreeze(void) { }
 static inline void tick_suspend_local(void) { }
 static inline void tick_resume_local(void) { }
+static inline void tick_handover_do_timer(void) { }
 #endif /* !CONFIG_GENERIC_CLOCKEVENTS */
 
 #ifdef CONFIG_TICK_ONESHOT
Index: linux-pm/kernel/cpu.c
===================================================================
--- linux-pm.orig/kernel/cpu.c
+++ linux-pm/kernel/cpu.c
@@ -20,6 +20,7 @@
 #include <linux/gfp.h>
 #include <linux/suspend.h>
 #include <linux/lockdep.h>
+#include <linux/tick.h>
 #include <trace/events/power.h>
 
 #include "smpboot.h"
@@ -338,6 +339,8 @@ static int __ref take_cpu_down(void *_pa
 		return err;
 
 	cpu_notify(CPU_DYING | param->mod, param->hcpu);
+	/* Give up timekeeping duties */
+	tick_handover_do_timer();
 	/* Park the stopper thread */
 	kthread_park(current);
 	return 0;
Index: linux-pm/kernel/time/clockevents.c
===================================================================
--- linux-pm.orig/kernel/time/clockevents.c
+++ linux-pm/kernel/time/clockevents.c
@@ -655,10 +655,6 @@ int clockevents_notify(unsigned long rea
 	raw_spin_lock_irqsave(&clockevents_lock, flags);
 
 	switch (reason) {
-	case CLOCK_EVT_NOTIFY_CPU_DYING:
-		tick_handover_do_timer(arg);
-		break;
-
 	case CLOCK_EVT_NOTIFY_CPU_DEAD:
 		tick_shutdown_broadcast_oneshot(arg);
 		tick_shutdown_broadcast(arg);
Index: linux-pm/kernel/time/hrtimer.c
===================================================================
--- linux-pm.orig/kernel/time/hrtimer.c
+++ linux-pm/kernel/time/hrtimer.c
@@ -1707,10 +1707,6 @@ static int hrtimer_cpu_notify(struct not
 		break;
 
 #ifdef CONFIG_HOTPLUG_CPU
-	case CPU_DYING:
-	case CPU_DYING_FROZEN:
-		clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu);
-		break;
 	case CPU_DEAD:
 	case CPU_DEAD_FROZEN:
 	{
Index: linux-pm/kernel/time/tick-common.c
===================================================================
--- linux-pm.orig/kernel/time/tick-common.c
+++ linux-pm/kernel/time/tick-common.c
@@ -332,20 +332,23 @@ out_bc:
 	tick_install_broadcast_device(newdev);
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
 /*
  * Transfer the do_timer job away from a dying cpu.
  *
- * Called with interrupts disabled.
+ * Called with interrupts disabled. Not locking required. If
+ * tick_do_timer_cpu is owned by this cpu, nothing can change it.
  */
-void tick_handover_do_timer(int *cpup)
+void tick_handover_do_timer(void)
 {
-	if (*cpup == tick_do_timer_cpu) {
+	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;
 	}
 }
+#endif
 
 /*
  * Shutdown an event device on a given cpu:
Index: linux-pm/kernel/time/tick-internal.h
===================================================================
--- linux-pm.orig/kernel/time/tick-internal.h
+++ linux-pm/kernel/time/tick-internal.h
@@ -20,7 +20,6 @@ extern int tick_do_timer_cpu __read_most
 extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
 extern void tick_handle_periodic(struct clock_event_device *dev);
 extern void tick_check_new_device(struct clock_event_device *dev);
-extern void tick_handover_do_timer(int *cpup);
 extern void tick_shutdown(unsigned int *cpup);
 extern void tick_suspend(void);
 extern void tick_resume(void);


  parent reply	other threads:[~2015-04-01 22:03 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-01 22:02 [PATCH 00/20] clockevents_notify() removal Rafael J. Wysocki
2015-04-01 22:03 ` [PATCH 01/20] clockevents: Provide explicit broadcast control functions Rafael J. Wysocki
2015-04-01 22:04 ` [PATCH 02/20] x86, amd_idle: Use explicit broadcast control function Rafael J. Wysocki
2015-04-01 22:05 ` [PATCH 03/20] ACPI / PAD: " Rafael J. Wysocki
2015-04-01 22:06 ` [PATCH 04/20] ACPI / processor: " Rafael J. Wysocki
2015-04-01 22:07 ` [PATCH 05/20] cpuidle: " Rafael J. Wysocki
2015-04-01 22:09 ` [PATCH 06/20] intel_idle: " Rafael J. Wysocki
2015-04-01 22:10 ` [PATCH 07/20] ARM: OMAP: " Rafael J. Wysocki
2015-04-01 22:11 ` [PATCH 08/20] clockevents: Remove the broadcast control leftovers Rafael J. Wysocki
2015-04-01 22:13 ` [PATCH 09/20] clockevents: Provide explicit broadcast oneshot control functions Rafael J. Wysocki
2015-04-01 22:15 ` [PATCH 10/20] x86, amd_idle: Use " Rafael J. Wysocki
2015-04-01 22:16 ` [PATCH 11/20] ACPI / PAD: Use explicit broadcast oneshot control function Rafael J. Wysocki
2015-04-01 22:17 ` [PATCH 12/20] ACPI / processor: Use explicit broadcast controll function Rafael J. Wysocki
2015-04-01 22:20 ` [PATCH 13/20] intel_idle: Use explicit broadcast oneshot control function Rafael J. Wysocki
2015-04-01 22:20 ` [PATCH 14/20] ARM: OMAP: " Rafael J. Wysocki
2015-04-01 22:21 ` [PATCH 15/20] ARM: tegra: " Rafael J. Wysocki
2015-04-01 22:22 ` [PATCH 16/20] sched/idle: " Rafael J. Wysocki
2015-04-28 10:11   ` Linus Walleij
2015-04-28 10:17     ` Sudeep Holla
2015-04-28 10:34     ` Daniel Lezcano
2015-04-28 10:34       ` Daniel Lezcano
2015-04-28 10:42       ` Sudeep Holla
2015-04-28 12:19         ` Rafael J. Wysocki
2015-04-28 12:37           ` Linus Walleij
2015-04-28 13:31             ` Rafael J. Wysocki
2015-04-28 13:37               ` Rafael J. Wysocki
2015-04-28 14:14                 ` Rafael J. Wysocki
2015-04-28 13:58                   ` Sudeep Holla
2015-04-29  0:50                     ` Rafael J. Wysocki
2015-04-29  1:04                       ` Rafael J. Wysocki
2015-04-29  7:10                         ` Linus Walleij
2015-04-29  8:57                         ` Peter Zijlstra
2015-04-29  9:44                         ` Daniel Lezcano
2015-04-29  9:50                         ` Sudeep Holla
2015-04-29 14:07                           ` [PATCH][Fix] cpuidle: Run tick_broadcast_exit() with disabled interrupts Rafael J. Wysocki
2015-04-30  3:47                             ` Preeti U Murthy
2015-04-30 20:12                             ` Nicolas Pitre
2015-04-30 22:10                               ` Rafael J. Wysocki
2015-04-30  3:45                         ` [PATCH 16/20] sched/idle: Use explicit broadcast oneshot control function Preeti U Murthy
2015-04-28 13:04           ` Sudeep Holla
2015-04-01 22:23 ` [PATCH 17/20] clockevents: Remove broadcast oneshot control leftovers Rafael J. Wysocki
2015-04-01 22:24 ` Rafael J. Wysocki [this message]
2015-04-01 22:25 ` [PATCH 19/20] clockevents: Cleanup dead cpu explicitely Rafael J. Wysocki
2015-04-01 22:26 ` [PATCH 20/20] timekeeping: Get rid of stale comment Rafael J. Wysocki
2015-04-01 23:57   ` John Stultz
2015-04-02 12:39 ` [PATCH 00/20] clockevents_notify() removal Ingo Molnar
2015-04-02 22:19   ` Rafael J. Wysocki
2015-04-02 23:45     ` [v2][PATCH 00/21] " Rafael J. Wysocki
2015-04-02 23:46       ` [v2][PATCH 01/21] ACPI / PAD: Remove the local APIC nonsense Rafael J. Wysocki
2015-04-03  8:21         ` [tip:timers/core] ACPI/PAD: " tip-bot for Thomas Gleixner
2015-04-03  0:01       ` [v2][PATCH 02/21] clockevents: Provide explicit broadcast control functions Rafael J. Wysocki
2015-04-03  8:21         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:01       ` [v2][PATCH 03/21] x86, amd_idle: Use explicit broadcast control function Rafael J. Wysocki
2015-04-03  8:22         ` [tip:timers/core] x86/amd/idle, clockevents: " tip-bot for Thomas Gleixner
2015-04-03  0:01       ` [v2][PATCH 04/21] ACPI / PAD: " Rafael J. Wysocki
2015-04-03  8:22         ` [tip:timers/core] ACPI/PAD: " tip-bot for Thomas Gleixner
2015-04-03  0:02       ` [v2][PATCH 05/21] ACPI / processor: " Rafael J. Wysocki
2015-04-03  8:22         ` [tip:timers/core] ACPI/processor: " tip-bot for Thomas Gleixner
2015-04-03  0:02       ` [v2][PATCH 06/21] cpuidle: " Rafael J. Wysocki
2015-04-03  8:23         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:02       ` [v2][PATCH 07/21] intel_idle: " Rafael J. Wysocki
2015-04-03  8:23         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:02       ` [v2][PATCH 08/21] ARM: OMAP: " Rafael J. Wysocki
2015-04-03  8:23         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:03       ` [v2][PATCH 09/21] clockevents: Remove the broadcast control leftovers Rafael J. Wysocki
2015-04-03  8:23         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:05       ` [v2][PATCH 10/21] clockevents: Provide explicit broadcast oneshot control functions Rafael J. Wysocki
2015-04-03  8:24         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:05       ` [v2][PATCH 11/21] x86, amd_idle: Use " Rafael J. Wysocki
2015-04-03  8:24         ` [tip:timers/core] x86/amd/idle, clockevents: " tip-bot for Thomas Gleixner
2015-04-03  0:06       ` [v2][PATCH 12/21] ACPI / PAD: Use explicit broadcast oneshot control function Rafael J. Wysocki
2015-04-03  8:24         ` [tip:timers/core] ACPI/PAD: " tip-bot for Thomas Gleixner
2015-04-03  0:12       ` [v2][PATCH 13/21] ACPI / processor: Use explicit broadcast controll function Rafael J. Wysocki
2015-04-03  8:25         ` [tip:timers/core] ACPI/idle: Use explicit broadcast control function tip-bot for Thomas Gleixner
2015-04-03  0:14       ` [v2][PATCH 14/21] intel_idle: Use explicit broadcast oneshot " Rafael J. Wysocki
2015-04-03  8:25         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:31       ` [v2][PATCH 15/21] ARM: OMAP: " Rafael J. Wysocki
2015-04-03  8:25         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:32       ` [v2][PATCH 16/21] ARM: tegra: " Rafael J. Wysocki
2015-04-03  8:25         ` [tip:timers/core] ARM: Tegra: " tip-bot for Thomas Gleixner
2015-04-03  0:34       ` [v2][PATCH 17/21] sched/idle: " Rafael J. Wysocki
2015-04-03  8:26         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:36       ` [v2][PATCH 18/21] clockevents: Remove broadcast oneshot control leftovers Rafael J. Wysocki
2015-04-03  8:26         ` [tip:timers/core] " tip-bot for Rafael J. Wysocki
2015-04-03  0:37       ` [v2][PATCH 19/21] clockevents: Make tick handover explicit Rafael J. Wysocki
2015-04-03  8:26         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:38       ` [v2][PATCH 20/21] clockevents: Cleanup dead cpu explicitely Rafael J. Wysocki
2015-04-03  8:26         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  0:39       ` [v2][PATCH 21/21] timekeeping: Get rid of stale comment Rafael J. Wysocki
2015-04-03  8:27         ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03  6:45       ` [v2][PATCH 00/21] clockevents_notify() removal Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1889903.Zmz9h0EYfy@vostro.rjw.lan \
    --to=rjw@rjwysocki.net \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.