diff options
Diffstat (limited to 'kernel/events/internal.h')
| -rw-r--r-- | kernel/events/internal.h | 16 | 
1 files changed, 6 insertions, 10 deletions
| diff --git a/kernel/events/internal.h b/kernel/events/internal.h index fcbf5616a441..228801e20788 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h @@ -205,16 +205,12 @@ DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user)  static inline int get_recursion_context(int *recursion)  { -	int rctx; - -	if (unlikely(in_nmi())) -		rctx = 3; -	else if (in_irq()) -		rctx = 2; -	else if (in_softirq()) -		rctx = 1; -	else -		rctx = 0; +	unsigned int pc = preempt_count(); +	unsigned char rctx = 0; + +	rctx += !!(pc & (NMI_MASK)); +	rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK)); +	rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET));  	if (recursion[rctx])  		return -1; | 
