xtensa: move trace_hardirqs_off call back to entry.S
authorMax Filippov <jcmvbkbc@gmail.com>
Mon, 4 Apr 2022 04:29:46 +0000 (21:29 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Mon, 2 May 2022 02:51:21 +0000 (19:51 -0700)
Context tracking call must be done after hardirq tracking call,
otherwise lockdep_assert_irqs_disabled called from rcu_eqs_exit gives
a warning. To avoid context tracking logic duplication for IRQ/exception
entry paths move trace_hardirqs_off call back to common entry code.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/kernel/entry.S
arch/xtensa/kernel/traps.c

index 3c0b1aac7aba0e61fea57a1c649cf2d27114fa15..c85597a734aadcc6624187bea3348c7ef8a8a7b0 100644 (file)
@@ -424,7 +424,6 @@ KABI_W      or      a3, a3, a0
        moveqz  a3, a0, a2              # a3 = LOCKLEVEL iff interrupt
 KABI_W movi    a2, PS_WOE_MASK
 KABI_W or      a3, a3, a2
-       rsr     a2, exccause
 #endif
 
        /* restore return address (or 0 if return to userspace) */
@@ -451,19 +450,27 @@ KABI_W    or      a3, a3, a2
 
        save_xtregs_opt a1 a3 a4 a5 a6 a7 PT_XTREGS_OPT
        
+#ifdef CONFIG_TRACE_IRQFLAGS
+       rsr             abi_tmp0, ps
+       extui           abi_tmp0, abi_tmp0, PS_INTLEVEL_SHIFT, PS_INTLEVEL_WIDTH
+       beqz            abi_tmp0, 1f
+       abi_call        trace_hardirqs_off
+1:
+#endif
+
        /* Go to second-level dispatcher. Set up parameters to pass to the
         * exception handler and call the exception handler.
         */
 
-       rsr     a4, excsave1
-       addx4   a4, a2, a4
-       l32i    a4, a4, EXC_TABLE_DEFAULT               # load handler
-       mov     abi_arg1, a2                    # pass EXCCAUSE
+       l32i    abi_arg1, a1, PT_EXCCAUSE       # pass EXCCAUSE
+       rsr     abi_tmp0, excsave1
+       addx4   abi_tmp0, abi_arg1, abi_tmp0
+       l32i    abi_tmp0, abi_tmp0, EXC_TABLE_DEFAULT   # load handler
        mov     abi_arg0, a1                    # pass stack frame
 
        /* Call the second-level handler */
 
-       abi_callx       a4
+       abi_callx       abi_tmp0
 
        /* Jump here for exception exit */
        .global common_exception_return
index 82ced7b25b77cc23f11b7a468574bc81f64f8e79..515719c7e7502d49ec17e42c663fdb77a4a091ea 100644 (file)
@@ -242,12 +242,8 @@ DEFINE_PER_CPU(unsigned long, nmi_count);
 
 void do_nmi(struct pt_regs *regs)
 {
-       struct pt_regs *old_regs;
+       struct pt_regs *old_regs = set_irq_regs(regs);
 
-       if ((regs->ps & PS_INTLEVEL_MASK) < LOCKLEVEL)
-               trace_hardirqs_off();
-
-       old_regs = set_irq_regs(regs);
        nmi_enter();
        ++*this_cpu_ptr(&nmi_count);
        check_valid_nmi();
@@ -269,12 +265,9 @@ void do_interrupt(struct pt_regs *regs)
                XCHAL_INTLEVEL6_MASK,
                XCHAL_INTLEVEL7_MASK,
        };
-       struct pt_regs *old_regs;
+       struct pt_regs *old_regs = set_irq_regs(regs);
        unsigned unhandled = ~0u;
 
-       trace_hardirqs_off();
-
-       old_regs = set_irq_regs(regs);
        irq_enter();
 
        for (;;) {