From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753364AbcKZXOj (ORCPT ); Sat, 26 Nov 2016 18:14:39 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:43474 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753181AbcKZXOR (ORCPT ); Sat, 26 Nov 2016 18:14:17 -0500 From: Sebastian Andrzej Siewior To: linux-kernel@vger.kernel.org Cc: rt@linutronix.de, tglx@linutronix.de, Sebastian Andrzej Siewior , Robert Richter , oprofile-list@lists.sf.net Subject: [PATCH 05/22] oprofile/nmi timer: Convert to hotplug state machine Date: Sun, 27 Nov 2016 00:13:33 +0100 Message-Id: <20161126231350.10321-6-bigeasy@linutronix.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20161126231350.10321-1-bigeasy@linutronix.de> References: <20161126231350.10321-1-bigeasy@linutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Cc: Robert Richter Cc: oprofile-list@lists.sf.net Signed-off-by: Sebastian Andrzej Siewior --- drivers/oprofile/nmi_timer_int.c | 58 +++++++++++++-----------------------= ---- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/drivers/oprofile/nmi_timer_int.c b/drivers/oprofile/nmi_timer_= int.c index 9559829fb234..e65a576e4032 100644 --- a/drivers/oprofile/nmi_timer_int.c +++ b/drivers/oprofile/nmi_timer_int.c @@ -59,25 +59,16 @@ static void nmi_timer_stop_cpu(int cpu) perf_event_disable(event); } =20 -static int nmi_timer_cpu_notifier(struct notifier_block *b, unsigned long = action, - void *data) +static int nmi_timer_cpu_online(unsigned int cpu) { - int cpu =3D (unsigned long)data; - switch (action) { - case CPU_DOWN_FAILED: - case CPU_ONLINE: - nmi_timer_start_cpu(cpu); - break; - case CPU_DOWN_PREPARE: - nmi_timer_stop_cpu(cpu); - break; - } - return NOTIFY_DONE; + nmi_timer_start_cpu(cpu); + return 0; +} +static int nmi_timer_cpu_predown(unsigned int cpu) +{ + nmi_timer_stop_cpu(cpu); + return 0; } - -static struct notifier_block nmi_timer_cpu_nb =3D { - .notifier_call =3D nmi_timer_cpu_notifier -}; =20 static int nmi_timer_start(void) { @@ -103,13 +94,14 @@ static void nmi_timer_stop(void) put_online_cpus(); } =20 +static enum cpuhp_state hp_online; + static void nmi_timer_shutdown(void) { struct perf_event *event; int cpu; =20 - cpu_notifier_register_begin(); - __unregister_cpu_notifier(&nmi_timer_cpu_nb); + cpuhp_remove_state(hp_online); for_each_possible_cpu(cpu) { event =3D per_cpu(nmi_timer_events, cpu); if (!event) @@ -118,13 +110,11 @@ static void nmi_timer_shutdown(void) per_cpu(nmi_timer_events, cpu) =3D NULL; perf_event_release_kernel(event); } - - cpu_notifier_register_done(); } =20 static int nmi_timer_setup(void) { - int cpu, err; + int err; u64 period; =20 /* clock cycles per tick: */ @@ -132,24 +122,14 @@ static int nmi_timer_setup(void) do_div(period, HZ); nmi_timer_attr.sample_period =3D period; =20 - cpu_notifier_register_begin(); - err =3D __register_cpu_notifier(&nmi_timer_cpu_nb); - if (err) - goto out; - - /* can't attach events to offline cpus: */ - for_each_online_cpu(cpu) { - err =3D nmi_timer_start_cpu(cpu); - if (err) { - cpu_notifier_register_done(); - nmi_timer_shutdown(); - return err; - } + err =3D cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "oprofile/nmi:online", + nmi_timer_cpu_online, nmi_timer_cpu_predown); + if (err < 0) { + nmi_timer_shutdown(); + return err; } - -out: - cpu_notifier_register_done(); - return err; + hp_online =3D err; + return 0; } =20 int __init op_nmi_timer_init(struct oprofile_operations *ops) --=20 2.10.2