• Julien Thierry's avatar
    arm64: Fix interrupt tracing in the presence of NMIs · 17ce302f
    Julien Thierry authored
    In the presence of any form of instrumentation, nmi_enter() should be
    done before calling any traceable code and any instrumentation code.
    
    Currently, nmi_enter() is done in handle_domain_nmi(), which is much
    too late as instrumentation code might get called before. Move the
    nmi_enter/exit() calls to the arch IRQ vector handler.
    
    On arm64, it is not possible to know if the IRQ vector handler was
    called because of an NMI before acknowledging the interrupt. However, It
    is possible to know whether normal interrupts could be taken in the
    interrupted context (i.e. if taking an NMI in that context could
    introduce a potential race condition).
    
    When interrupting a context with IRQs disabled, call nmi_enter() as soon
    as possible. In contexts with IRQs enabled, defer this to the interrupt
    controller, which is in a better position to know if an interrupt taken
    is an NMI.
    
    Fixes: bc3c03cc ("arm64: Enable the support of pseudo-NMIs")
    Cc: <stable@vger.kernel.org> # 5.1.x-
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Jason Cooper <jason@lakedaemon.net>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarJulien Thierry <julien.thierry@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    17ce302f
irq-gic-v3.c 45.4 KB