Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755134AbcKQSgj (ORCPT ); Thu, 17 Nov 2016 13:36:39 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:49704 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755017AbcKQSgd (ORCPT ); Thu, 17 Nov 2016 13:36:33 -0500 From: Sebastian Andrzej Siewior To: linux-kernel@vger.kernel.org Cc: rt@linuxtronix.de, Sebastian Andrzej Siewior , Robert Richter , x86@kernel.org, oprofile-list@lists.sf.net Subject: [PATCH 19/20] x86/oprofile/nmi: Convert to hotplug state machine Date: Thu, 17 Nov 2016 19:35:40 +0100 Message-Id: <20161117183541.8588-20-bigeasy@linutronix.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20161117183541.8588-1-bigeasy@linutronix.de> References: <20161117183541.8588-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 Content-Length: 3573 Lines: 146 Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Cc: Robert Richter Cc: x86@kernel.org Cc: oprofile-list@lists.sf.net Signed-off-by: Sebastian Andrzej Siewior --- arch/x86/oprofile/nmi_int.c | 61 +++++++++++++----------------------------= ---- 1 file changed, 18 insertions(+), 43 deletions(-) diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index c39172cd6c87..47b4cbf8da68 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c @@ -339,10 +339,11 @@ static int allocate_msrs(void) return 0; } =20 -static void nmi_cpu_setup(void *dummy) +static void nmi_cpu_setup(void) { int cpu =3D smp_processor_id(); struct op_msrs *msrs =3D &per_cpu(cpu_msrs, cpu); + nmi_cpu_save_registers(msrs); raw_spin_lock(&oprofilefs_lock); model->setup_ctrs(model, msrs); @@ -369,7 +370,7 @@ static void nmi_cpu_restore_registers(struct op_msrs *m= srs) } } =20 -static void nmi_cpu_shutdown(void *dummy) +static void nmi_cpu_shutdown(void) { unsigned int v; int cpu =3D smp_processor_id(); @@ -387,24 +388,26 @@ static void nmi_cpu_shutdown(void *dummy) nmi_cpu_restore_registers(msrs); } =20 -static void nmi_cpu_up(void) +static int nmi_cpu_online(unsigned int cpu) { local_irq_disable(); if (nmi_enabled) - nmi_cpu_setup(NULL); + nmi_cpu_setup(); if (ctr_running) nmi_cpu_start(NULL); local_irq_enable(); + return 0; } =20 -static void nmi_cpu_down(void) +static int nmi_cpu_down_prep(unsigned int cpu) { local_irq_disable(); if (ctr_running) nmi_cpu_stop(NULL); if (nmi_enabled) - nmi_cpu_shutdown(NULL); + nmi_cpu_shutdown(); local_irq_enable(); + return 0; } =20 static int nmi_create_files(struct dentry *root) @@ -437,24 +440,7 @@ static int nmi_create_files(struct dentry *root) return 0; } =20 -static int oprofile_cpu_notifier(struct notifier_block *b, unsigned long a= ction, - void *data) -{ - switch (action & ~CPU_TASKS_FROZEN) { - case CPU_DOWN_FAILED: - case CPU_ONLINE: - nmi_cpu_up(); - break; - case CPU_DOWN_PREPARE: - nmi_cpu_down(); - break; - } - return NOTIFY_DONE; -} - -static struct notifier_block oprofile_cpu_nb =3D { - .notifier_call =3D oprofile_cpu_notifier -}; +static enum cpuhp_state hp_online; =20 static int nmi_setup(void) { @@ -497,20 +483,17 @@ static int nmi_setup(void) if (err) goto fail; =20 - cpu_notifier_register_begin(); - - /* Use get/put_online_cpus() to protect 'nmi_enabled' */ - get_online_cpus(); nmi_enabled =3D 1; /* make nmi_enabled visible to the nmi handler: */ smp_mb(); - on_each_cpu(nmi_cpu_setup, NULL, 1); - __register_cpu_notifier(&oprofile_cpu_nb); - put_online_cpus(); - - cpu_notifier_register_done(); - + err =3D cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/oprofile:online", + nmi_cpu_online, nmi_cpu_down_prep); + if (err < 0) + goto fail_nmi; + hp_online =3D err; return 0; +fail_nmi: + unregister_nmi_handler(NMI_LOCAL, "oprofile"); fail: free_msrs(); return err; @@ -520,17 +503,9 @@ static void nmi_shutdown(void) { struct op_msrs *msrs; =20 - cpu_notifier_register_begin(); - - /* Use get/put_online_cpus() to protect 'nmi_enabled' & 'ctr_running' */ - get_online_cpus(); - on_each_cpu(nmi_cpu_shutdown, NULL, 1); + cpuhp_remove_state(hp_online); nmi_enabled =3D 0; ctr_running =3D 0; - __unregister_cpu_notifier(&oprofile_cpu_nb); - put_online_cpus(); - - cpu_notifier_register_done(); =20 /* make variables visible to the nmi handler: */ smp_mb(); --=20 2.10.2