Create a specific function to get the current task context. Signed-off-by: Daniel Bristot de Oliveira <bris...@redhat.com> Cc: Steven Rostedt <rost...@goodmis.org> Cc: Arnaldo Carvalho de Melo <a...@kernel.org> Cc: Ingo Molnar <mi...@redhat.com> Cc: Andy Lutomirski <l...@kernel.org> Cc: Thomas Gleixner <t...@linutronix.de> Cc: Borislav Petkov <b...@alien8.de> Cc: Peter Zijlstra <pet...@infradead.org> Cc: "H. Peter Anvin" <h...@zytor.com> Cc: "Joel Fernandes (Google)" <j...@joelfernandes.org> Cc: Jiri Olsa <jo...@redhat.com> Cc: Namhyung Kim <namhy...@kernel.org> Cc: Alexander Shishkin <alexander.shish...@linux.intel.com> Cc: Tommaso Cucinotta <tommaso.cucino...@santannapisa.it> Cc: Romulo Silva de Oliveira <romulo.deolive...@ufsc.br> Cc: Clark Williams <willi...@redhat.com> Cc: linux-kernel@vger.kernel.org Cc: x...@kernel.org --- kernel/events/internal.h | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-)
diff --git a/kernel/events/internal.h b/kernel/events/internal.h index 79c47076700a..241a2318bfdc 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h @@ -202,18 +202,37 @@ arch_perf_out_copy_user(void *dst, const void *src, unsigned long n) DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user) -static inline int get_recursion_context(int *recursion) +/* + * Used for which event context the event is in. + * NMI = 0 + * IRQ = 1 + * SOFTIRQ = 2 + * NORMAL = 3 + * + * See trace_recursive_lock() comment for more details. + */ +enum { + TRACE_CTX_NMI, + TRACE_CTX_IRQ, + TRACE_CTX_SOFTIRQ, + TRACE_CTX_NORMAL, + TRACE_CTX_MAX +}; + +static __always_inline int trace_get_context_bit(void) { - int rctx; + unsigned long pc = preempt_count(); - if (unlikely(in_nmi())) - rctx = 3; - else if (in_irq()) - rctx = 2; - else if (in_softirq()) - rctx = 1; + if (pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)) + return pc & NMI_MASK ? TRACE_CTX_NMI : + pc & HARDIRQ_MASK ? TRACE_CTX_IRQ : TRACE_CTX_SOFTIRQ; else - rctx = 0; + return TRACE_CTX_NORMAL; +} + +static inline int get_recursion_context(int *recursion) +{ + int rctx = trace_get_context_bit(); if (recursion[rctx]) return -1; -- 2.20.1