Messages in this thread | | | Date | Sat, 12 Jun 2004 18:28:02 +0400 | From | Sergey Vlasov <> | Subject | Re: timer + fpu stuff locks my console race |
| |
On Sat, Jun 12, 2004 at 03:57:42PM +0200, stian@nixia.no wrote: > > --- linux-2.6.6/include/asm-i386/i387.h.fp-lockup 2004-05-10 06:33:06 > > +0400 > > +++ linux-2.6.6/include/asm-i386/i387.h 2004-06-12 17:25:56 +0400 > > @@ -51,7 +51,6 @@ > > #define __clear_fpu( tsk ) \ > > do { \ > > if ((tsk)->thread_info->status & TS_USEDFPU) { \ > > - asm volatile("fwait"); \ > > (tsk)->thread_info->status &= ~TS_USEDFPU; \ > > stts(); \ > > } \ > > But what about task-switching and fpu-exceptions that comes in late? I > know that the kernel does not use FPU in general, and the places it does, > fsave, fwait and frstor embeddes it all in kernel-space.
Kernel code which uses FPU should call kernel_fpu_begin() before it and kernel_fpu_end() after. kernel_fpu_begin() is safe - it uses fnsave or fxsave, both of which don't raise pending FPU exceptions. Also fnsave performs implicit fninit, and fxsave is followed by fnclex, which clears pending exceptions.
However, raid6_before_mmx() [drivers/md/raid6x86.h] seems to be buggy:
static inline void raid6_before_mmx(raid6_mmx_save_t *s) { s->cr0 = raid6_get_fpu(); asm volatile("fsave %0 ; fwait" : "=m" (s->fsave[0])); }
fsave will raise pending exceptions (unlike fnsave). [unhandled content-type:application/pgp-signature] | |