Re: PROBLEM: 2.6 kernels on x86 do not preserve FPU flags across context switches

Denis Vlasenko
2004-06-17T07:03:07Z

On Thursday 17 June 2004 00:03, Richard B. Johnson wrote:
> On Wed, 16 Jun 2004 eliot@cincom.com wrote:
> > Hi,
> >
> > I am the team lead and chief VM developer for a Smaltalk implementation
> > based on a JIT execution engine. Our customers have been seeing rare
> > incorrect floating-point results in intensive fp applications on 2.6
> > kernels using various x86 compatible processors. These problems do not
> > occur on previous kernel versons. We recently had occasion to
> > reimplement our fp primitives to avoid severe performance problems on
> > Xeon processors that were traced to Xeon's relatively slow implementation
> > of fnclex and fstsw. The older implementaton would produce a result and
> > test for a valid (non NaN, non Inf) result by examining the FPU status
> > flags via fstsw. The newer implementation produces a result and tests
> > its exponent for the NaN/Inf exponent. The new implementation does not
> > show the rare incorrect floating-point results in intensive fp
> > applications on 2.6 kernels. My conclusion is that context switches

wow. Perfect place to install debug code.
Check _both_ exponent and flags, if they disagree, yell.
That may give some useful info about cause of this.

BTW, I didn't pay attention, but some FPU-related patches
were floating around just recently. Check list archives.

> > between the production of the result and the execution of the fstsw are
> > the culprit, and that the context switch machinery fails to preserve the
> > FPU status flags.
> >
> > I don't know whether any action on your part is appropriate. The use of
> > the FPU status flags is presumably rare on linux (I believe that neither
> > gcc nor glibc make use of them). But "exotic" execution machinery such
> > as runtimes for dynamic or functional languages (language implementations
> > that may not use IEEE arithmetic and instead flag Infs and NaNs as an
> > error) may fall foul of this issue. Since previous versions of the
> > kernel on x86 apparently do preserve the FPU status flags perhaps its
> > simple to preserve the old behaviour. At the very least let me suggest
> > you document the limitation.
--
vda