Skip to content

Commit

Permalink
x86/entry: Move paranoid irq tracing out of ASM code
Browse files Browse the repository at this point in the history
The last step to remove the irq tracing cruft from ASM. Ignore #DF as the
maschine is going to die anyway.

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/20200521202120.414043330@linutronix.de
  • Loading branch information
Thomas Gleixner committed Jun 11, 2020
1 parent 9628f26 commit 3ffdfdc
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 13 deletions.
13 changes: 0 additions & 13 deletions arch/x86/entry/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
*
* Some macro usage:
* - SYM_FUNC_START/END:Define functions in the symbol table.
* - TRACE_IRQ_*: Trace hardirq state for lock debugging.
* - idtentry: Define exception entry points.
*/
#include <linux/linkage.h>
Expand Down Expand Up @@ -107,11 +106,6 @@ SYM_CODE_END(native_usergs_sysret64)

SYM_CODE_START(entry_SYSCALL_64)
UNWIND_HINT_EMPTY
/*
* Interrupts are off on entry.
* We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
* it is too small to ever cause noticeable irq latency.
*/

swapgs
/* tss.sp2 is scratch space. */
Expand Down Expand Up @@ -462,8 +456,6 @@ SYM_CODE_START(\asmsym)

UNWIND_HINT_REGS

TRACE_IRQS_OFF

movq %rsp, %rdi /* pt_regs pointer */

.if \vector == X86_TRAP_DB
Expand Down Expand Up @@ -881,17 +873,13 @@ SYM_CODE_END(paranoid_entry)
*/
SYM_CODE_START_LOCAL(paranoid_exit)
UNWIND_HINT_REGS
DISABLE_INTERRUPTS(CLBR_ANY)
TRACE_IRQS_OFF
testl %ebx, %ebx /* swapgs needed? */
jnz .Lparanoid_exit_no_swapgs
TRACE_IRQS_IRETQ
/* Always restore stashed CR3 value (see paranoid_entry) */
RESTORE_CR3 scratch_reg=%rbx save_reg=%r14
SWAPGS_UNSAFE_STACK
jmp restore_regs_and_return_to_kernel
.Lparanoid_exit_no_swapgs:
TRACE_IRQS_IRETQ
/* Always restore stashed CR3 value (see paranoid_entry) */
RESTORE_CR3 scratch_reg=%rbx save_reg=%r14
jmp restore_regs_and_return_to_kernel
Expand Down Expand Up @@ -1292,7 +1280,6 @@ end_repeat_nmi:
call paranoid_entry
UNWIND_HINT_REGS

/* paranoidentry exc_nmi(), 0; without TRACE_IRQS_OFF */
movq %rsp, %rdi
movq $-1, %rsi
call exc_nmi
Expand Down
3 changes: 3 additions & 0 deletions arch/x86/kernel/cpu/mce/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1922,7 +1922,10 @@ static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
* that out because it's an indirect call. Annotate it.
*/
instrumentation_begin();
trace_hardirqs_off_prepare();
machine_check_vector(regs);
if (regs->flags & X86_EFLAGS_IF)
trace_hardirqs_on_prepare();
instrumentation_end();
nmi_exit();
}
Expand Down
3 changes: 3 additions & 0 deletions arch/x86/kernel/nmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ static noinstr void default_do_nmi(struct pt_regs *regs)
__this_cpu_write(last_nmi_rip, regs->ip);

instrumentation_begin();
trace_hardirqs_off_prepare();

handled = nmi_handle(NMI_LOCAL, regs);
__this_cpu_add(nmi_stats.normal, handled);
Expand Down Expand Up @@ -416,6 +417,8 @@ static noinstr void default_do_nmi(struct pt_regs *regs)
unknown_nmi_error(reason, regs);

out:
if (regs->flags & X86_EFLAGS_IF)
trace_hardirqs_on_prepare();
instrumentation_end();
}

Expand Down
11 changes: 11 additions & 0 deletions arch/x86/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -634,8 +634,11 @@ DEFINE_IDTENTRY_RAW(exc_int3)
} else {
nmi_enter();
instrumentation_begin();
trace_hardirqs_off_prepare();
if (!do_int3(regs))
die("int3", regs, 0);
if (regs->flags & X86_EFLAGS_IF)
trace_hardirqs_on_prepare();
instrumentation_end();
nmi_exit();
}
Expand Down Expand Up @@ -850,6 +853,10 @@ static __always_inline void exc_debug_kernel(struct pt_regs *regs,
unsigned long dr6)
{
nmi_enter();
instrumentation_begin();
trace_hardirqs_off_prepare();
instrumentation_end();

/*
* The SDM says "The processor clears the BTF flag when it
* generates a debug exception." Clear TIF_BLOCKSTEP to keep
Expand All @@ -871,6 +878,10 @@ static __always_inline void exc_debug_kernel(struct pt_regs *regs,
if (dr6)
handle_debug(regs, dr6, false);

instrumentation_begin();
if (regs->flags & X86_EFLAGS_IF)
trace_hardirqs_on_prepare();
instrumentation_end();
nmi_exit();
}

Expand Down

0 comments on commit 3ffdfdc

Please sign in to comment.