diff --git a/kernel/trace/trace_preemptirq.c b/kernel/trace/trace_preemptirq.c index e76b78bf258e..13e2c6e99465 100644 --- a/kernel/trace/trace_preemptirq.c +++ b/kernel/trace/trace_preemptirq.c @@ -19,7 +19,7 @@ static DEFINE_PER_CPU(int, tracing_irq_cpu); void trace_hardirqs_on(void) { - if (!this_cpu_read(tracing_irq_cpu)) + if (lockdep_recursing(current) || !this_cpu_read(tracing_irq_cpu)) return; trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); @@ -29,7 +29,7 @@ EXPORT_SYMBOL(trace_hardirqs_on); void trace_hardirqs_off(void) { - if (this_cpu_read(tracing_irq_cpu)) + if (lockdep_recursing(current) || this_cpu_read(tracing_irq_cpu)) return; this_cpu_write(tracing_irq_cpu, 1); @@ -39,7 +39,7 @@ EXPORT_SYMBOL(trace_hardirqs_off); __visible void trace_hardirqs_on_caller(unsigned long caller_addr) { - if (!this_cpu_read(tracing_irq_cpu)) + if (lockdep_recursing(current) || !this_cpu_read(tracing_irq_cpu)) return; trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr); @@ -49,7 +49,7 @@ EXPORT_SYMBOL(trace_hardirqs_on_caller); __visible void trace_hardirqs_off_caller(unsigned long caller_addr) { - if (this_cpu_read(tracing_irq_cpu)) + if (lockdep_recursing(current) || this_cpu_read(tracing_irq_cpu)) return; this_cpu_write(tracing_irq_cpu, 1);