diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-03-24 20:14:07 (GMT) |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-25 12:19:43 (GMT) |
commit | 06ab9c1ba6a19977432b6906b0eee84804212dc6 (patch) | |
tree | 6a69e2852e9ed71cd76d0d6b25694a361f64c306 /arch/x86/kernel | |
parent | 72d64cc76941cde45e65e2a5b9fb81d527963645 (diff) | |
parent | b3494a4ab20f6bdf74cdf2badf7918bb65ee8a00 (diff) | |
download | linux-06ab9c1ba6a19977432b6906b0eee84804212dc6.tar.xz |
Merge branch 'x86/urgent' into x86/asm, to resolve conflict
Conflicts:
arch/x86/kernel/entry_64.S
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/entry_64.S | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index daf5d94..bf9afad 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -267,12 +267,22 @@ system_call_fastpath: * Has incompletely filled pt_regs, iret frame is also incomplete. */ ret_from_sys_call: - testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) - jnz int_ret_from_sys_call /* Go the slow path */ LOCKDEP_SYS_EXIT DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF + + /* + * We must check ti flags with interrupts (or at least preemption) + * off because we must *never* return to userspace without + * processing exit work that is enqueued if we're preempted here. + * In particular, returning to userspace with any of the one-shot + * flags (TIF_NOTIFY_RESUME, TIF_USER_RETURN_NOTIFY, etc) set is + * very bad. + */ + testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) + jnz int_ret_from_sys_call_irqs_off /* Go to the slow path */ + CFI_REMEMBER_STATE /* * sysretq will re-enable interrupts: @@ -337,6 +347,7 @@ tracesys_phase2: GLOBAL(int_ret_from_sys_call) DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF +int_ret_from_sys_call_irqs_off: movl $_TIF_ALLWORK_MASK,%edi /* edi: mask to check */ GLOBAL(int_with_check) |