From: Ingo Molnar Date: Tue, 24 Mar 2015 20:14:07 +0000 (+0100) Subject: Merge branch 'x86/urgent' into x86/asm, to resolve conflict X-Git-Tag: firefly_0821_release~176^2~2028^2~52 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=06ab9c1ba6a19977432b6906b0eee84804212dc6;p=firefly-linux-kernel-4.4.55.git Merge branch 'x86/urgent' into x86/asm, to resolve conflict Conflicts: arch/x86/kernel/entry_64.S Signed-off-by: Ingo Molnar --- 06ab9c1ba6a19977432b6906b0eee84804212dc6 diff --cc arch/x86/kernel/entry_64.S index daf5d94c0e78,2babb393915e..bf9afadbb99e --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@@ -261,18 -358,27 +261,28 @@@ system_call_fastpath ja ret_from_sys_call /* and return regs->ax */ movq %r10,%rcx call *sys_call_table(,%rax,8) # XXX: rip relative - movq %rax,RAX-ARGOFFSET(%rsp) + movq %rax,RAX(%rsp) /* * Syscall return path ending with SYSRET (fast path) - * Has incomplete stack frame and undefined top of stack. + * 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,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) - jnz int_ret_from_sys_call_fixup /* Go the the slow path */ ++ 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: