x86/fpu: Remove failure paths from fpstate-alloc low level functions
authorIngo Molnar <mingo@kernel.org>
Mon, 27 Apr 2015 03:52:40 +0000 (05:52 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 19 May 2015 13:47:50 +0000 (15:47 +0200)
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: Borislav 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: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/fpu/internal.h
arch/x86/kernel/fpu/core.c
arch/x86/kernel/fpu/init.c
arch/x86/kernel/process.c
arch/x86/kvm/x86.c

index 4ce830fb3f313ed2fdf525a238f83b0dd868fcfb..9454f21f0edf6538d5ebed5ccc5a2280b45788b5 100644 (file)
@@ -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);
 
 static inline unsigned long
index 1697a9a34ff0d1eaaea3d444d0e0f577bcb42c3a..6b8d3e1b6ef889dbb024be52752deb7bcb7e783d 100644 (file)
@@ -225,34 +225,6 @@ void fpstate_init(struct fpu *fpu)
 }
 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.
  *
@@ -280,13 +252,9 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
        dst_fpu->fpregs_active = 0;
        dst_fpu->last_cpu = -1;
 
-       if (src_fpu->fpstate_active) {
-               int err = fpstate_alloc(dst_fpu);
-
-               if (err)
-                       return err;
+       if (src_fpu->fpstate_active)
                fpu_copy(dst_fpu, src_fpu);
-       }
+
        return 0;
 }
 
@@ -305,13 +273,6 @@ int fpstate_alloc_init(struct fpu *fpu)
        if (WARN_ON_ONCE(fpu->fpstate_active))
                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);
 
        /* Safe to do for the current task: */
@@ -356,13 +317,6 @@ static int fpu__unlazy_stopped(struct fpu *child_fpu)
                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);
 
        /* Safe to do for stopped child tasks: */
@@ -423,7 +377,6 @@ void fpu__clear(struct task_struct *tsk)
        if (!use_eager_fpu()) {
                /* FPU state will be reallocated lazily at the first use. */
                drop_fpu(fpu);
-               fpstate_free(fpu);
        } else {
                if (!fpu->fpstate_active) {
                        /* kthread execs. TODO: cleanup this horror. */
index 7ae5a62918c7efe784341a2ead1f406856922a0e..460e7e2c6186748363c8fbdf10eede0c5ad61a99 100644 (file)
@@ -265,6 +265,7 @@ void fpu__init_system(struct cpuinfo_x86 *c)
        fpu__init_system_generic();
        fpu__init_system_xstate_size_legacy();
        fpu__init_system_xstate();
+       setup_xstate_comp();
 
        fpu__init_system_ctx_switch();
 }
index 71f4b4d2f1fdaf2ecdc50821858084c5e5670d51..5d37c26fa89fa9f1a4e5249f26a1cc3d05565996 100644 (file)
@@ -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);
 }
 
-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..
  */
index 8bb0de5bf9c0579ae6eb6e129b244184e9c86938..68529251e8978ea7bb87aacb235c2bc56f91d602 100644 (file)
@@ -7008,10 +7008,6 @@ int fx_init(struct kvm_vcpu *vcpu)
 {
        int err;
 
-       err = fpstate_alloc(&vcpu->arch.guest_fpu);
-       if (err)
-               return err;
-
        fpstate_init(&vcpu->arch.guest_fpu);
        if (cpu_has_xsaves)
                vcpu->arch.guest_fpu.state.xsave.header.xcomp_bv =
@@ -7028,11 +7024,6 @@ int fx_init(struct kvm_vcpu *vcpu)
 }
 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)
 {
        if (vcpu->guest_fpu_loaded)
@@ -7070,7 +7061,6 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
        kvmclock_reset(vcpu);
 
        free_cpumask_var(vcpu->arch.wbinvd_dirty_mask);
-       fx_free(vcpu);
        kvm_x86_ops->vcpu_free(vcpu);
 }
 
@@ -7126,7 +7116,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
        kvm_mmu_unload(vcpu);
        vcpu_put(vcpu);
 
-       fx_free(vcpu);
        kvm_x86_ops->vcpu_free(vcpu);
 }