diff options
author | Ingo Molnar | 2015-03-24 21:14:07 +0100 |
---|---|---|
committer | Ingo Molnar | 2015-03-25 13:19:43 +0100 |
commit | 06ab9c1ba6a19977432b6906b0eee84804212dc6 (patch) | |
tree | 6a69e2852e9ed71cd76d0d6b25694a361f64c306 | |
parent | 72d64cc76941cde45e65e2a5b9fb81d527963645 (diff) | |
parent | b3494a4ab20f6bdf74cdf2badf7918bb65ee8a00 (diff) |
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>
-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 daf5d94c0e78..bf9afadbb99e 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) |