58 lines
2.0 KiB
Diff
58 lines
2.0 KiB
Diff
From: Salvatore Bonaccorso <carnil@debian.org>
|
|
Date: Tue, 17 Dec 2019 15:18:10 +0100
|
|
Subject: Revert "arm64: preempt: Fix big-endian when checking preempt count in
|
|
assembly"
|
|
Bug: https://lore.kernel.org/stable/20191214021403.GA1357@home.goodmis.org/
|
|
|
|
As reported[1] by Steven Rostedt while updating 4.19-rt, the change
|
|
breaks without having as well 396244692232f ("arm64: preempt: Provide
|
|
our own implementation of asm/preempt.h").
|
|
|
|
[1]: <https://lore.kernel.org/stable/20191214021403.GA1357@home.goodmis.org/>
|
|
|
|
Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
|
---
|
|
arch/arm64/include/asm/assembler.h | 8 +++++---
|
|
arch/arm64/kernel/entry.S | 6 ++++--
|
|
2 files changed, 9 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h
|
|
index 0c100506a29a..5a97ac853168 100644
|
|
--- a/arch/arm64/include/asm/assembler.h
|
|
+++ b/arch/arm64/include/asm/assembler.h
|
|
@@ -683,9 +683,11 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU
|
|
.macro if_will_cond_yield_neon
|
|
#ifdef CONFIG_PREEMPT
|
|
get_thread_info x0
|
|
- ldr x0, [x0, #TSK_TI_PREEMPT]
|
|
- sub x0, x0, #PREEMPT_DISABLE_OFFSET
|
|
- cbz x0, .Lyield_\@
|
|
+ ldr w1, [x0, #TSK_TI_PREEMPT]
|
|
+ ldr x0, [x0, #TSK_TI_FLAGS]
|
|
+ cmp w1, #PREEMPT_DISABLE_OFFSET
|
|
+ csel x0, x0, xzr, eq
|
|
+ tbnz x0, #TIF_NEED_RESCHED, .Lyield_\@ // needs rescheduling?
|
|
/* fall through to endif_yield_neon */
|
|
.subsection 1
|
|
.Lyield_\@ :
|
|
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
|
|
index bb6832353045..5f800384cb9a 100644
|
|
--- a/arch/arm64/kernel/entry.S
|
|
+++ b/arch/arm64/kernel/entry.S
|
|
@@ -622,8 +622,10 @@ el1_irq:
|
|
irq_handler
|
|
|
|
#ifdef CONFIG_PREEMPT
|
|
- ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt count
|
|
- cbnz x24, 1f // preempt count != 0
|
|
+ ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count
|
|
+ cbnz w24, 1f // preempt count != 0
|
|
+ ldr x0, [tsk, #TSK_TI_FLAGS] // get flags
|
|
+ tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
|
|
bl el1_preempt
|
|
1:
|
|
#endif
|
|
--
|
|
2.24.1
|
|
|