* [PATCH] arm64/sve: Write ZCR_EL1 on context switch only if changed
@ 2018-05-14 17:51 Dave Martin
2018-05-17 17:20 ` Catalin Marinas
0 siblings, 1 reply; 2+ messages in thread
From: Dave Martin @ 2018-05-14 17:51 UTC (permalink / raw)
To: linux-arm-kernel
Writes to ZCR_EL1 are self-synchronising, and so may be expensive
in typical implementations.
This patch adopts the approach used for costly system register
writes elsewhere in the kernel: the system register write is
suppressed if it would not change the stored value.
Since the common case will be that of switching between tasks that
use the same vector length as one another, prediction hit rates on
the conditional branch should be reasonably good, with lower
expected amortised cost than the unconditional execution of a
heavyweight self-synchronising instruction.
Signed-off-by: Dave Martin <Dave.Martin@arm.com>
---
arch/arm64/include/asm/fpsimdmacros.h | 12 +++++++-----
arch/arm64/kernel/entry-fpsimd.S | 2 +-
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/arch/arm64/include/asm/fpsimdmacros.h b/arch/arm64/include/asm/fpsimdmacros.h
index e050d76..4684351 100644
--- a/arch/arm64/include/asm/fpsimdmacros.h
+++ b/arch/arm64/include/asm/fpsimdmacros.h
@@ -207,12 +207,14 @@
str w\nxtmp, [\xpfpsr, #4]
.endm
-.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp
+.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp, xtmp2
mrs_s x\nxtmp, SYS_ZCR_EL1
- bic x\nxtmp, x\nxtmp, ZCR_ELx_LEN_MASK
- orr x\nxtmp, x\nxtmp, \xvqminus1
- msr_s SYS_ZCR_EL1, x\nxtmp // self-synchronising
-
+ bic \xtmp2, x\nxtmp, ZCR_ELx_LEN_MASK
+ orr \xtmp2, \xtmp2, \xvqminus1
+ cmp \xtmp2, x\nxtmp
+ b.eq 921f
+ msr_s SYS_ZCR_EL1, \xtmp2 // self-synchronising
+921:
_for n, 0, 31, _sve_ldr_v \n, \nxbase, \n - 34
_sve_ldr_p 0, \nxbase
_sve_wrffr 0
diff --git a/arch/arm64/kernel/entry-fpsimd.S b/arch/arm64/kernel/entry-fpsimd.S
index 73f17bf..12d4958 100644
--- a/arch/arm64/kernel/entry-fpsimd.S
+++ b/arch/arm64/kernel/entry-fpsimd.S
@@ -49,7 +49,7 @@ ENTRY(sve_save_state)
ENDPROC(sve_save_state)
ENTRY(sve_load_state)
- sve_load 0, x1, x2, 3
+ sve_load 0, x1, x2, 3, x4
ret
ENDPROC(sve_load_state)
--
2.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH] arm64/sve: Write ZCR_EL1 on context switch only if changed
2018-05-14 17:51 [PATCH] arm64/sve: Write ZCR_EL1 on context switch only if changed Dave Martin
@ 2018-05-17 17:20 ` Catalin Marinas
0 siblings, 0 replies; 2+ messages in thread
From: Catalin Marinas @ 2018-05-17 17:20 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, May 14, 2018 at 06:51:09PM +0100, Dave P Martin wrote:
> Writes to ZCR_EL1 are self-synchronising, and so may be expensive
> in typical implementations.
>
> This patch adopts the approach used for costly system register
> writes elsewhere in the kernel: the system register write is
> suppressed if it would not change the stored value.
>
> Since the common case will be that of switching between tasks that
> use the same vector length as one another, prediction hit rates on
> the conditional branch should be reasonably good, with lower
> expected amortised cost than the unconditional execution of a
> heavyweight self-synchronising instruction.
>
> Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Queued for 4.18. Thanks.
--
Catalin
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-05-17 17:20 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-14 17:51 [PATCH] arm64/sve: Write ZCR_EL1 on context switch only if changed Dave Martin
2018-05-17 17:20 ` Catalin Marinas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox