From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423334AbcBQNvQ (ORCPT ); Wed, 17 Feb 2016 08:51:16 -0500 Received: from www.linutronix.de ([62.245.132.108]:43936 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1422987AbcBQNsv (ORCPT ); Wed, 17 Feb 2016 08:48:51 -0500 Message-Id: <20160217133932.439605631@linutronix.de> User-Agent: quilt/0.63-1 Date: Wed, 17 Feb 2016 13:47:37 -0000 From: Thomas Gleixner To: LKML Cc: Peter Zijlstra , Ingo Molnar , Borislav Petkov , Stephane Eranian , Harish Chegondi , Kan Liang , Andi Kleen , Andi Kleen Subject: [patch 09/11] x86/perf/intel_uncore: Make PCI and MSR uncore independent References: <20160217132903.767990400@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=x86-perf-intel_uncore--Make-PCI-and-MSR-uncore-independent.patch X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001,URIBL_BLOCKED=0.001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Andi wanted to do this before, but the patch fell down the cracks. Implement it with the proper error handling. Requested-by: Andi Kleen Signed-off-by: Thomas Gleixner --- arch/x86/kernel/cpu/perf_event_intel_uncore.c | 34 +++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c @@ -1014,7 +1014,7 @@ static int __init uncore_pci_init(void) ret = skl_uncore_pci_init(); break; default: - return 0; + return -ENODEV; } if (ret) @@ -1302,7 +1302,7 @@ static int __init uncore_cpu_init(void) knl_uncore_cpu_init(); break; default: - return 0; + return -ENODEV; } ret = uncore_types_init(uncore_msr_uncores, true); @@ -1327,7 +1327,7 @@ static void __init uncore_cpu_setup(void /* Lazy to avoid allocation of a few bytes for the normal case */ static __initdata DECLARE_BITMAP(packages, NR_CPUS); -static int __init uncore_cpumask_init(void) +static int __init uncore_cpumask_init(bool msr) { unsigned int cpu; @@ -1338,12 +1338,15 @@ static int __init uncore_cpumask_init(vo if (test_and_set_bit(pkg, packages)) continue; /* - * The first online cpu of each package takes the refcounts - * for all other online cpus in that package. + * The first online cpu of each package allocates and takes + * the refcounts for all other online cpus in that package. + * If msrs are not enabled no allocation is required. */ - ret = uncore_cpu_prepare(cpu); - if (ret) - return ret; + if (msr) { + ret = uncore_cpu_prepare(cpu); + if (ret) + return ret; + } uncore_event_init_cpu(cpu); smp_call_function_single(cpu, uncore_cpu_setup, NULL, 1); } @@ -1353,7 +1356,7 @@ static int __init uncore_cpumask_init(vo static int __init intel_uncore_init(void) { - int ret; + int pret, cret, ret; if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) return -ENODEV; @@ -1361,15 +1364,14 @@ static int __init intel_uncore_init(void if (cpu_has_hypervisor) return -ENODEV; - ret = uncore_pci_init(); - if (ret) - return ret; - ret = uncore_cpu_init(); - if (ret) - goto err; + pret = uncore_pci_init(); + cret = uncore_cpu_init(); + + if (cret && pret) + return -ENODEV; cpu_notifier_register_begin(); - ret = uncore_cpumask_init(); + ret = uncore_cpumask_init(!cret); if (ret) goto err; cpu_notifier_register_done();