Skip to content

Commit 09da9c8

Browse files
author
Peter Zijlstra
committed
perf: Optimize get_recursion_context()
"Look ma, no branches!" Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Link: https://lkml.kernel.org/r/20201030151955.187580298@infradead.org
1 parent ce0f17f commit 09da9c8

1 file changed

Lines changed: 6 additions & 10 deletions

File tree

kernel/events/internal.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,16 +205,12 @@ DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user)
205205

206206
static inline int get_recursion_context(int *recursion)
207207
{
208-
int rctx;
209-
210-
if (unlikely(in_nmi()))
211-
rctx = 3;
212-
else if (in_irq())
213-
rctx = 2;
214-
else if (in_serving_softirq())
215-
rctx = 1;
216-
else
217-
rctx = 0;
208+
unsigned int pc = preempt_count();
209+
unsigned char rctx = 0;
210+
211+
rctx += !!(pc & (NMI_MASK));
212+
rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK));
213+
rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET));
218214

219215
if (recursion[rctx])
220216
return -1;

0 commit comments

Comments
 (0)