On Sat, 25 Nov 2006 00:03:44 +0900 (JST), Atsushi Nemoto <anemo@xxxxxxxxxxxxx> wrote: > If we had already lost FPU before disabling preempt, we do not have to > own it at all. And we do not prevent preemption when managing saved > FCR31 if we did not have FPU ownership. > > Signed-off-by: Atsushi Nemoto <anemo@xxxxxxxxxxxxx> > --- > traps.c | 22 ++++++++-------------- > 1 files changed, 8 insertions(+), 14 deletions(-) Ping. This patch is dependent from other fp_context patches and should be safe and harmless. Are there any problems? diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 9fda1b8..b18aeb6 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -614,16 +614,6 @@ asmlinkage void do_fpe(struct pt_regs *r if (fcr31 & FPU_CSR_UNI_X) { int sig; - preempt_disable(); - -#ifdef CONFIG_PREEMPT - if (!is_fpu_owner()) { - /* We might lose fpu before disabling preempt... */ - own_fpu(); - BUG_ON(!used_math()); - restore_fp(current); - } -#endif /* * Unimplemented operation exception. If we've got the full * software emulator on-board, let's use it... @@ -634,7 +624,11 @@ #endif * register operands before invoking the emulator, which seems * a bit extreme for what should be an infrequent event. */ - save_fp(current); + preempt_disable(); + + /* We might have lost fpu before disabling preempt... */ + if (is_fpu_owner()) + save_fp(current); /* Ensure 'resume' not overwrite saved fp context again. */ lose_fpu(); @@ -643,15 +637,15 @@ #endif /* Run the emulator */ sig = fpu_emulator_cop1Handler (regs, ¤t->thread.fpu, 1); - preempt_disable(); - - own_fpu(); /* Using the FPU again. */ /* * We can't allow the emulated instruction to leave any of * the cause bit set in $fcr31. */ current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X; + preempt_disable(); + + own_fpu(); /* Using the FPU again. */ /* Restore the hardware register state */ restore_fp(current);