linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: linux-kernel@vger.kernel.org, mingo@kernel.org, rjw@rjwysocki.net
Cc: tglx@linutronix.de, peterz@infradead.org,
	Nicolas Pitre <nicolas.pitre@linaro.org>,
	Russell King <rmk+kernel@arm.linux.org.uk>
Subject: [PATCH 35/35] arm: bl_switcher: Kill tick suspend hackery
Date: Mon, 16 Feb 2015 13:15:10 +0100	[thread overview]
Message-ID: <20150216122414.067997566@infradead.org> (raw)
In-Reply-To: 20150216121435.203983131@infradead.org

[-- Attachment #1: arm-bl-switcher-kill-tick-suspend-hackery.patch --]
[-- Type: text/plain, Size: 5983 bytes --]

From: Thomas Gleixner <tglx@linutronix.de>

Sure it's simple to abuse random functions and data structures and let
the people who made the mistake to put the declarations into a global
header file deal with the fallout.

Adding a tick_suspend/resume_local() pair to the core code would have
been a trivial thing to do.

Use the new tick_suspend/resume_local() and get rid of the homebrewn
hackery. The check for the cpumask is completely pointless. There is
no harm to suspend a per cpu tick device unconditionally. If that's a
real issue then we fix it proper at the core level and not with some
completely undocumented hacks in some random arch code.

Move the tick internals to the core code, now that this nuisance is
gone.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
---
 arch/arm/common/bL_switcher.c |   16 ++--------------
 include/linux/clockchips.h    |    6 ------
 include/linux/tick.h          |   18 ++----------------
 kernel/time/tick-internal.h   |    5 +++++
 kernel/time/tick-sched.h      |   10 ++++++++++
 5 files changed, 19 insertions(+), 36 deletions(-)

Index: linux/arch/arm/common/bL_switcher.c
===================================================================
--- linux.orig/arch/arm/common/bL_switcher.c
+++ linux/arch/arm/common/bL_switcher.c
@@ -151,8 +151,6 @@ static int bL_switch_to(unsigned int new
 	unsigned int mpidr, this_cpu, that_cpu;
 	unsigned int ob_mpidr, ob_cpu, ob_cluster, ib_mpidr, ib_cpu, ib_cluster;
 	struct completion inbound_alive;
-	struct tick_device *tdev;
-	enum clock_event_mode tdev_mode;
 	long volatile *handshake_ptr;
 	int ipi_nr, ret;
 
@@ -219,13 +217,7 @@ static int bL_switch_to(unsigned int new
 	/* redirect GIC's SGIs to our counterpart */
 	gic_migrate_target(bL_gic_id[ib_cpu][ib_cluster]);
 
-	tdev = tick_get_device(this_cpu);
-	if (tdev && !cpumask_equal(tdev->evtdev->cpumask, cpumask_of(this_cpu)))
-		tdev = NULL;
-	if (tdev) {
-		tdev_mode = tdev->evtdev->mode;
-		clockevents_set_mode(tdev->evtdev, CLOCK_EVT_MODE_SHUTDOWN);
-	}
+	tick_suspend_local();
 
 	ret = cpu_pm_enter();
 
@@ -251,11 +243,7 @@ static int bL_switch_to(unsigned int new
 
 	ret = cpu_pm_exit();
 
-	if (tdev) {
-		clockevents_set_mode(tdev->evtdev, tdev_mode);
-		clockevents_program_event(tdev->evtdev,
-					  tdev->evtdev->next_event, 1);
-	}
+	tick_resume_local();
 
 	trace_cpu_migrate_finish(ktime_get_real_ns(), ib_mpidr);
 	local_fiq_enable();
Index: linux/include/linux/clockchips.h
===================================================================
--- linux.orig/include/linux/clockchips.h
+++ linux/include/linux/clockchips.h
@@ -149,11 +149,5 @@ clockevents_calc_mult_shift(struct clock
 	return clocks_calc_mult_shift(&ce->mult, &ce->shift, NSEC_PER_SEC,
 				      freq, minsec);
 }
-
-/* Should be core only, but is abused by arm bl_switcher */
-extern void clockevents_set_mode(struct clock_event_device *dev,
-				 enum clock_event_mode mode);
-extern int clockevents_program_event(struct clock_event_device *dev,
-				     ktime_t expires, bool force);
 #endif /* CONFIG_GENERIC_CLOCKEVENTS */
 #endif
Index: linux/include/linux/tick.h
===================================================================
--- linux.orig/include/linux/tick.h
+++ linux/include/linux/tick.h
@@ -11,25 +11,11 @@
 #include <linux/cpumask.h>
 #include <linux/sched.h>
 
-/* ARM BL switcher abuse support */
-#ifdef CONFIG_GENERIC_CLOCKEVENTS
-enum tick_device_mode {
-	TICKDEV_MODE_PERIODIC,
-	TICKDEV_MODE_ONESHOT,
-};
-
-struct tick_device {
-	struct clock_event_device *evtdev;
-	enum tick_device_mode mode;
-};
-extern struct tick_device *tick_get_device(int cpu);
-#endif
-
 #ifdef CONFIG_GENERIC_CLOCKEVENTS
 extern void __init tick_init(void);
-/* Should be core only, but arm BL switcher has its homebrewn implementation */
+/* Should be core only, but arm BL switcher requires it */
 extern void tick_suspend_local(void);
-/* Should be core only, but XEN resume magic requires this */
+/* Should be core only, but XEN resume magic and arm BL switcher require it */
 extern void tick_resume_local(void);
 /* CPU hotplug */
 extern void tick_shutdown_local(void);
Index: linux/kernel/time/tick-internal.h
===================================================================
--- linux.orig/kernel/time/tick-internal.h
+++ linux/kernel/time/tick-internal.h
@@ -26,6 +26,7 @@ extern bool tick_check_replacement(struc
 				   struct clock_event_device *newdev);
 extern void tick_install_replacement(struct clock_event_device *dev);
 extern int tick_is_oneshot_available(void);
+extern struct tick_device *tick_get_device(int cpu);
 
 /* Check, if the device is functional or a dummy for broadcast */
 static inline int tick_device_is_functional(struct clock_event_device *dev)
@@ -36,6 +37,10 @@ static inline int tick_device_is_functio
 extern void clockevents_shutdown(struct clock_event_device *dev);
 extern void clockevents_exchange_device(struct clock_event_device *old,
 					struct clock_event_device *new);
+extern void clockevents_set_mode(struct clock_event_device *dev,
+				 enum clock_event_mode mode);
+extern int clockevents_program_event(struct clock_event_device *dev,
+				     ktime_t expires, bool force);
 extern void clockevents_handle_noop(struct clock_event_device *dev);
 extern void clockevents_cleanup_dying_cpu(struct clock_event_device *dev);
 extern int __clockevents_update_freq(struct clock_event_device *dev, u32 freq);
Index: linux/kernel/time/tick-sched.h
===================================================================
--- linux.orig/kernel/time/tick-sched.h
+++ linux/kernel/time/tick-sched.h
@@ -3,6 +3,16 @@
 
 #include <linux/hrtimer.h>
 
+enum tick_device_mode {
+	TICKDEV_MODE_PERIODIC,
+	TICKDEV_MODE_ONESHOT,
+};
+
+struct tick_device {
+	struct clock_event_device *evtdev;
+	enum tick_device_mode mode;
+};
+
 enum tick_nohz_mode {
 	NOHZ_MODE_INACTIVE,
 	NOHZ_MODE_LOWRES,



  parent reply	other threads:[~2015-02-16 13:09 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-16 12:14 [PATCH 00/35] Some kernel/time cleanups Peter Zijlstra
2015-02-16 12:14 ` [PATCH 01/35] ACPI/acpi_pad: Remove the local apic nonsense Peter Zijlstra
2015-02-16 18:54   ` Rafael J. Wysocki
2015-02-18  6:16     ` Rafael J. Wysocki
2015-02-16 12:14 ` [PATCH 02/35] clockevents: Remove CONFIG_GENERIC_CLOCKEVENTS_BUILD Peter Zijlstra
2015-02-16 12:14 ` [PATCH 03/35] tick: Cleanup internal header files Peter Zijlstra
2015-02-16 12:14 ` [PATCH 04/35] tick: Cleanup internal header file Peter Zijlstra
2015-02-16 12:14 ` [PATCH 05/35] tick: Move core only declarations and functions to core Peter Zijlstra
2015-02-16 12:14 ` [PATCH 06/35] clockevents: Remove extra local_irq_save in clockevents_exchange_device() Peter Zijlstra
2015-02-16 12:14 ` [PATCH 07/35] clockevents: Make suspend/resume calls explicit Peter Zijlstra
2015-02-16 19:07   ` Rafael J. Wysocki
2015-02-16 12:14 ` [PATCH 08/35] tick: Make tick_resume_broadcast_oneshot static Peter Zijlstra
2015-02-16 12:14 ` [PATCH 09/35] tick/xen: Provide and use tick_resume_local() Peter Zijlstra
2015-02-16 16:37   ` David Vrabel
2015-02-16 12:14 ` [PATCH 10/35] clockevents: Make tick handover explicit Peter Zijlstra
2015-02-16 12:14 ` [PATCH 11/35] clockevents: Cleanup dead cpu explicitely Peter Zijlstra
2015-02-16 12:14 ` [PATCH 12/35] clockevents: Provide explicit broadcast control function Peter Zijlstra
2015-02-23 18:08   ` Daniel Lezcano
2015-02-24  0:38   ` Tony Lindgren
2015-02-16 12:14 ` [PATCH 13/35] x86, amd_idle: Use explicit broadcast control functions Peter Zijlstra
2015-02-16 12:14 ` [PATCH 14/35] ACPI / PAD: Use explicit broadcast control function Peter Zijlstra
2015-02-16 12:14 ` [PATCH 15/35] ACPI/ processor_idle: Use explicit broadcast controll function Peter Zijlstra
2015-02-16 12:14 ` [PATCH 16/35] cpuidle: Use explicit broadcast control function Peter Zijlstra
2015-02-23 18:11   ` Daniel Lezcano
2015-02-16 12:14 ` [PATCH 17/35] intel_idle: " Peter Zijlstra
2015-02-16 12:14 ` [PATCH 18/35] ARM: OMAP: " Peter Zijlstra
2015-02-24  0:40   ` Tony Lindgren
2015-02-16 12:14 ` [PATCH 19/35] clockevents: Remove the broadcast control leftovers Peter Zijlstra
2015-02-16 12:14 ` [PATCH 20/35] clockevents: Provide explicit broadcast oneshot control function Peter Zijlstra
2015-02-24  0:41   ` Tony Lindgren
2015-02-16 12:14 ` [PATCH 21/35] x86, amd_idle: Use explicit broadcast oneshot control functions Peter Zijlstra
2015-02-16 12:14 ` [PATCH 22/35] ACPI / PAD: Use explicit broadcast oneshot control function Peter Zijlstra
2015-02-16 12:14 ` [PATCH 23/35] ACPI/ processor_idle: Use explicit broadcast oneshot controll function Peter Zijlstra
2015-02-16 12:14 ` [PATCH 24/35] intel_idle: Use explicit broadcast oneshot control function Peter Zijlstra
2015-02-16 12:15 ` [PATCH 25/35] ARM: OMAP: " Peter Zijlstra
2015-02-24  0:41   ` Tony Lindgren
2015-02-16 12:15 ` [PATCH 26/35] ARM: tegra: " Peter Zijlstra
2015-02-16 12:15 ` [PATCH 27/35] sched/idle: " Peter Zijlstra
2015-02-21  0:56   ` Nicolas Pitre
2015-02-21 11:19     ` Peter Zijlstra
2015-02-16 12:15 ` [PATCH 28/35] clockevents: Remove the broadcast oneshot control leftovers Peter Zijlstra
2015-02-16 12:15 ` [PATCH 29/35] tick/timekeeping: Make PM_SLEEP related code conditional Peter Zijlstra
2015-02-16 12:15 ` [PATCH 30/35] timekeeping: Get rid of stale comment Peter Zijlstra
2015-02-16 12:15 ` [PATCH 31/35] clockevents: Consolidate tick_shutdown() Peter Zijlstra
2015-02-16 12:15 ` [PATCH 32/35] clockevents: Fix cpu down race for hrtimer based broadcasting Peter Zijlstra
2015-02-17  4:03   ` Preeti U Murthy
2015-02-17 10:39     ` Peter Zijlstra
2015-02-18  3:10       ` Preeti U Murthy
2015-02-18 13:06         ` Peter Zijlstra
2015-02-19  7:01           ` Preeti U Murthy
2015-02-19  9:53             ` Peter Zijlstra
2015-02-19 17:51   ` Nicolas Pitre
2015-02-21 12:46     ` Peter Zijlstra
2015-02-21 17:45       ` Nicolas Pitre
2015-02-23 16:14         ` Peter Zijlstra
2015-02-23 16:32           ` Nicolas Pitre
2015-02-23 17:33             ` Nicolas Pitre
2015-02-26  5:31               ` Preeti U Murthy
2015-02-27  8:49                 ` Preeti U Murthy
2015-03-02 14:56                   ` Peter Zijlstra
2015-03-05  4:20                     ` Preeti U Murthy
2015-03-29  6:45                       ` Ingo Molnar
2015-03-16  4:52                     ` Preeti U Murthy
2015-03-25  5:32                       ` Preeti U Murthy
2015-02-16 12:15 ` [PATCH 33/35] tick: Make hrtimer broadcasting opt-in Peter Zijlstra
2015-02-17  3:06   ` Preeti U Murthy
2015-02-17 10:04   ` Lorenzo Pieralisi
2015-02-16 12:15 ` [PATCH 34/35] tick: Provide tick_suspend_local() Peter Zijlstra
2015-02-17 14:31   ` Lorenzo Pieralisi
2015-02-17 17:55     ` Nicolas Pitre
2015-02-17 21:29       ` Nicolas Pitre
2015-02-18 13:35     ` Peter Zijlstra
2015-02-18 16:22       ` Rafael J. Wysocki
2015-02-18 16:38       ` Lorenzo Pieralisi
2015-02-16 12:15 ` Peter Zijlstra [this message]
2015-02-16 19:14 ` [PATCH 00/35] Some kernel/time cleanups Rafael J. Wysocki
2015-03-25 12:04 ` [PATCH 00/09] Some kernel/time cleanups (related to timer_suspend/resume) Rafael J. Wysocki
2015-03-25 12:05   ` [PATCH 01/09] clockevents: Remove CONFIG_GENERIC_CLOCKEVENTS_BUILD Rafael J. Wysocki
2015-04-02 12:28     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-03-25 12:06   ` [PATCH 02/09] tick: Move clocksource related stuff to timekeeping.h Rafael J. Wysocki
2015-04-02 12:28     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-03-25 12:06   ` [PATCH 03/09] tick: Simplify tick-internal.h Rafael J. Wysocki
2015-04-02 12:29     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-03-25 12:07   ` [PATCH 04/09] tick: Move core only declarations and functions to core Rafael J. Wysocki
2015-04-02 12:29     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-03-25 12:08   ` [PATCH 05/09] clockevents: Remove extra local_irq_save in clockevents_exchange_device() Rafael J. Wysocki
2015-04-02 12:29     ` [tip:timers/core] clockevents: Remove extra local_irq_save() " tip-bot for Thomas Gleixner
2015-03-25 12:09   ` [PATCH 06/09] clockevents: Make suspend/resume calls explicit Rafael J. Wysocki
2015-04-02 12:30     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-03-25 12:09   ` [PATCH 07/09] tick: Make tick_resume_broadcast_oneshot static Rafael J. Wysocki
2015-04-02 12:30     ` [tip:timers/core] tick: Make tick_resume_broadcast_oneshot() static tip-bot for Thomas Gleixner
2015-03-25 12:11   ` [PATCH 08/09] tick/xen: Provide and use tick_suspend_local() and tick_resume_local() Rafael J. Wysocki
2015-03-25 20:13     ` Konrad Rzeszutek Wilk
2015-03-25 20:57       ` Rafael J. Wysocki
2015-03-25 20:44         ` Konrad Rzeszutek Wilk
2015-03-25 21:36           ` Rafael J. Wysocki
2015-04-02 12:30     ` [tip:timers/core] " tip-bot for Thomas Gleixner
2015-04-03 13:21       ` [PATCH][fix for tip/timers/core] timers / PM: Fix up tick_unfreeze() Rafael J. Wysocki
2015-04-03 13:18         ` [tip:timers/core] timers/PM: " tip-bot for Rafael J. Wysocki
2015-04-03 13:31         ` [PATCH][cleanup for tip/timers/core] timers / PM: Drop unnecessary braces from tick_freeze() Rafael J. Wysocki
2015-04-03 13:18           ` [tip:timers/core] timers/PM: " tip-bot for Rafael J. Wysocki
2015-03-25 12:11   ` [PATCH 09/09] arm: bl_switcher: Kill tick suspend hackery Rafael J. Wysocki
2015-03-25 12:34     ` Nicolas Pitre
2015-04-02 12:30     ` [tip:timers/core] arm/bL_switcher: " tip-bot for Thomas Gleixner
2015-03-25 12:13   ` [PATCH 00/09] Some kernel/time cleanups (related to timer_suspend/resume) Rafael J. Wysocki
2015-03-31 22:45   ` [GIT PULL] kernel/time cleanups (related to tick_suspend/resume) Rafael J. Wysocki

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=20150216122414.067997566@infradead.org \
    --to=peterz@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=nicolas.pitre@linaro.org \
    --cc=rjw@rjwysocki.net \
    --cc=rmk+kernel@arm.linux.org.uk \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).