Skip to content

Commit

Permalink
x86/entry: Move irq tracing on syscall entry to C-code
Browse files Browse the repository at this point in the history
Now that the C entry points are safe, move the irq flags tracing code into
the entry helper:

    - Invoke lockdep before calling into context tracking

    - Use the safe trace_hardirqs_on_prepare() trace function after context
      tracking established state and RCU is watching.

enter_from_user_mode() is also still invoked from the exception/interrupt
entry code which still contains the ASM irq flags tracing. So this is just
a redundant and harmless invocation of tracing / lockdep until these are
removed as well.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200505134340.611961721@linutronix.de
  • Loading branch information
Thomas Gleixner committed Jun 11, 2020
1 parent 8f159f1 commit dd8e2d9
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 34 deletions.
21 changes: 19 additions & 2 deletions arch/x86/entry/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,19 +40,36 @@
#include <trace/events/syscalls.h>

#ifdef CONFIG_CONTEXT_TRACKING
/* Called on entry from user mode with IRQs off. */
/**
* enter_from_user_mode - Establish state when coming from user mode
*
* Syscall entry disables interrupts, but user mode is traced as interrupts
* enabled. Also with NO_HZ_FULL RCU might be idle.
*
* 1) Tell lockdep that interrupts are disabled
* 2) Invoke context tracking if enabled to reactivate RCU
* 3) Trace interrupts off state
*/
__visible noinstr void enter_from_user_mode(void)
{
enum ctx_state state = ct_state();

lockdep_hardirqs_off(CALLER_ADDR0);
user_exit_irqoff();

instrumentation_begin();
CT_WARN_ON(state != CONTEXT_USER);
trace_hardirqs_off_prepare();
instrumentation_end();
}
#else
static inline void enter_from_user_mode(void) {}
static __always_inline void enter_from_user_mode(void)
{
lockdep_hardirqs_off(CALLER_ADDR0);
instrumentation_begin();
trace_hardirqs_off_prepare();
instrumentation_end();
}
#endif

static noinstr void exit_to_user_mode(void)
Expand Down
12 changes: 0 additions & 12 deletions arch/x86/entry/entry_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -967,12 +967,6 @@ SYM_FUNC_START(entry_SYSENTER_32)
jnz .Lsysenter_fix_flags
.Lsysenter_flags_fixed:

/*
* User mode is traced as though IRQs are on, and SYSENTER
* turned them off.
*/
TRACE_IRQS_OFF

movl %esp, %eax
call do_fast_syscall_32
/* XEN PV guests always use IRET path */
Expand Down Expand Up @@ -1082,12 +1076,6 @@ SYM_FUNC_START(entry_INT80_32)

SAVE_ALL pt_regs_ax=$-ENOSYS switch_stacks=1 /* save rest */

/*
* User mode is traced as though IRQs are on, and the interrupt gate
* turned them off.
*/
TRACE_IRQS_OFF

movl %esp, %eax
call do_int80_syscall_32
.Lsyscall_32_done:
Expand Down
2 changes: 0 additions & 2 deletions arch/x86/entry/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,6 @@ SYM_INNER_LABEL(entry_SYSCALL_64_after_hwframe, SYM_L_GLOBAL)

PUSH_AND_CLEAR_REGS rax=$-ENOSYS

TRACE_IRQS_OFF

/* IRQs are off. */
movq %rax, %rdi
movq %rsp, %rsi
Expand Down
18 changes: 0 additions & 18 deletions arch/x86/entry/entry_64_compat.S
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,6 @@ SYM_FUNC_START(entry_SYSENTER_compat)
jnz .Lsysenter_fix_flags
.Lsysenter_flags_fixed:

/*
* User mode is traced as though IRQs are on, and SYSENTER
* turned them off.
*/
TRACE_IRQS_OFF

movq %rsp, %rdi
call do_fast_syscall_32
/* XEN PV guests always use IRET path */
Expand Down Expand Up @@ -247,12 +241,6 @@ SYM_INNER_LABEL(entry_SYSCALL_compat_after_hwframe, SYM_L_GLOBAL)
pushq $0 /* pt_regs->r15 = 0 */
xorl %r15d, %r15d /* nospec r15 */

/*
* User mode is traced as though IRQs are on, and SYSENTER
* turned them off.
*/
TRACE_IRQS_OFF

movq %rsp, %rdi
call do_fast_syscall_32
/* XEN PV guests always use IRET path */
Expand Down Expand Up @@ -403,12 +391,6 @@ SYM_CODE_START(entry_INT80_compat)
xorl %r15d, %r15d /* nospec r15 */
cld

/*
* User mode is traced as though IRQs are on, and the interrupt
* gate turned them off.
*/
TRACE_IRQS_OFF

movq %rsp, %rdi
call do_int80_syscall_32
.Lsyscall_32_done:
Expand Down

0 comments on commit dd8e2d9

Please sign in to comment.