lkml.org 
[lkml]   [2016]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 170/346] ARC: Call trace_hardirqs_on() before enabling irqs
    3.16.39-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Daniel Mentz <danielmentz@google.com>

    commit 18b43e89d295cc65151c505c643c98fb2c320e59 upstream.

    trace_hardirqs_on_caller() in lockdep.c expects to be called before, not
    after interrupts are actually enabled.

    The following comment in kernel/locking/lockdep.c substantiates this
    claim:

    "
    /*
    * We're enabling irqs and according to our state above irqs weren't
    * already enabled, yet we find the hardware thinks they are in fact
    * enabled.. someone messed up their IRQ state tracing.
    */
    "

    An example can be found in include/linux/irqflags.h:

    do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)

    Without this change, we hit the following DEBUG_LOCKS_WARN_ON.

    [ 7.760000] ------------[ cut here ]------------
    [ 7.760000] WARNING: CPU: 0 PID: 1 at kernel/locking/lockdep.c:2711 resume_user_mode_begin+0x48/0xf0
    [ 7.770000] DEBUG_LOCKS_WARN_ON(!irqs_disabled())
    [ 7.780000] Modules linked in:
    [ 7.780000] CPU: 0 PID: 1 Comm: init Not tainted 4.7.0-00003-gc668bb9-dirty #366
    [ 7.790000]
    [ 7.790000] Stack Trace:
    [ 7.790000] arc_unwind_core.constprop.1+0xa4/0x118
    [ 7.800000] warn_slowpath_fmt+0x72/0x158
    [ 7.800000] resume_user_mode_begin+0x48/0xf0
    [ 7.810000] ---[ end trace 6f6a7a8fae20d2f0 ]---

    Signed-off-by: Daniel Mentz <danielmentz@google.com>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    [bwh: Backported to 3.16: adjust filename]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/arc/include/asm/irqflags.h | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/arch/arc/include/asm/irqflags.h
    +++ b/arch/arc/include/asm/irqflags.h
    @@ -179,10 +179,10 @@ static inline void arch_unmask_irq(unsig
    .endm

    .macro IRQ_ENABLE scratch
    + TRACE_ASM_IRQ_ENABLE
    lr \scratch, [status32]
    or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
    flag \scratch
    - TRACE_ASM_IRQ_ENABLE
    .endm

    #endif /* __ASSEMBLY__ */
    \
     
     \ /
      Last update: 2016-11-14 03:31    [W:4.033 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site