The patch titled sLeAZY FPU feature: i386 support has been added to the -mm tree. Its filename is sleazy-fpu-feature-i386-support.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: sLeAZY FPU feature: i386 support From: Chuck Ebbert <76306.1226@xxxxxxxxxxxxxx> i386 port of the sLeAZY-fpu feature. Chuck reports that this gives him a +/- 0.4% improvement on his simple benchmark Signed-off-by: Chuck Ebbert <76306.1226@xxxxxxxxxxxxxx> Signed-off-by: Arjan van de Ven <arjan@xxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/i386/kernel/process.c | 12 ++++++++++++ arch/i386/kernel/traps.c | 3 ++- include/asm-i386/i387.h | 5 ++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff -puN arch/i386/kernel/process.c~sleazy-fpu-feature-i386-support arch/i386/kernel/process.c --- a/arch/i386/kernel/process.c~sleazy-fpu-feature-i386-support +++ a/arch/i386/kernel/process.c @@ -630,6 +630,11 @@ struct task_struct fastcall * __switch_t __unlazy_fpu(prev_p); + + /* we're going to use this soon, after a few expensive things */ + if (next_p->fpu_counter > 5) + prefetch(&next->i387.fxsave); + /* * Reload esp0. */ @@ -688,6 +693,13 @@ struct task_struct fastcall * __switch_t disable_tsc(prev_p, next_p); + /* If the task has used fpu the last 5 timeslices, just do a full + * restore of the math state immediately to avoid the trap; the + * chances of needing FPU soon are obviously high now + */ + if (next_p->fpu_counter > 5) + math_state_restore(); + return prev_p; } diff -puN arch/i386/kernel/traps.c~sleazy-fpu-feature-i386-support arch/i386/kernel/traps.c --- a/arch/i386/kernel/traps.c~sleazy-fpu-feature-i386-support +++ a/arch/i386/kernel/traps.c @@ -1060,7 +1060,7 @@ fastcall unsigned char * fixup_x86_bogus * Must be called with kernel preemption disabled (in this case, * local interrupts are disabled at the call-site in entry.S). */ -asmlinkage void math_state_restore(struct pt_regs regs) +asmlinkage void math_state_restore(void) { struct thread_info *thread = current_thread_info(); struct task_struct *tsk = thread->task; @@ -1070,6 +1070,7 @@ asmlinkage void math_state_restore(struc init_fpu(tsk); restore_fpu(tsk); thread->status |= TS_USEDFPU; /* So we fnsave on switch_to() */ + tsk->fpu_counter++; } #ifndef CONFIG_MATH_EMULATION diff -puN include/asm-i386/i387.h~sleazy-fpu-feature-i386-support include/asm-i386/i387.h --- a/include/asm-i386/i387.h~sleazy-fpu-feature-i386-support +++ a/include/asm-i386/i387.h @@ -76,7 +76,9 @@ static inline void __save_init_fpu( stru #define __unlazy_fpu( tsk ) do { \ if (task_thread_info(tsk)->status & TS_USEDFPU) \ - save_init_fpu( tsk ); \ + save_init_fpu( tsk ); \ + else \ + tsk->fpu_counter = 0; \ } while (0) #define __clear_fpu( tsk ) \ @@ -118,6 +120,7 @@ static inline void save_init_fpu( struct extern unsigned short get_fpu_cwd( struct task_struct *tsk ); extern unsigned short get_fpu_swd( struct task_struct *tsk ); extern unsigned short get_fpu_mxcsr( struct task_struct *tsk ); +extern asmlinkage void math_state_restore(void); /* * Signal frame handlers... _ Patches currently in -mm which might be from 76306.1226@xxxxxxxxxxxxxx are origin.patch i386-print-stack-size-in-oops-messages.patch sleazy-fpu-feature-i386-support.patch binfmt_elf-fix-checks-for-bad-address.patch binfmt_elf-fix-checks-for-bad-address-fix.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html