From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753420AbcKGNUu (ORCPT ); Mon, 7 Nov 2016 08:20:50 -0500 Received: from mail.skyhub.de ([78.46.96.112]:43794 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752488AbcKGNUq (ORCPT ); Mon, 7 Nov 2016 08:20:46 -0500 Date: Mon, 7 Nov 2016 14:20:40 +0100 From: Borislav Petkov To: Sebastian Andrzej Siewior Cc: linux-kernel@vger.kernel.org, rt@linutronix.de, Tony Luck , linux-edac@vger.kernel.org, x86@kernel.org, Thomas Gleixner Subject: Re: [PATCH 21/25] x86/mcheck: Split threshold_cpu_callback into two callbacks Message-ID: <20161107132040.w6oaoe2hu6hpdvy4@pd.tnic> References: <20161103145021.28528-1-bigeasy@linutronix.de> <20161103145021.28528-22-bigeasy@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20161103145021.28528-22-bigeasy@linutronix.de> User-Agent: NeoMutt/20161014 (1.7.1) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 03, 2016 at 03:50:17PM +0100, Sebastian Andrzej Siewior wrote: > The threshold_cpu_callback callbacks looks like one of the notifier and > its arguments are almost the same. Split this out and have one ONLINE > and one DEAD callback. This will come handy later once the main code > gets changed to use the callback mechanism. > Also, handle threshold_cpu_callback_online() return value so we don't > continue if the function fails. > > Cc: Tony Luck > Cc: Borislav Petkov > Cc: linux-edac@vger.kernel.org > Cc: x86@kernel.org > Signed-off-by: Sebastian Andrzej Siewior > Signed-off-by: Thomas Gleixner > --- > arch/x86/include/asm/mce.h | 3 ++- > arch/x86/kernel/cpu/mcheck/mce.c | 18 +++++++++++++----- > arch/x86/kernel/cpu/mcheck/mce_amd.c | 24 ++++-------------------- > 3 files changed, 19 insertions(+), 26 deletions(-) ... > -void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); > +int (*threshold_cpu_callback_online)(unsigned int cpu); > +int (*threshold_cpu_callback_dead)(unsigned int cpu); Let's get rid of those pointers and pointer testing and export the create/remove functions directly. How's that? It builds here. --- Index: b/arch/x86/include/asm/mce.h =================================================================== --- a/arch/x86/include/asm/mce.h 2016-11-07 14:06:40.246518729 +0100 +++ b/arch/x86/include/asm/mce.h 2016-11-07 14:17:36.770529205 +0100 @@ -292,9 +292,9 @@ void do_machine_check(struct pt_regs *, /* * Threshold handler */ - extern void (*mce_threshold_vector)(void); -extern void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); +extern int mce_threshold_create_device(unsigned int cpu); +extern int mce_threshold_remove_device(unsigned int cpu); /* Deferred error interrupt handler */ extern void (*deferred_error_int_vector)(void); Index: b/arch/x86/kernel/cpu/mcheck/mce.c =================================================================== --- a/arch/x86/kernel/cpu/mcheck/mce.c 2016-11-07 14:06:40.246518729 +0100 +++ b/arch/x86/kernel/cpu/mcheck/mce.c 2016-11-07 14:17:06.186528717 +0100 @@ -2291,8 +2291,6 @@ static struct bus_type mce_subsys = { DEFINE_PER_CPU(struct device *, mce_device); -void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); - static inline struct mce_bank *attr_to_bank(struct device_attribute *attr) { return container_of(attr, struct mce_bank, attr); @@ -2548,13 +2546,17 @@ mce_cpu_callback(struct notifier_block * switch (action & ~CPU_TASKS_FROZEN) { case CPU_ONLINE: + mce_device_create(cpu); - if (threshold_cpu_callback) - threshold_cpu_callback(action, cpu); + + if (mce_threshold_create_device(cpu)) { + mce_device_remove(cpu); + return NOTIFY_BAD; + } + break; case CPU_DEAD: - if (threshold_cpu_callback) - threshold_cpu_callback(action, cpu); + mce_threshold_remove_device(cpu); mce_device_remove(cpu); mce_intel_hcpu_update(cpu); Index: b/arch/x86/kernel/cpu/mcheck/mce_amd.c =================================================================== --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c 2016-11-07 14:06:40.246518729 +0100 +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c 2016-11-07 14:18:10.506529743 +0100 @@ -55,6 +55,8 @@ /* Threshold LVT offset is at MSR0xC0000410[15:12] */ #define SMCA_THR_LVT_OFF 0xF000 +static bool thresholding_en; + static const char * const th_names[] = { "load_store", "insn_fetch", @@ -1097,10 +1099,13 @@ free_out: per_cpu(threshold_banks, cpu)[bank] = NULL; } -static void threshold_remove_device(unsigned int cpu) +int mce_threshold_remove_device(unsigned int cpu) { unsigned int bank; + if (!thresholding_en) + return 0; + for (bank = 0; bank < mca_cfg.banks; ++bank) { if (!(per_cpu(bank_map, cpu) & (1 << bank))) continue; @@ -1108,15 +1113,19 @@ static void threshold_remove_device(unsi } kfree(per_cpu(threshold_banks, cpu)); per_cpu(threshold_banks, cpu) = NULL; + return 0; } /* create dir/files for all valid threshold banks */ -static int threshold_create_device(unsigned int cpu) +int mce_threshold_create_device(unsigned int cpu) { unsigned int bank; struct threshold_bank **bp; int err = 0; + if (!thresholding_en) + return 0; + bp = per_cpu(threshold_banks, cpu); if (bp) return 0; @@ -1136,40 +1145,23 @@ static int threshold_create_device(unsig } return err; err: - threshold_remove_device(cpu); + mce_threshold_remove_device(cpu); return err; } -/* get notified when a cpu comes on/off */ -static void -amd_64_threshold_cpu_callback(unsigned long action, unsigned int cpu) -{ - switch (action) { - case CPU_ONLINE: - case CPU_ONLINE_FROZEN: - threshold_create_device(cpu); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - threshold_remove_device(cpu); - break; - default: - break; - } -} - static __init int threshold_init_device(void) { unsigned lcpu = 0; /* to hit CPUs online before the notifier is up */ for_each_online_cpu(lcpu) { - int err = threshold_create_device(lcpu); + int err = mce_threshold_create_device(lcpu); if (err) return err; } - threshold_cpu_callback = amd_64_threshold_cpu_callback; + + thresholding_en = true; return 0; } -- Regards/Gruss, Boris. Good mailing practices for 400: avoid top-posting and trim the reply.