On Mon, 2009-10-26 at 01:27 +0100, Frederic Weisbecker wrote: > 2009/10/25 Wu Zhangjin <wuzhangjin@xxxxxxxxx>: > > -static inline u64 mips_timecounter_read(void) > > +static inline u64 notrace mips_timecounter_read(void) > > > You don't need to set notrace functions, unless their addresses > are referenced somewhere, which unfortunately might happen > for some functions but this is rare. > Okay, Will remove it. > > > { > > #ifdef CONFIG_CSRC_R4K > > return r4k_timecounter_read(); > > diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c > > index 4e7705f..0690bea 100644 > > --- a/arch/mips/kernel/csrc-r4k.c > > +++ b/arch/mips/kernel/csrc-r4k.c > > @@ -42,7 +42,7 @@ static struct timecounter r4k_tc = { > > .cc = NULL, > > }; > > > > -static cycle_t r4k_cc_read(const struct cyclecounter *cc) > > +static cycle_t notrace r4k_cc_read(const struct cyclecounter *cc) > > { > > return read_c0_count(); > > } > > @@ -66,7 +66,7 @@ int __init init_r4k_timecounter(void) > > return 0; > > } > > > > -u64 r4k_timecounter_read(void) > > +u64 notrace r4k_timecounter_read(void) > > { > > u64 clock; > > > > diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h > > index 83d2fbd..2a02992 100644 > > --- a/include/linux/clocksource.h > > +++ b/include/linux/clocksource.h > > @@ -73,7 +73,7 @@ struct timecounter { > > * XXX - This could use some mult_lxl_ll() asm optimization. Same code > > * as in cyc2ns, but with unsigned result. > > */ > > -static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, > > +static inline u64 notrace cyclecounter_cyc2ns(const struct cyclecounter > > ditto here. > Will remove it too. > > *cc, > > cycle_t cycles) > > { > > u64 ret = (u64)cycles; > > diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c > > index 5e18c6a..9ce9d02 100644 > > --- a/kernel/time/clocksource.c > > +++ b/kernel/time/clocksource.c > > @@ -52,7 +52,7 @@ EXPORT_SYMBOL(timecounter_init); > > * The first call to this function for a new time counter initializes > > * the time tracking and returns an undefined result. > > */ > > -static u64 timecounter_read_delta(struct timecounter *tc) > > +static u64 notrace timecounter_read_delta(struct timecounter *tc) > > { > > cycle_t cycle_now, cycle_delta; > > u64 ns_offset; > > @@ -72,7 +72,7 @@ static u64 timecounter_read_delta(struct timecounter > > > Hmm yeah this is not very nice to do that in core functions because > of a specific arch problem. > At least you have __notrace_funcgraph, this is a notrace > that only applies if CONFIG_FUNCTION_GRAPH_TRACER > so that it's still traceable by the function tracer in this case. > > But I would rather see a __mips_notrace on these two core functions. What about this: __arch_notrace? If the arch need this, define it, otherwise, ignore it! if only graph tracer need it, define it in "#ifdef CONFIG_FUNCTION_GRAPH_TRACER ... #endif". diff --git a/arch/mips/include/asm/ftrace.h b/arch/mips/include/asm/ftrace.h index d5771e8..eeacd51 100644 --- a/arch/mips/include/asm/ftrace.h +++ b/arch/mips/include/asm/ftrace.h @@ -31,6 +31,11 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) struct dyn_arch_ftrace { }; #endif /* CONFIG_DYNAMIC_FTRACE */ + +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +#define __arch_notrace +#endif + #endif /* __ASSEMBLY__ */ #endif /* CONFIG_FUNCTION_TRACER */ #endif /* _ASM_MIPS_FTRACE_H */ [...] diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 0b4f97d..959c8b3 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -511,4 +511,12 @@ static inline void trace_hw_branch_oops(void) {} #endif /* CONFIG_HW_BRANCH_TRACER */ +/* arch specific notrace */ +#ifndef __arch_notrace +#define __arch_notrace +#else +#undef __arch_notrace +#define __arch_notrace notrace +#endif + #endif /* _LINUX_FTRACE_H */ [...] diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 9ce9d02..91acdf7 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -30,6 +30,7 @@ #include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */ #include <linux/tick.h> #include <linux/kthread.h> +#include <linux/ftrace.h> void timecounter_init(struct timecounter *tc, const struct cyclecounter *cc, @@ -52,7 +53,7 @@ EXPORT_SYMBOL(timecounter_init); * The first call to this function for a new time counter initializes * the time tracking and returns an undefined result. */ -static u64 notrace timecounter_read_delta(struct timecounter *tc) +static u64 __arch_notrace timecounter_read_delta(struct timecounter *tc) { cycle_t cycle_now, cycle_delta; u64 ns_offset; @@ -72,7 +73,7 @@ static u64 notrace timecounter_read_delta(struct timecounter *tc) return ns_offset; } -u64 notrace timecounter_read(struct timecounter *tc) +u64 __arch_notrace timecounter_read(struct timecounter *tc) { u64 nsec; Regards, Wu Zhangjin