[Top] [All Lists]

Re: lazy fpu switch irrelavant to no-fpu case?

To: "Jun Sun" <>, <>
Subject: Re: lazy fpu switch irrelavant to no-fpu case?
From: "Kevin D. Kissell" <>
Date: Fri, 22 Feb 2002 10:45:14 +0100
References: <>
In the very first cut at integrating the Algorithmics
emulator with Linux, the emulator actually contained
storage that represented the FPU registers, and FP
context management was meaningful.   Using thread
context storage directly for the FPU registers was
an optimisaton that I did after I got the code running,
and I didn't bother eliminating the last_task_used_math
setup, probably  on the basis that it wasn't costing much
and that it might still be useful in some way.  I don't
think you'll break anything by getting rid of it,
but I don't think you'll fix anything either.

As I stated in another message on the subject
of SMP problems observed with the FPU
emulator, while the basic mechanisms of
FP emulation should be SMP safe, there may
well be non-SMP artifcacts in the code. A cursory
inspection shows that there is a single
mips_fpu_emulator_private data structure for the
emulator, which contains statistics which risk
being screwed up  due to non-atomic increments
being used.  That ought to be fixed, but should not
cause any user-mode-visible problems.

But I also note that the emulator uses a single
global storage location for "ieee754_csr".
The kernel port of the code does copies between
the thread context image of the MIPS csr
and this global which are manifestly SMP
unsafe.  Could the bugs you're seeing be
explainable by corruption of rounding mode
and exception state?


            Kevin K.

----- Original Message -----
From: "Jun Sun" <>
To: <>
Sent: Friday, February 22, 2002 3:48 AM
Subject: lazy fpu switch irrelavant to no-fpu case?

> It appears to me that lazy fpu switch has no relevancy to CPUs that don't
> FPU.
> If you do a scan, you will see last_task_used_math are used in four kernel
> files:
> ptrace.c
> process.c
> signal.c
> traps.c
> In the case of ptrace.c and process.c, the variable is used only when CPU
> FPU.
> In the case of traps.c (do_cpu()), it used redaundantly with another
> checking.
> In the case of signal.c, no matter what last_task_used_math is, the same
> will be executed anyway.
> Now think about it, it actually makes sense - if we don't have hardware
> why do we care of fpu context switch.
> Anyhow, the problem I am seeing with FPU/SMP case seems to be caused by
> emulation code itself, if we can assume it is not caused by fpu context
> switch.  Right now the FPU is not turned on on the box.
> The following patch cleans it up a little based on the above observation.
> Make sense?
> Jun
> diff -Nru linux/arch/mips/kernel/traps.c.orig
> --- linux/arch/mips/kernel/traps.c.orig Wed Jan 30 15:17:12 2002
> +++ linux/arch/mips/kernel/traps.c      Thu Feb 21 18:46:28 2002
> @@ -678,14 +678,11 @@
>         return;
>  fp_emul:
> -       if (last_task_used_math != current) {
> -               if (!current->used_math) {
> -                       fpu_emulator_init_fpu();
> -                       current->used_math = 1;
> -               }
> +       if (!current->used_math) {
> +               fpu_emulator_init_fpu();
> +               current->used_math = 1;
>         }
>         sig = fpu_emulator_cop1Handler(regs);
> -       last_task_used_math = current;
>         if (sig)
>                 force_sig(sig, current);
>         return;

<Prev in Thread] Current Thread [Next in Thread>