Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+5 -9
+5 -9
kernel/events/internal.h
··· 205 205 206 206 static inline int get_recursion_context(int *recursion) 207 207 { 208 - int rctx; 208 + unsigned int pc = preempt_count(); 209 + unsigned char rctx = 0; 209 210 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; 211 + rctx += !!(pc & (NMI_MASK)); 212 + rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK)); 213 + rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)); 218 214 219 215 if (recursion[rctx]) 220 216 return -1;