mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-05 06:37:05 +07:00
x86/fpu: Move all the fpu__*() high level methods closer to each other
The fpu__*() methods are closely related, but they are defined in scattered places within the FPU code. Concentrate them, and also uninline fpu__save(), fpu__drop() and fpu__reset() to save about 5K of kernel text on 64-bit kernels: text data bss dec filename 14113063 2575280 1634304 18322647 vmlinux.before 14108070 2575280 1634304 18317654 vmlinux.after Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> 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>
This commit is contained in:
parent
0e75c54f17
commit
6ffc152e46
@ -46,10 +46,19 @@ extern void fpu__init_system(struct cpuinfo_x86 *c);
|
||||
|
||||
extern void fpu__activate_curr(struct fpu *fpu);
|
||||
extern void fpstate_init(struct fpu *fpu);
|
||||
extern void fpu__clear(struct task_struct *tsk);
|
||||
|
||||
extern int dump_fpu(struct pt_regs *, struct user_i387_struct *);
|
||||
|
||||
/*
|
||||
* High level FPU state handling functions:
|
||||
*/
|
||||
extern void fpu__save(struct fpu *fpu);
|
||||
extern void fpu__restore(void);
|
||||
extern void fpu__drop(struct fpu *fpu);
|
||||
extern int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu);
|
||||
extern void fpu__reset(struct fpu *fpu);
|
||||
extern void fpu__clear(struct task_struct *tsk);
|
||||
|
||||
extern void fpu__init_check_bugs(void);
|
||||
extern void fpu__resume_cpu(void);
|
||||
|
||||
@ -287,8 +296,6 @@ static inline int copy_fpregs_to_fpstate(struct fpu *fpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void fpu__save(struct fpu *fpu);
|
||||
|
||||
static inline int __copy_fpstate_to_fpregs(struct fpu *fpu)
|
||||
{
|
||||
if (use_xsave())
|
||||
@ -382,33 +389,6 @@ static inline void fpregs_deactivate(struct fpu *fpu)
|
||||
__fpregs_deactivate_hw();
|
||||
}
|
||||
|
||||
/*
|
||||
* Drops current FPU state: deactivates the fpregs and
|
||||
* the fpstate. NOTE: it still leaves previous contents
|
||||
* in the fpregs in the eager-FPU case.
|
||||
*
|
||||
* This function can be used in cases where we know that
|
||||
* a state-restore is coming: either an explicit one,
|
||||
* or a reschedule.
|
||||
*/
|
||||
static inline void fpu__drop(struct fpu *fpu)
|
||||
{
|
||||
preempt_disable();
|
||||
fpu->counter = 0;
|
||||
|
||||
if (fpu->fpregs_active) {
|
||||
/* Ignore delayed exceptions from user space */
|
||||
asm volatile("1: fwait\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE(1b, 2b));
|
||||
fpregs_deactivate(fpu);
|
||||
}
|
||||
|
||||
fpu->fpstate_active = 0;
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static inline void restore_init_xstate(void)
|
||||
{
|
||||
if (use_xsave())
|
||||
@ -417,17 +397,6 @@ static inline void restore_init_xstate(void)
|
||||
fxrstor_checking(&init_xstate_ctx.i387);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the FPU state back to init state.
|
||||
*/
|
||||
static inline void fpu__reset(struct fpu *fpu)
|
||||
{
|
||||
if (!use_eager_fpu())
|
||||
fpu__drop(fpu);
|
||||
else
|
||||
restore_init_xstate();
|
||||
}
|
||||
|
||||
/*
|
||||
* Definitions for the eXtended Control Register instructions
|
||||
*/
|
||||
@ -597,8 +566,6 @@ static inline unsigned short get_fpu_mxcsr(struct task_struct *tsk)
|
||||
}
|
||||
}
|
||||
|
||||
extern int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu);
|
||||
|
||||
static inline unsigned long
|
||||
alloc_mathframe(unsigned long sp, int ia32_frame, unsigned long *buf_fx,
|
||||
unsigned long *size)
|
||||
|
@ -348,6 +348,44 @@ void fpu__restore(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fpu__restore);
|
||||
|
||||
/*
|
||||
* Drops current FPU state: deactivates the fpregs and
|
||||
* the fpstate. NOTE: it still leaves previous contents
|
||||
* in the fpregs in the eager-FPU case.
|
||||
*
|
||||
* This function can be used in cases where we know that
|
||||
* a state-restore is coming: either an explicit one,
|
||||
* or a reschedule.
|
||||
*/
|
||||
void fpu__drop(struct fpu *fpu)
|
||||
{
|
||||
preempt_disable();
|
||||
fpu->counter = 0;
|
||||
|
||||
if (fpu->fpregs_active) {
|
||||
/* Ignore delayed exceptions from user space */
|
||||
asm volatile("1: fwait\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE(1b, 2b));
|
||||
fpregs_deactivate(fpu);
|
||||
}
|
||||
|
||||
fpu->fpstate_active = 0;
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the FPU state back to init state:
|
||||
*/
|
||||
void fpu__reset(struct fpu *fpu)
|
||||
{
|
||||
if (!use_eager_fpu())
|
||||
fpu__drop(fpu);
|
||||
else
|
||||
restore_init_xstate();
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by sys_execve() to clear the FPU fpregs, so that FPU state
|
||||
* of the previous binary does not leak over into the exec()ed binary:
|
||||
|
Loading…
Reference in New Issue
Block a user