On Fri, 2013-08-02 at 14:57 -0400, Steven Rostedt wrote:
> The tracer started within the NMI, but out of sheer (bad) luck. That's
> because the NMI code has no logic to handle tracing interrupts on or
> off, due to the problems they cause. We may at most be able to just
> ignore all NMIs by adding a 'in_nmi()' check. I can send you a patch if
> you want.
It was trivial enough to make. Maybe this will fix things for you.
-- Steve
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
index 2aefbee..500b2e0 100644
--- a/kernel/trace/trace_irqsoff.c
+++ b/kernel/trace/trace_irqsoff.c
@@ -453,13 +453,13 @@ EXPORT_SYMBOL_GPL(stop_critical_timings);
#ifdef CONFIG_PROVE_LOCKING
void time_hardirqs_on(unsigned long a0, unsigned long a1)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
stop_critical_timing(a0, a1);
}
void time_hardirqs_off(unsigned long a0, unsigned long a1)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
start_critical_timing(a0, a1);
}
@@ -486,28 +486,28 @@ inline void print_irqtrace_events(struct task_struct
*curr)
*/
void trace_hardirqs_on(void)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1);
}
EXPORT_SYMBOL(trace_hardirqs_on);
void trace_hardirqs_off(void)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
start_critical_timing(CALLER_ADDR0, CALLER_ADDR1);
}
EXPORT_SYMBOL(trace_hardirqs_off);
void trace_hardirqs_on_caller(unsigned long caller_addr)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
stop_critical_timing(CALLER_ADDR0, caller_addr);
}
EXPORT_SYMBOL(trace_hardirqs_on_caller);
void trace_hardirqs_off_caller(unsigned long caller_addr)
{
- if (!preempt_trace() && irq_trace())
+ if (!in_nmi() && !preempt_trace() && irq_trace())
start_critical_timing(CALLER_ADDR0, caller_addr);
}
EXPORT_SYMBOL(trace_hardirqs_off_caller);
@@ -518,13 +518,13 @@ EXPORT_SYMBOL(trace_hardirqs_off_caller);
#ifdef CONFIG_PREEMPT_TRACER
void trace_preempt_on(unsigned long a0, unsigned long a1)
{
- if (preempt_trace() && !irq_trace())
+ if (!in_nmi() && preempt_trace() && !irq_trace())
stop_critical_timing(a0, a1);
}
void trace_preempt_off(unsigned long a0, unsigned long a1)
{
- if (preempt_trace() && !irq_trace())
+ if (!in_nmi() && preempt_trace() && !irq_trace())
start_critical_timing(a0, a1);
}
#endif /* CONFIG_PREEMPT_TRACER */
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html