diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2014-04-11 20:12:43 +0200 |
---|---|---|
committer | Gary S. Robertson <gary.robertson@linaro.org> | 2014-06-09 18:34:57 -0500 |
commit | cf065839fb3b23d46a06d6f6bb79421424da1404 (patch) | |
tree | 0c79703b1b271d1ff25dfae815c67abd1f803a9d | |
parent | 33f8008a994620f21b15a973e50469d45a5fc1c2 (diff) |
disable lazy preempt on x86-64
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-rw-r--r-- | arch/x86/Kconfig | 2 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 28 |
2 files changed, 9 insertions, 21 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 8e19b563b6ee..4da5e0189ce6 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -21,7 +21,7 @@ config X86_64 ### Arch settings config X86 def_bool y - select HAVE_PREEMPT_LAZY + select HAVE_PREEMPT_LAZY if X86_32 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 29d3f604e5f1..b650b437c118 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -658,8 +658,8 @@ sysret_check: /* Handle reschedules */ /* edx: work, edi: workmask */ sysret_careful: - testl $_TIF_NEED_RESCHED_MASK,%edx - jz sysret_signal + bt $TIF_NEED_RESCHED,%edx + jnc sysret_signal TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) pushq_cfi %rdi @@ -771,8 +771,8 @@ GLOBAL(int_with_check) /* First do a reschedule test. */ /* edx: work, edi: workmask */ int_careful: - testl $_TIF_NEED_RESCHED_MASK,%edx - jz int_very_careful + bt $TIF_NEED_RESCHED,%edx + jnc int_very_careful TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) pushq_cfi %rdi @@ -1071,8 +1071,8 @@ bad_iret: /* edi: workmask, edx: work */ retint_careful: CFI_RESTORE_STATE - testl $_TIF_NEED_RESCHED_MASK,%edx - jz retint_signal + bt $TIF_NEED_RESCHED,%edx + jnc retint_signal TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) pushq_cfi %rdi @@ -1104,19 +1104,7 @@ retint_signal: /* rcx: threadinfo. interrupts off. */ ENTRY(retint_kernel) cmpl $0,PER_CPU_VAR(__preempt_count) - jz check_int_off - - # atleast preempt count == 0 ? - cmpl $_TIF_NEED_RESCHED,PER_CPU_VAR(__preempt_count) - jnz retint_restore_args - - cmpl $0, TI_preempt_lazy_count(%rcx) - jnz retint_restore_args - - bt $TIF_NEED_RESCHED_LAZY,TI_flags(%rcx) - jnc retint_restore_args - -check_int_off: + jnz retint_restore_args bt $9,EFLAGS-ARGOFFSET(%rsp) /* interrupts off? */ jnc retint_restore_args call preempt_schedule_irq @@ -1552,7 +1540,7 @@ paranoid_userspace: movq %rsp,%rdi /* &pt_regs */ call sync_regs movq %rax,%rsp /* switch stack for scheduling */ - testl $_TIF_NEED_RESCHED_MASK,%ebx + testl $_TIF_NEED_RESCHED,%ebx jnz paranoid_schedule movl %ebx,%edx /* arg3: thread flags */ TRACE_IRQS_ON |