lkml.org 
[lkml]   [2020]   [Feb]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 10/10] x86/traps: Stop using ist_enter/exit() in do_int3()
    #BP is not longer using IST and using ist_enter() and ist_exit() makes it
    harder to change ist_enter() and ist_exit()'s behavior. Instead open-code
    the very small amount of required logic.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

    ---
    arch/x86/kernel/traps.c | 21 +++++++++++++++------
    1 file changed, 15 insertions(+), 6 deletions(-)

    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -572,14 +572,20 @@ dotraplinkage void notrace do_int3(struc
    return;

    /*
    - * Use ist_enter despite the fact that we don't use an IST stack.
    - * We can be called from a kprobe in non-CONTEXT_KERNEL kernel
    - * mode or even during context tracking state changes.
    + * Unlike any other non-IST entry, we can be called from a kprobe in
    + * non-CONTEXT_KERNEL kernel mode or even during context tracking
    + * state changes. Make sure that we wake up RCU even if we're coming
    + * from kernel code.
    *
    - * This means that we can't schedule. That's okay.
    + * This means that we can't schedule even if we came from a
    + * preemptible kernel context. That's okay.
    */
    - ist_enter(regs);
    + if (!user_mode(regs)) {
    + rcu_nmi_enter();
    + preempt_disable();
    + }
    RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
    +
    #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
    if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
    SIGTRAP) == NOTIFY_STOP)
    @@ -600,7 +606,10 @@ dotraplinkage void notrace do_int3(struc
    cond_local_irq_disable(regs);

    exit:
    - ist_exit(regs);
    + if (!user_mode(regs)) {
    + preempt_enable_no_resched();
    + rcu_nmi_exit();
    + }
    }
    NOKPROBE_SYMBOL(do_int3);

    \
     
     \ /
      Last update: 2020-02-26 00:31    [W:2.327 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site