extern void fpu__init_cpu_xstate(void);
extern void fpu__init_system(struct cpuinfo_x86 *c);
-extern int fpstate_alloc_init(struct fpu *fpu);
+extern void fpstate_alloc_init(struct fpu *fpu);
extern void fpstate_init(struct fpu *fpu);
extern void fpu__clear(struct task_struct *tsk);
}
/*
- * Allocate the backing store for the current task's FPU registers
- * and initialize the registers themselves as well.
- *
- * Can fail.
+ * Initialize the current task's in-memory FPU context:
*/
-int fpstate_alloc_init(struct fpu *fpu)
+void fpstate_alloc_init(struct fpu *fpu)
{
- int ret;
-
- if (WARN_ON_ONCE(fpu != ¤t->thread.fpu))
- return -EINVAL;
- if (WARN_ON_ONCE(fpu->fpstate_active))
- return -EINVAL;
+ WARN_ON_ONCE(fpu != ¤t->thread.fpu);
+ WARN_ON_ONCE(fpu->fpstate_active);
fpstate_init(fpu);
/* Safe to do for the current task: */
fpu->fpstate_active = 1;
-
- return 0;
}
EXPORT_SYMBOL_GPL(fpstate_alloc_init);
struct task_struct *tsk = current;
struct fpu *fpu = &tsk->thread.fpu;
- if (!fpu->fpstate_active) {
- local_irq_enable();
- /*
- * does a slab alloc which can sleep
- */
- if (fpstate_alloc_init(fpu)) {
- /*
- * ran out of memory!
- */
- do_group_exit(SIGKILL);
- return;
- }
- local_irq_disable();
- }
+ if (!fpu->fpstate_active)
+ fpstate_alloc_init(fpu);
/* Avoid __kernel_fpu_begin() right after fpregs_activate() */
kernel_fpu_disable();
drop_fpu(fpu);
} else {
if (!fpu->fpstate_active) {
- /* kthread execs. TODO: cleanup this horror. */
- if (WARN_ON(fpstate_alloc_init(fpu)))
- force_sig(SIGKILL, tsk);
+ fpstate_alloc_init(fpu);
user_fpu_begin();
}
restore_init_xstate();
if (!access_ok(VERIFY_READ, buf, size))
return -EACCES;
- if (!fpu->fpstate_active && fpstate_alloc_init(fpu))
- return -1;
+ if (!fpu->fpstate_active)
+ fpstate_alloc_init(fpu);
if (!static_cpu_has(X86_FEATURE_FPU))
return fpregs_soft_set(current, NULL,
int r;
sigset_t sigsaved;
- if (!fpu->fpstate_active && fpstate_alloc_init(fpu))
- return -ENOMEM;
+ if (!fpu->fpstate_active)
+ fpstate_alloc_init(fpu);
if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
struct desc_struct code_descriptor;
struct fpu *fpu = ¤t->thread.fpu;
- if (!fpu->fpstate_active) {
- if (fpstate_alloc_init(fpu)) {
- do_group_exit(SIGKILL);
- return;
- }
- }
+ if (!fpu->fpstate_active)
+ fpstate_alloc_init(fpu);
#ifdef RE_ENTRANT_CHECKING
if (emulating) {