x86/idtentry: Switch to conditional RCU handling
authorThomas Gleixner <tglx@linutronix.de>
Thu, 21 May 2020 20:05:19 +0000 (22:05 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Jun 2020 13:15:05 +0000 (15:15 +0200)
Switch all idtentry_enter/exit() users over to the new conditional RCU
handling scheme and make the user mode entries in #DB, #INT3 and #MCE use
the user mode idtentry functions.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Andy Lutomirski <luto@kernel.org>
Link: https://lore.kernel.org/r/20200521202117.382387286@linutronix.de
arch/x86/include/asm/idtentry.h
arch/x86/kernel/cpu/mce/core.c
arch/x86/kernel/traps.c

index b3aca728f2fbd4038fa1e32b37731fdd134bee12..0f974e52e13b2ea972dc15c65706b38ac3a8650c 100644 (file)
@@ -61,11 +61,12 @@ static __always_inline void __##func(struct pt_regs *regs);         \
                                                                        \
 __visible noinstr void func(struct pt_regs *regs)                      \
 {                                                                      \
-       idtentry_enter(regs);                                           \
+       bool rcu_exit = idtentry_enter_cond_rcu(regs);                  \
+                                                                       \
        instrumentation_begin();                                        \
        __##func (regs);                                                \
        instrumentation_end();                                          \
-       idtentry_exit(regs);                                            \
+       idtentry_exit_cond_rcu(regs, rcu_exit);                         \
 }                                                                      \
                                                                        \
 static __always_inline void __##func(struct pt_regs *regs)
@@ -107,11 +108,12 @@ static __always_inline void __##func(struct pt_regs *regs,                \
 __visible noinstr void func(struct pt_regs *regs,                      \
                            unsigned long error_code)                   \
 {                                                                      \
-       idtentry_enter(regs);                                           \
+       bool rcu_exit = idtentry_enter_cond_rcu(regs);                  \
+                                                                       \
        instrumentation_begin();                                        \
        __##func (regs, error_code);                                    \
        instrumentation_end();                                          \
-       idtentry_exit(regs);                                            \
+       idtentry_exit_cond_rcu(regs, rcu_exit);                         \
 }                                                                      \
                                                                        \
 static __always_inline void __##func(struct pt_regs *regs,             \
index a32a7e236bb16db3229b3f3a4bcdc7645851d35a..c47f004f62317890f627358affed01b407690ce3 100644 (file)
@@ -1929,11 +1929,11 @@ static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
 
 static __always_inline void exc_machine_check_user(struct pt_regs *regs)
 {
-       idtentry_enter(regs);
+       idtentry_enter_user(regs);
        instrumentation_begin();
        machine_check_vector(regs);
        instrumentation_end();
-       idtentry_exit(regs);
+       idtentry_exit_user(regs);
 }
 
 #ifdef CONFIG_X86_64
index 9e5d81cb94bad7c7645e0c555221d7d514d8e078..f28be3e51cca4f5f6105583a3f6f3f887913d50e 100644 (file)
@@ -619,18 +619,18 @@ DEFINE_IDTENTRY_RAW(exc_int3)
                return;
 
        /*
-        * idtentry_enter() uses static_branch_{,un}likely() and therefore
+        * idtentry_enter_user() uses static_branch_{,un}likely() and therefore
         * can trigger INT3, hence poke_int3_handler() must be done
         * before. If the entry came from kernel mode, then use nmi_enter()
         * because the INT3 could have been hit in any context including
         * NMI.
         */
        if (user_mode(regs)) {
-               idtentry_enter(regs);
+               idtentry_enter_user(regs);
                instrumentation_begin();
                do_int3_user(regs);
                instrumentation_end();
-               idtentry_exit(regs);
+               idtentry_exit_user(regs);
        } else {
                nmi_enter();
                instrumentation_begin();
@@ -877,7 +877,7 @@ static __always_inline void exc_debug_kernel(struct pt_regs *regs,
 static __always_inline void exc_debug_user(struct pt_regs *regs,
                                           unsigned long dr6)
 {
-       idtentry_enter(regs);
+       idtentry_enter_user(regs);
        clear_thread_flag(TIF_BLOCKSTEP);
 
        /*
@@ -886,7 +886,7 @@ static __always_inline void exc_debug_user(struct pt_regs *regs,
         * User wants a sigtrap for that.
         */
        handle_debug(regs, dr6, !dr6);
-       idtentry_exit(regs);
+       idtentry_exit_user(regs);
 }
 
 #ifdef CONFIG_X86_64