projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
ce0f17f
)
perf: Optimize get_recursion_context()
author
Peter Zijlstra
<peterz@infradead.org>
Fri, 30 Oct 2020 12:43:16 +0000
(13:43 +0100)
committer
Peter Zijlstra
<peterz@infradead.org>
Mon, 9 Nov 2020 17:12:34 +0000
(18:12 +0100)
"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
kernel/events/internal.h
patch
|
blob
|
history
diff --git
a/kernel/events/internal.h
b/kernel/events/internal.h
index 402054e755f27f1e8bdacb6ce39a581ad3dbad65..228801e2078869e5d0fbe4618deca7b1dc88d9a8 100644
(file)
--- 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;