From mboxrd@z Thu Jan 1 00:00:00 1970 Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Nov 2009 05:16:56 +0100 (CET) Received: from mail-pw0-f45.google.com ([209.85.160.45]:52584 "EHLO mail-pw0-f45.google.com" rhost-flags-OK-OK-OK-OK) by ftp.linux-mips.org with ESMTP id S1491811AbZKIEQt (ORCPT ); Mon, 9 Nov 2009 05:16:49 +0100 Received: by pwi15 with SMTP id 15so1735729pwi.24 for ; Sun, 08 Nov 2009 20:16:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:reply-to:to:cc :in-reply-to:references:content-type:organization:date:message-id :mime-version:x-mailer:content-transfer-encoding; bh=EbLpndfLHLCbbRZPVqFhlwGqY7AQKPTZ8kHzIkUW2kU=; b=OpPU/ATF2NS6MVMoac0gzkxG/Fx0MG+KQzya8JPMBiw1QxbZgIvRXoZisag1AOCRAO p9w2Wjl6bwnIhssNUTpkx8e+gnmJjUDYVhUZTw/T8MnZY3xQvHk2o//2YIko42Fipl+T VA8Pw+yOwi32JjYNkS0B9Fi27EzjtpPVN1WM8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:reply-to:to:cc:in-reply-to:references:content-type :organization:date:message-id:mime-version:x-mailer :content-transfer-encoding; b=e80+NQqgvXOdGWy0FkuhAB6xzt5leMt/e86Cg6ePt4loJeAX6VIFvYd20ibd9MsjFv ZTPwXQCTBIVED4WcXghpI1qesg8yWNkRRh4k4shxVWhrnInav9fIAKHV4Q3Hr7PLnet4 E1yG/CjEZr234bgoaJ20xt0qy+Pycp9bjkq9A= Received: by 10.114.6.25 with SMTP id 25mr12885779waf.25.1257740199686; Sun, 08 Nov 2009 20:16:39 -0800 (PST) Received: from ?172.16.2.101? ([222.92.8.142]) by mx.google.com with ESMTPS id 23sm1733307pzk.4.2009.11.08.20.16.34 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 08 Nov 2009 20:16:39 -0800 (PST) Subject: Re: [PATCH -v6 08/13] tracing: add IRQENTRY_EXIT section for MIPS From: Wu Zhangjin Reply-To: wuzhangjin@gmail.com To: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org, Frederic Weisbecker , rostedt@goodmis.org, Thomas Gleixner , Ralf Baechle , Richard Sandiford , Nicholas Mc Guire , David Daney , Adam Nemet , Patrik Kluba In-Reply-To: References: <747deea2f18d5ccffe842df95a9dd1c86251a958.1256569489.git.wuzhangjin@gmail.com> <3f47087b70a965fd679b17a59521671296457df1.1256569489.git.wuzhangjin@gmail.com> <07dc907ec62353b1aca99b2850d3b2e4b734189a.1256569489.git.wuzhangjin@gmail.com> <374da7039d2e1b97083edd8bcd7811356884d427.1256569489.git.wuzhangjin@gmail.com> <3c82af564d70be05b92687949ed134ce034bf8db.1256569489.git.wuzhangjin@gmail.com> Content-Type: text/plain; charset="UTF-8" Organization: DSLab, Lanzhou University, China Date: Mon, 09 Nov 2009 12:16:36 +0800 Message-ID: <1257740196.3451.15.camel@falcon.domain.org> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit Return-Path: X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0) X-Orcpt: rfc822;linux-mips@linux-mips.org Original-Recipient: rfc822;linux-mips@linux-mips.org X-archive-position: 24761 X-ecartis-version: Ecartis v1.0.0 Sender: linux-mips-bounce@linux-mips.org Errors-to: linux-mips-bounce@linux-mips.org X-original-sender: wuzhangjin@gmail.com Precedence: bulk X-list: linux-mips Hi Ralf, This one is also MIPS relative, also need your feedback ;) Thanks & Regards, Wu Zhangjin On Mon, 2009-10-26 at 23:13 +0800, Wu Zhangjin wrote: > This patch add a new section for MIPS to record the block of the hardirq > handling for function graph tracer(print_graph_irq) via adding the > __irq_entry annotation to the the entrypoints of the hardirqs(the block > with irq_enter()...irq_exit()). > > Thanks goes to Steven & Frederic Weisbecker for their feedbacks. > > Signed-off-by: Wu Zhangjin > --- > arch/mips/include/asm/irq.h | 29 ++--------------------------- > arch/mips/kernel/irq.c | 34 ++++++++++++++++++++++++++++++++++ > arch/mips/kernel/smp.c | 3 ++- > arch/mips/kernel/smtc.c | 21 ++++++++++++++------- > arch/mips/kernel/vmlinux.lds.S | 1 + > arch/mips/sgi-ip22/ip22-int.c | 3 ++- > arch/mips/sgi-ip22/ip22-time.c | 3 ++- > 7 files changed, 57 insertions(+), 37 deletions(-) > > diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h > index 09b08d0..6cdd8c2 100644 > --- a/arch/mips/include/asm/irq.h > +++ b/arch/mips/include/asm/irq.h > @@ -113,36 +113,11 @@ do { \ > > #endif > > -/* > - * do_IRQ handles all normal device IRQ's (the special > - * SMP cross-CPU interrupts have their own specific > - * handlers). > - * > - * Ideally there should be away to get this into kernel/irq/handle.c to > - * avoid the overhead of a call for just a tiny function ... > - */ > -#define do_IRQ(irq) \ > -do { \ > - irq_enter(); \ > - __DO_IRQ_SMTC_HOOK(irq); \ > - generic_handle_irq(irq); \ > - irq_exit(); \ > -} while (0) > +extern unsigned int do_IRQ(unsigned int irq); > > #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF > -/* > - * To avoid inefficient and in some cases pathological re-checking of > - * IRQ affinity, we have this variant that skips the affinity check. > - */ > - > > -#define do_IRQ_no_affinity(irq) \ > -do { \ > - irq_enter(); \ > - __NO_AFFINITY_IRQ_SMTC_HOOK(irq); \ > - generic_handle_irq(irq); \ > - irq_exit(); \ > -} while (0) > +extern unsigned int do_IRQ_no_affinity(unsigned int irq); > > #endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ > > diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c > index 7b845ba..c10ea8f 100644 > --- a/arch/mips/kernel/irq.c > +++ b/arch/mips/kernel/irq.c > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -150,3 +151,36 @@ void __init init_IRQ(void) > kgdb_early_setup = 1; > #endif > } > + > +/* > + * do_IRQ handles all normal device IRQ's (the special > + * SMP cross-CPU interrupts have their own specific > + * handlers). > + */ > +unsigned int __irq_entry do_IRQ(unsigned int irq) > +{ > + irq_enter(); > + __DO_IRQ_SMTC_HOOK(irq); > + generic_handle_irq(irq); > + irq_exit(); > + > + return 1; > +} > + > +#ifdef CONFIG_MIPS_MT_SMTC_IRQAFF > +/* > + * To avoid inefficient and in some cases pathological re-checking of > + * IRQ affinity, we have this variant that skips the affinity check. > + */ > + > +unsigned int __irq_entry do_IRQ_no_affinity(unsigned int irq) > +{ > + irq_enter(); > + __NO_AFFINITY_IRQ_SMTC_HOOK(irq); > + generic_handle_irq(irq); > + irq_exit(); > + > + return 1; > +} > + > +#endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ > diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c > index e72e684..6cdca19 100644 > --- a/arch/mips/kernel/smp.c > +++ b/arch/mips/kernel/smp.c > @@ -32,6 +32,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -130,7 +131,7 @@ asmlinkage __cpuinit void start_secondary(void) > /* > * Call into both interrupt handlers, as we share the IPI for them > */ > -void smp_call_function_interrupt(void) > +void __irq_entry smp_call_function_interrupt(void) > { > irq_enter(); > generic_smp_call_function_single_interrupt(); > diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c > index 24630fd..75034a8 100644 > --- a/arch/mips/kernel/smtc.c > +++ b/arch/mips/kernel/smtc.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -939,23 +940,29 @@ static void ipi_call_interrupt(void) > > DECLARE_PER_CPU(struct clock_event_device, mips_clockevent_device); > > -void ipi_decode(struct smtc_ipi *pipi) > +static void __irq_entry smtc_clock_tick_interrupt(void) > { > unsigned int cpu = smp_processor_id(); > struct clock_event_device *cd; > + int irq = MIPS_CPU_IRQ_BASE + 1; > + > + irq_enter(); > + kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); > + cd = &per_cpu(mips_clockevent_device, cpu); > + cd->event_handler(cd); > + irq_exit(); > +} > + > +void ipi_decode(struct smtc_ipi *pipi) > +{ > void *arg_copy = pipi->arg; > int type_copy = pipi->type; > - int irq = MIPS_CPU_IRQ_BASE + 1; > > smtc_ipi_nq(&freeIPIq, pipi); > > switch (type_copy) { > case SMTC_CLOCK_TICK: > - irq_enter(); > - kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); > - cd = &per_cpu(mips_clockevent_device, cpu); > - cd->event_handler(cd); > - irq_exit(); > + smtc_clock_tick_interrupt(); > break; > > case LINUX_SMP_IPI: > diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S > index 162b299..f25df73 100644 > --- a/arch/mips/kernel/vmlinux.lds.S > +++ b/arch/mips/kernel/vmlinux.lds.S > @@ -46,6 +46,7 @@ SECTIONS > SCHED_TEXT > LOCK_TEXT > KPROBES_TEXT > + IRQENTRY_TEXT > *(.text.*) > *(.fixup) > *(.gnu.warning) > diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c > index 0ecd5fe..383f11d 100644 > --- a/arch/mips/sgi-ip22/ip22-int.c > +++ b/arch/mips/sgi-ip22/ip22-int.c > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -150,7 +151,7 @@ static void indy_local1_irqdispatch(void) > > extern void ip22_be_interrupt(int irq); > > -static void indy_buserror_irq(void) > +static void __irq_entry indy_buserror_irq(void) > { > int irq = SGI_BUSERR_IRQ; > > diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c > index c8f7d23..603fc91 100644 > --- a/arch/mips/sgi-ip22/ip22-time.c > +++ b/arch/mips/sgi-ip22/ip22-time.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -115,7 +116,7 @@ __init void plat_time_init(void) > } > > /* Generic SGI handler for (spurious) 8254 interrupts */ > -void indy_8254timer_irq(void) > +void __irq_entry indy_8254timer_irq(void) > { > int irq = SGI_8254_0_IRQ; > ULONG cnt;