The following commit has been merged into the perf/urgent branch of tip: Commit-ID: 09da9c81253dd8e43e0d2d7cea02de6f9f19499d Gitweb: https://git.kernel.org/tip/09da9c81253dd8e43e0d2d7cea02de6f9f19499d Author: Peter Zijlstra <peterz@xxxxxxxxxxxxx> AuthorDate: Fri, 30 Oct 2020 13:43:16 +01:00 Committer: Peter Zijlstra <peterz@xxxxxxxxxxxxx> CommitterDate: Mon, 09 Nov 2020 18:12:34 +01:00 perf: Optimize get_recursion_context() "Look ma, no branches!" Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> Acked-by: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> Link: https://lkml.kernel.org/r/20201030151955.187580298@xxxxxxxxxxxxx --- kernel/events/internal.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/kernel/events/internal.h b/kernel/events/internal.h index 402054e..228801e 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_serving_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;
![]() |