lkml.org 
[lkml]   [2015]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 08/17] x86/entry: Add enter_from_user_mode and use it in syscalls
    Date
    Changing the x86 context tracking hooks is dangerous because there
    are no good checks that we track our context correctly. Add a
    helper to check that we're actually in CONTEXT_USER when we enter
    from user mode and wire it up for syscall entries.

    Subsequent patches will wire this up for all non-NMI entries as
    well. NMIs are their own special beast and cannot currently switch
    overall context tracking state. Instead, they have their own
    special RCU hooks.

    This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a
    branch) and a tiny slowdown if CONFIG_CONTEXT_TRACING (adds a layer
    of indirection). Eventually, we should fix up the core context
    tracking code to supply a function that does what we want (and can
    be much simpler than user_exit), which will enable us to get rid of
    the extra call.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/entry/common.c | 13 ++++++++++++-
    1 file changed, 12 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
    index 917d0c3cb851..9a327ee24eef 100644
    --- a/arch/x86/entry/common.c
    +++ b/arch/x86/entry/common.c
    @@ -28,6 +28,15 @@
    #define CREATE_TRACE_POINTS
    #include <trace/events/syscalls.h>

    +#ifdef CONFIG_CONTEXT_TRACKING
    +/* Called on entry from user mode with IRQs off. */
    +__visible void enter_from_user_mode(void)
    +{
    + CT_WARN_ON(ct_state() != CONTEXT_USER);
    + user_exit();
    +}
    +#endif
    +
    static void do_audit_syscall_entry(struct pt_regs *regs, u32 arch)
    {
    #ifdef CONFIG_X86_64
    @@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch)
    work = ACCESS_ONCE(current_thread_info()->flags) &
    _TIF_WORK_SYSCALL_ENTRY;

    +#ifdef CONFIG_CONTEXT_TRACKING
    /*
    * If TIF_NOHZ is set, we are required to call user_exit() before
    * doing anything that could touch RCU.
    */
    if (work & _TIF_NOHZ) {
    - user_exit();
    + enter_from_user_mode();
    work &= ~_TIF_NOHZ;
    }
    +#endif

    #ifdef CONFIG_SECCOMP
    /*
    --
    2.4.3


    \
     
     \ /
      Last update: 2015-07-03 22:21    [W:4.130 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site