diff options
Diffstat (limited to 'kernel/trace/trace_preemptirq.c')
| -rw-r--r-- | kernel/trace/trace_preemptirq.c | 25 | 
1 files changed, 19 insertions, 6 deletions
| diff --git a/kernel/trace/trace_preemptirq.c b/kernel/trace/trace_preemptirq.c index fa656b25f427..71f553cceb3c 100644 --- a/kernel/trace/trace_preemptirq.c +++ b/kernel/trace/trace_preemptirq.c @@ -9,6 +9,7 @@  #include <linux/uaccess.h>  #include <linux/module.h>  #include <linux/ftrace.h> +#include "trace.h"  #define CREATE_TRACE_POINTS  #include <trace/events/preemptirq.h> @@ -20,7 +21,9 @@ static DEFINE_PER_CPU(int, tracing_irq_cpu);  void trace_hardirqs_on(void)  {  	if (this_cpu_read(tracing_irq_cpu)) { -		trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); +		if (!in_nmi()) +			trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); +		tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1);  		this_cpu_write(tracing_irq_cpu, 0);  	} @@ -32,7 +35,9 @@ void trace_hardirqs_off(void)  {  	if (!this_cpu_read(tracing_irq_cpu)) {  		this_cpu_write(tracing_irq_cpu, 1); -		trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); +		tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); +		if (!in_nmi()) +			trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);  	}  	lockdep_hardirqs_off(CALLER_ADDR0); @@ -42,7 +47,9 @@ EXPORT_SYMBOL(trace_hardirqs_off);  __visible void trace_hardirqs_on_caller(unsigned long caller_addr)  {  	if (this_cpu_read(tracing_irq_cpu)) { -		trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr); +		if (!in_nmi()) +			trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr); +		tracer_hardirqs_on(CALLER_ADDR0, caller_addr);  		this_cpu_write(tracing_irq_cpu, 0);  	} @@ -54,7 +61,9 @@ __visible void trace_hardirqs_off_caller(unsigned long caller_addr)  {  	if (!this_cpu_read(tracing_irq_cpu)) {  		this_cpu_write(tracing_irq_cpu, 1); -		trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr); +		tracer_hardirqs_off(CALLER_ADDR0, caller_addr); +		if (!in_nmi()) +			trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);  	}  	lockdep_hardirqs_off(CALLER_ADDR0); @@ -66,11 +75,15 @@ EXPORT_SYMBOL(trace_hardirqs_off_caller);  void trace_preempt_on(unsigned long a0, unsigned long a1)  { -	trace_preempt_enable_rcuidle(a0, a1); +	if (!in_nmi()) +		trace_preempt_enable_rcuidle(a0, a1); +	tracer_preempt_on(a0, a1);  }  void trace_preempt_off(unsigned long a0, unsigned long a1)  { -	trace_preempt_disable_rcuidle(a0, a1); +	if (!in_nmi()) +		trace_preempt_disable_rcuidle(a0, a1); +	tracer_preempt_off(a0, a1);  }  #endif | 
