Commit c4d6ee6e authored by Ingo Molnar's avatar Ingo Molnar

x86/fpu: Remove failure paths from fpstate-alloc low level functions

Now that we always allocate the FPU context as part of task_struct there's
no need for separate allocations - remove them and their primary failure
handling code.

( Note that there's still secondary error codes that have become superfluous,
  those will be removed in separate patches. )

Move the somewhat misplaced setup_xstate_comp() call to the core.
Reviewed-by: default avatarBorislav Petkov <bp@alien8.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 7366ed77
...@@ -558,10 +558,6 @@ static inline unsigned short get_fpu_mxcsr(struct task_struct *tsk) ...@@ -558,10 +558,6 @@ static inline unsigned short get_fpu_mxcsr(struct task_struct *tsk)
} }
} }
extern void fpstate_cache_init(void);
extern int fpstate_alloc(struct fpu *fpu);
extern void fpstate_free(struct fpu *fpu);
extern int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu); extern int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu);
static inline unsigned long static inline unsigned long
......
...@@ -225,34 +225,6 @@ void fpstate_init(struct fpu *fpu) ...@@ -225,34 +225,6 @@ void fpstate_init(struct fpu *fpu)
} }
EXPORT_SYMBOL_GPL(fpstate_init); EXPORT_SYMBOL_GPL(fpstate_init);
/*
* FPU state allocation:
*/
static struct kmem_cache *task_xstate_cachep;
void fpstate_cache_init(void)
{
task_xstate_cachep =
kmem_cache_create("task_xstate", xstate_size,
__alignof__(union thread_xstate),
SLAB_PANIC | SLAB_NOTRACK, NULL);
setup_xstate_comp();
}
int fpstate_alloc(struct fpu *fpu)
{
/* The CPU requires the FPU state to be aligned to 16 byte boundaries: */
WARN_ON((unsigned long)&fpu->state & 15);
return 0;
}
EXPORT_SYMBOL_GPL(fpstate_alloc);
void fpstate_free(struct fpu *fpu)
{
}
EXPORT_SYMBOL_GPL(fpstate_free);
/* /*
* Copy the current task's FPU state to a new task's FPU context. * Copy the current task's FPU state to a new task's FPU context.
* *
...@@ -280,13 +252,9 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu) ...@@ -280,13 +252,9 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
dst_fpu->fpregs_active = 0; dst_fpu->fpregs_active = 0;
dst_fpu->last_cpu = -1; dst_fpu->last_cpu = -1;
if (src_fpu->fpstate_active) { if (src_fpu->fpstate_active)
int err = fpstate_alloc(dst_fpu);
if (err)
return err;
fpu_copy(dst_fpu, src_fpu); fpu_copy(dst_fpu, src_fpu);
}
return 0; return 0;
} }
...@@ -305,13 +273,6 @@ int fpstate_alloc_init(struct fpu *fpu) ...@@ -305,13 +273,6 @@ int fpstate_alloc_init(struct fpu *fpu)
if (WARN_ON_ONCE(fpu->fpstate_active)) if (WARN_ON_ONCE(fpu->fpstate_active))
return -EINVAL; return -EINVAL;
/*
* Memory allocation at the first usage of the FPU and other state.
*/
ret = fpstate_alloc(fpu);
if (ret)
return ret;
fpstate_init(fpu); fpstate_init(fpu);
/* Safe to do for the current task: */ /* Safe to do for the current task: */
...@@ -356,13 +317,6 @@ static int fpu__unlazy_stopped(struct fpu *child_fpu) ...@@ -356,13 +317,6 @@ static int fpu__unlazy_stopped(struct fpu *child_fpu)
return 0; return 0;
} }
/*
* Memory allocation at the first usage of the FPU and other state.
*/
ret = fpstate_alloc(child_fpu);
if (ret)
return ret;
fpstate_init(child_fpu); fpstate_init(child_fpu);
/* Safe to do for stopped child tasks: */ /* Safe to do for stopped child tasks: */
...@@ -423,7 +377,6 @@ void fpu__clear(struct task_struct *tsk) ...@@ -423,7 +377,6 @@ void fpu__clear(struct task_struct *tsk)
if (!use_eager_fpu()) { if (!use_eager_fpu()) {
/* FPU state will be reallocated lazily at the first use. */ /* FPU state will be reallocated lazily at the first use. */
drop_fpu(fpu); drop_fpu(fpu);
fpstate_free(fpu);
} else { } else {
if (!fpu->fpstate_active) { if (!fpu->fpstate_active) {
/* kthread execs. TODO: cleanup this horror. */ /* kthread execs. TODO: cleanup this horror. */
......
...@@ -265,6 +265,7 @@ void fpu__init_system(struct cpuinfo_x86 *c) ...@@ -265,6 +265,7 @@ void fpu__init_system(struct cpuinfo_x86 *c)
fpu__init_system_generic(); fpu__init_system_generic();
fpu__init_system_xstate_size_legacy(); fpu__init_system_xstate_size_legacy();
fpu__init_system_xstate(); fpu__init_system_xstate();
setup_xstate_comp();
fpu__init_system_ctx_switch(); fpu__init_system_ctx_switch();
} }
......
...@@ -86,16 +86,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) ...@@ -86,16 +86,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
return fpu__copy(&dst->thread.fpu, &src->thread.fpu); return fpu__copy(&dst->thread.fpu, &src->thread.fpu);
} }
void arch_release_task_struct(struct task_struct *tsk)
{
fpstate_free(&tsk->thread.fpu);
}
void arch_task_cache_init(void)
{
fpstate_cache_init();
}
/* /*
* Free current thread data structures etc.. * Free current thread data structures etc..
*/ */
......
...@@ -7008,10 +7008,6 @@ int fx_init(struct kvm_vcpu *vcpu) ...@@ -7008,10 +7008,6 @@ int fx_init(struct kvm_vcpu *vcpu)
{ {
int err; int err;
err = fpstate_alloc(&vcpu->arch.guest_fpu);
if (err)
return err;
fpstate_init(&vcpu->arch.guest_fpu); fpstate_init(&vcpu->arch.guest_fpu);
if (cpu_has_xsaves) if (cpu_has_xsaves)
vcpu->arch.guest_fpu.state.xsave.header.xcomp_bv = vcpu->arch.guest_fpu.state.xsave.header.xcomp_bv =
...@@ -7028,11 +7024,6 @@ int fx_init(struct kvm_vcpu *vcpu) ...@@ -7028,11 +7024,6 @@ int fx_init(struct kvm_vcpu *vcpu)
} }
EXPORT_SYMBOL_GPL(fx_init); EXPORT_SYMBOL_GPL(fx_init);
static void fx_free(struct kvm_vcpu *vcpu)
{
fpstate_free(&vcpu->arch.guest_fpu);
}
void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) void kvm_load_guest_fpu(struct kvm_vcpu *vcpu)
{ {
if (vcpu->guest_fpu_loaded) if (vcpu->guest_fpu_loaded)
...@@ -7070,7 +7061,6 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) ...@@ -7070,7 +7061,6 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
kvmclock_reset(vcpu); kvmclock_reset(vcpu);
free_cpumask_var(vcpu->arch.wbinvd_dirty_mask); free_cpumask_var(vcpu->arch.wbinvd_dirty_mask);
fx_free(vcpu);
kvm_x86_ops->vcpu_free(vcpu); kvm_x86_ops->vcpu_free(vcpu);
} }
...@@ -7126,7 +7116,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) ...@@ -7126,7 +7116,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
kvm_mmu_unload(vcpu); kvm_mmu_unload(vcpu);
vcpu_put(vcpu); vcpu_put(vcpu);
fx_free(vcpu);
kvm_x86_ops->vcpu_free(vcpu); kvm_x86_ops->vcpu_free(vcpu);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment