From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752061Ab0KYKZW (ORCPT ); Thu, 25 Nov 2010 05:25:22 -0500 Received: from canuck.infradead.org ([134.117.69.58]:52552 "EHLO canuck.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751374Ab0KYKZV convert rfc822-to-8bit (ORCPT ); Thu, 25 Nov 2010 05:25:21 -0500 Subject: Re: [RFC][PATCH 2/8] perf, arch: Use early_initcall() for all arch pmu implementations From: Peter Zijlstra To: Ingo Molnar Cc: Lin Ming , Stephane Eranian , "robert.richter" , Corey Ashford , fweisbec , paulus , Greg Kroah-Hartman , Kay Sievers , "H. Peter Anvin" , Kyle Moffett , linux-kernel@vger.kernel.org, davem , Michael Cree , Deng-Cheng Zhu , paulus , Will Deacon , Paul Mundt , Don Zickus In-Reply-To: <20101117222056.040309789@chello.nl> References: <20101117221730.002627458@chello.nl> <20101117222056.040309789@chello.nl> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Date: Thu, 25 Nov 2010 11:25:13 +0100 Message-ID: <1290680713.2145.18.camel@laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 2010-11-17 at 23:17 +0100, Peter Zijlstra wrote: > plain text document attachment (perf-fix-hw-init.patch) > Currently architectures use various random locations to init the PMU > driver, for some this happens before the perf core code is > initialized. > > In order to avoid calling perf_pmu_register() before the core code is > up and running and able to deal with it, move all arch init to at > least early_initcall (some archs use a later init, which is fine). > > Signed-off-by: Peter Zijlstra > --- > Index: linux-2.6/arch/x86/kernel/cpu/perf_event.c > =================================================================== > --- linux-2.6.orig/arch/x86/kernel/cpu/perf_event.c > +++ linux-2.6/arch/x86/kernel/cpu/perf_event.c > @@ -1348,7 +1348,7 @@ static void __init pmu_check_apic(void) > pr_info("no hardware sampling interrupt available.\n"); > } > > -void __init init_hw_perf_events(void) > +int __init init_hw_perf_events(void) > { > struct event_constraint *c; > int err; > @@ -1363,11 +1363,11 @@ void __init init_hw_perf_events(void) > err = amd_pmu_init(); > break; > default: > - return; > + return 0; > } > if (err != 0) { > pr_cont("no PMU driver, software events only.\n"); > - return; > + return 0; > } > > pmu_check_apic(); > @@ -1420,7 +1420,10 @@ void __init init_hw_perf_events(void) > > perf_pmu_register(&pmu); > perf_cpu_notifier(x86_pmu_notifier); > + > + return 0; > } > +early_initcall(init_hw_perf_events); > > static inline void x86_pmu_read(struct perf_event *event) > { Right, so hw perf init happens from (after this patch): arch_initcall: powerpc, arm, sh, mips early_initcall: x86, sparc, alpha Now the problem is that the generic watchdog code (kernel/watchdog.c) tries to create hw perf events, and that too runs from early_initcall. So my question is, how do we go about curing this, because powerpc, arm, sh and mips are too late and the rest depends on link order to work, not really a nice situation. There's two categories of solutions: - move the watchdog later, and - move the hw perf init earlier. The former is undesired because we want the watchdog as early as possible, the later needs new infrastructure (also, I don't know if the arch implementations can actually run this early). So do I create a perf_initcall() or is there another solution that avoids things like calling the watchdog code from all arch init code?