summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Macy <[email protected]>2020-09-23 11:09:48 -0700
committerGitHub <[email protected]>2020-09-23 11:09:48 -0700
commit3dad29fb4b085a159d26e2322dc07b46950ff72e (patch)
tree1d1237cce60d17c6367ffb009def03a0b81d7043
parenteb267f08cf52fb5f31c6c671bfc0f2cfbf6d0c06 (diff)
FreeBSD: Don't save user FPU context in kernel threads
Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Ryan Moeller <[email protected]> Signed-off-by: Matt Macy <[email protected]> Closes #10899
-rw-r--r--include/os/freebsd/spl/sys/simd_x86.h16
-rw-r--r--module/os/freebsd/spl/spl_taskq.c4
2 files changed, 12 insertions, 8 deletions
diff --git a/include/os/freebsd/spl/sys/simd_x86.h b/include/os/freebsd/spl/sys/simd_x86.h
index a35e205d5..63d6017b7 100644
--- a/include/os/freebsd/spl/sys/simd_x86.h
+++ b/include/os/freebsd/spl/sys/simd_x86.h
@@ -29,6 +29,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/systm.h>
+#include <sys/proc.h>
#ifdef __i386__
#include <x86/fpu.h>
#else
@@ -42,16 +43,15 @@
#define kfpu_allowed() 1
#define kfpu_initialize(tsk) do {} while (0)
-#define kfpu_begin() { \
- critical_enter(); \
- fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX); \
+#define kfpu_begin() { \
+ if (__predict_false(!is_fpu_kern_thread(0))) \
+ fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);\
}
-#define kfpu_end() \
- { \
- fpu_kern_leave(curthread, NULL); \
- critical_exit(); \
- }
+#define kfpu_end() { \
+ if (__predict_false(curpcb->pcb_flags & PCB_FPUNOSAVE)) \
+ fpu_kern_leave(curthread, NULL); \
+}
/*
* Check if OS supports AVX and AVX2 by checking XCR0
diff --git a/module/os/freebsd/spl/spl_taskq.c b/module/os/freebsd/spl/spl_taskq.c
index 049e889cf..cc025de95 100644
--- a/module/os/freebsd/spl/spl_taskq.c
+++ b/module/os/freebsd/spl/spl_taskq.c
@@ -169,6 +169,10 @@ taskq_tsd_set(void *context)
{
taskq_t *tq = context;
+#if defined(__amd64__) || defined(__i386__) || defined(__aarch64__)
+ if (context != NULL && tsd_get(taskq_tsd) == NULL)
+ fpu_kern_thread(FPU_KERN_NORMAL);
+#endif
tsd_set(taskq_tsd, tq);
}