89 lines
2.6 KiB
Diff
89 lines
2.6 KiB
Diff
From 27bcad87397de27b92b8651630771e032cf87116 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Fri, 11 Apr 2014 20:12:43 +0200
|
|
Subject: [PATCH] disable lazy preempt on x86-64
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/3.14/patches-3.14.0-rt1.tar.xz
|
|
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
arch/x86/Kconfig | 2 +-
|
|
arch/x86/kernel/entry_64.S | 28 ++++++++--------------------
|
|
2 files changed, 9 insertions(+), 21 deletions(-)
|
|
|
|
--- 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
|
|
--- a/arch/x86/kernel/entry_64.S
|
|
+++ b/arch/x86/kernel/entry_64.S
|
|
@@ -658,8 +658,8 @@ GLOBAL(system_call_after_swapgs)
|
|
/* 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 @@ ENTRY(native_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 @@ ENTRY(native_iret)
|
|
/* 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 @@ ENTRY(paranoid_exit)
|
|
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
|