FreeBSD: Don't save user FPU context in kernel threads

Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Ryan Moeller <freqlabs@FreeBSD.org>
Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
Closes #10899
This commit is contained in:
Matthew Macy 2020-09-23 11:09:48 -07:00 committed by Brian Behlendorf
parent b199e62d17
commit 227273efa4
2 changed files with 12 additions and 8 deletions

View File

@ -29,6 +29,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/proc.h>
#ifdef __i386__ #ifdef __i386__
#include <x86/fpu.h> #include <x86/fpu.h>
#else #else
@ -42,16 +43,15 @@
#define kfpu_allowed() 1 #define kfpu_allowed() 1
#define kfpu_initialize(tsk) do {} while (0) #define kfpu_initialize(tsk) do {} while (0)
#define kfpu_begin() { \ #define kfpu_begin() { \
critical_enter(); \ if (__predict_false(!is_fpu_kern_thread(0))) \
fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX); \ fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);\
} }
#define kfpu_end() \ #define kfpu_end() { \
{ \ if (__predict_false(curpcb->pcb_flags & PCB_FPUNOSAVE)) \
fpu_kern_leave(curthread, NULL); \ fpu_kern_leave(curthread, NULL); \
critical_exit(); \ }
}
/* /*
* Check if OS supports AVX and AVX2 by checking XCR0 * Check if OS supports AVX and AVX2 by checking XCR0

View File

@ -169,6 +169,10 @@ taskq_tsd_set(void *context)
{ {
taskq_t *tq = 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); tsd_set(taskq_tsd, tq);
} }