Steven Rostedt wrote: > On Mon, 2010-10-18 at 11:19 +0800, Li Zefan wrote: > >> This is a dead loop: >> >> trace_hcall_entry() -> trace_clock_global() -> trace_hcall_entry() .. >> >> And this is a PPC specific bug. Hope some ppc guys will fix it? >> Or we kill trace_clock_global() if no one actually uses it.. > > trace_clock_global() is used by many. I use it (and recommend using it) > on boxes where the TSC is horribly out of sync, and the trace needs > synchronization between CPUs. > > The trace_hcall_entry and exit has wrappers already. Just add recursion > protection there. >
Right, I thought of this. But as I have no machine to test, I'll leave this to others. > Perhaps something like this: > > (Not compiled nor ran) > > +static DEFINE_PER_CPU(hcall_trace_disable); > + > void hcall_tracepoint_regfunc(void) > { > hcall_tracepoint_refcount++; > } > > void hcall_tracepoint_unregfunc(void) > { > hcall_tracepoint_refcount--; > } > > +int __trace_disable_check(void) > +{ > + if (!hcall_tracepoint_refcount) > + return 1; > + > + if (get_cpu_var(hcall_trace_disable)) { > + put_cpu_var(hcall_trace_disable); > + return 1; > + } > + > + __get_cpu_var(hcall_trace_disable)++; > + > + return 0; > +} > + > +void __trace_disable_put(void) > +{ > + __get_cpu_var(hcall_trace_disable)--; > + put_cpu_var(hcall_trace_disable); > +} > + > void __trace_hcall_entry(unsigned long opcode, unsigned long *args) > { > + int trace_disable; > + > + if (__trace_disable_check()) > + return; > + > trace_hcall_entry(opcode, args); > + __trace_disable_put(); > } > > void __trace_hcall_exit(long opcode, unsigned long retval, > unsigned long *retbuf) > { > + if (__trace_disable_check()) > + return; > + > trace_hcall_exit(opcode, retval, retbuf); > + __trace_disable_put(); > } > > -- Steve > > > > _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev