BUG: dead loop in PowerPC hcall tracepoint (Was: [LTP] [PATCH v2] Add ftrace-stress-test to LTP)
Steven Rostedt
rostedt at goodmis.org
Tue Oct 19 01:25:03 EST 2010
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.
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
More information about the Linuxppc-dev
mailing list