From: Philippe Gerum <[email protected]>

Make sure that inband is marked stalled when entering from user mode,
taking an exception.

This affects x86 which is currently the only arch using generic
irqentry_enter_from_user_mode on exceptions. It fixes this lockdep
warning:

DEBUG_LOCKS_WARN_ON(!lockdep_stage_disabled())
WARNING: CPU: 2 PID: 1477 at ../kernel/locking/lockdep.c:4129 
lockdep_hardirqs_on_prepare+0x160/0x1a0

Signed-off-by: Philippe Gerum <[email protected]>
Tested-by: Jan Kiszka <[email protected]>
---

Works as it should here. If the wording is fine, please add.

 kernel/entry/common.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/entry/common.c b/kernel/entry/common.c
index 995123075375..51af58e61cb8 100644
--- a/kernel/entry/common.c
+++ b/kernel/entry/common.c
@@ -343,6 +343,8 @@ __visible noinstr void syscall_exit_to_user_mode(struct 
pt_regs *regs)
 
 noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs)
 {
+       WARN_ON_ONCE(irq_pipeline_debug() && irqs_disabled());
+       stall_inband_nocheck();
        enter_from_user_mode(regs);
 }
 
@@ -373,8 +375,6 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs 
*regs)
 
        if (user_mode(regs)) {
 #ifdef CONFIG_IRQ_PIPELINE
-               WARN_ON_ONCE(irq_pipeline_debug() && irqs_disabled());
-               stall_inband_nocheck();
                ret.stage_info = IRQENTRY_INBAND_UNSTALLED;
 #endif
                irqentry_enter_from_user_mode(regs);
-- 
2.26.2

Reply via email to