|
@@ -53,8 +53,15 @@ void notrace __sanitizer_cov_trace_pc(void)
|
|
|
/*
|
|
|
* We are interested in code coverage as a function of a syscall inputs,
|
|
|
* so we ignore code executed in interrupts.
|
|
|
+ * The checks for whether we are in an interrupt are open-coded, because
|
|
|
+ * 1. We can't use in_interrupt() here, since it also returns true
|
|
|
+ * when we are inside local_bh_disable() section.
|
|
|
+ * 2. We don't want to use (in_irq() | in_serving_softirq() | in_nmi()),
|
|
|
+ * since that leads to slower generated code (three separate tests,
|
|
|
+ * one for each of the flags).
|
|
|
*/
|
|
|
- if (!t || in_interrupt())
|
|
|
+ if (!t || (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET
|
|
|
+ | NMI_MASK)))
|
|
|
return;
|
|
|
mode = READ_ONCE(t->kcov_mode);
|
|
|
if (mode == KCOV_MODE_TRACE) {
|