• Andrey Konovalov's avatar
    kcov: properly check for softirq context · 7d4df2da
    Andrey Konovalov authored
    When collecting coverage from softirqs, KCOV uses in_serving_softirq() to
    check whether the code is running in the softirq context.  Unfortunately,
    in_serving_softirq() is > 0 even when the code is running in the hardirq
    or NMI context for hardirqs and NMIs that happened during a softirq.
    
    As a result, if a softirq handler contains a remote coverage collection
    section and a hardirq with another remote coverage collection section
    happens during handling the softirq, KCOV incorrectly detects a nested
    softirq coverate collection section and prints a WARNING, as reported by
    syzbot.
    
    This issue was exposed by commit a7f3813e ("usb: gadget: dummy_hcd:
    Switch to hrtimer transfer scheduler"), which switched dummy_hcd to using
    hrtimer and made the timer's callback be executed in the hardirq context.
    
    Change the related checks in KCOV to account for this behavior of
    in_serving_softirq() and make KCOV ignore remote coverage collection
    sections in the hardirq and NMI contexts.
    
    This prevents the WARNING printed by syzbot but does not fix the inability
    of KCOV to collect coverage from the __usb_hcd_giveback_urb when dummy_hcd
    is in use (caused by a7f3813e); a separate patch is required for that.
    
    Link: https://lkml.kernel.org/r/20240729022158.92059-1-andrey.konovalov@linux.dev
    Fixes: 5ff3b30a ("kcov: collect coverage from interrupts")
    Signed-off-by: default avatarAndrey Konovalov <andreyknvl@gmail.com>
    Reported-by: syzbot+2388cdaeb6b10f0c13ac@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=2388cdaeb6b10f0c13acAcked-by: default avatarMarco Elver <elver@google.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Aleksandr Nogikh <nogikh@google.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Marcello Sylvester Bauer <sylv@sylv.io>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    7d4df2da
kcov.c 29.5 KB