kcov: properly check if we are in an interrupt
in_interrupt() returns a nonzero value when we are either in an interrupt or have bh disabled via local_bh_disable(). Since we are interested in only ignoring coverage from actual interrupts, do a proper check instead of just calling in_interrupt(). As a result of this change, kcov will start to collect coverage from within local_bh_disable()/local_bh_enable() sections. Link: http://lkml.kernel.org/r/1476115803-20712-1-git-send-email-andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Acked-by: Dmitry Vyukov <dvyukov@google.com> Cc: Nicolai Stange <nicstange@gmail.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Kees Cook <keescook@chromium.org> Cc: James Morse <james.morse@arm.com> Cc: Vegard Nossum <vegard.nossum@oracle.com> Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
86d9f48534
commit
b274c0bb39
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue