[PATCH 6/6] x86/fpu: change get_fpstate() to return &init_fpstate if PF_USER_WORKER
From: Oleg Nesterov
Date: Thu Aug 14 2025 - 06:25:57 EST
PF_USER_WORKERs must never use FPU, this is what kernel_fpu_begin/etc
assume. The .regset_get() functions can safely use init_fpstate if
target->flags & PF_USER_WORKER.
Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx>
---
arch/x86/kernel/fpu/regset.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c
index ecbabdc15ec1..dfd12d109f00 100644
--- a/arch/x86/kernel/fpu/regset.c
+++ b/arch/x86/kernel/fpu/regset.c
@@ -45,8 +45,12 @@ int regset_xregset_fpregs_active(struct task_struct *target, const struct user_r
*/
static struct fpstate *get_fpstate(struct task_struct *task)
{
- struct fpu *fpu = x86_task_fpu(task);
+ struct fpu *fpu;
+ if (unlikely(task->flags & PF_USER_WORKER))
+ return &init_fpstate;
+
+ fpu = x86_task_fpu(task);
if (task == current)
fpu_sync_fpstate(fpu);
return fpu->fpstate;
--
2.25.1.362.g51ebf55