mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-22 10:31:35 +00:00
66 lines
2.1 KiB
Diff
66 lines
2.1 KiB
Diff
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Thu, 30 Nov 2017 13:40:10 +0100
|
|
Subject: [PATCH] crypto: limit more FPU-enabled sections
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Those crypto drivers use SSE/AVX/… for their crypto work and in order to
|
|
do so in kernel they need to enable the "FPU" in kernel mode which
|
|
disables preemption.
|
|
There are two problems with the way they are used:
|
|
- the while loop which processes X bytes may create latency spikes and
|
|
should be avoided or limited.
|
|
- the cipher-walk-next part may allocate/free memory and may use
|
|
kmap_atomic().
|
|
|
|
The whole kernel_fpu_begin()/end() processing isn't probably that cheap.
|
|
It most likely makes sense to process as much of those as possible in one
|
|
go. The new *_fpu_sched_rt() schedules only if a RT task is pending.
|
|
|
|
Probably we should measure the performance those ciphers in pure SW
|
|
mode and with this optimisations to see if it makes sense to keep them
|
|
for RT.
|
|
|
|
This kernel_fpu_resched() makes the code more preemptible which might hurt
|
|
performance.
|
|
|
|
Cc: stable-rt@vger.kernel.org
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
arch/x86/include/asm/fpu/api.h | 1 +
|
|
arch/x86/kernel/fpu/core.c | 12 ++++++++++++
|
|
2 files changed, 13 insertions(+)
|
|
|
|
--- a/arch/x86/include/asm/fpu/api.h
|
|
+++ b/arch/x86/include/asm/fpu/api.h
|
|
@@ -28,6 +28,7 @@ extern void kernel_fpu_begin_mask(unsign
|
|
extern void kernel_fpu_end(void);
|
|
extern bool irq_fpu_usable(void);
|
|
extern void fpregs_mark_activate(void);
|
|
+extern void kernel_fpu_resched(void);
|
|
|
|
/* Code that is unaware of kernel_fpu_begin_mask() can use this */
|
|
static inline void kernel_fpu_begin(void)
|
|
--- a/arch/x86/kernel/fpu/core.c
|
|
+++ b/arch/x86/kernel/fpu/core.c
|
|
@@ -159,6 +159,18 @@ void kernel_fpu_end(void)
|
|
}
|
|
EXPORT_SYMBOL_GPL(kernel_fpu_end);
|
|
|
|
+void kernel_fpu_resched(void)
|
|
+{
|
|
+ WARN_ON_FPU(!this_cpu_read(in_kernel_fpu));
|
|
+
|
|
+ if (should_resched(PREEMPT_OFFSET)) {
|
|
+ kernel_fpu_end();
|
|
+ cond_resched();
|
|
+ kernel_fpu_begin();
|
|
+ }
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(kernel_fpu_resched);
|
|
+
|
|
/*
|
|
* Save the FPU state (mark it for reload if necessary):
|
|
*
|