[SPARC]: Fix TIF_USEDFPU flag atomicity

From: William Lee Irwin III <wli@holomorphy.com>

Signed-off-by: David S. Miller <davem@davemloft.net>

authored by William Lee Irwin III and committed by David S. Miller 54f565ea c0a79b22

+11 -11
+8 -8
arch/sparc/kernel/process.c
··· 348 #ifndef CONFIG_SMP 349 if(last_task_used_math == current) { 350 #else 351 - if(current_thread_info()->flags & _TIF_USEDFPU) { 352 #endif 353 /* Keep process from leaving FPU in a bogon state. */ 354 put_psr(get_psr() | PSR_EF); ··· 357 #ifndef CONFIG_SMP 358 last_task_used_math = NULL; 359 #else 360 - current_thread_info()->flags &= ~_TIF_USEDFPU; 361 #endif 362 } 363 } ··· 371 #ifndef CONFIG_SMP 372 if(last_task_used_math == current) { 373 #else 374 - if(current_thread_info()->flags & _TIF_USEDFPU) { 375 #endif 376 /* Clean the fpu. */ 377 put_psr(get_psr() | PSR_EF); ··· 380 #ifndef CONFIG_SMP 381 last_task_used_math = NULL; 382 #else 383 - current_thread_info()->flags &= ~_TIF_USEDFPU; 384 #endif 385 } 386 ··· 466 #ifndef CONFIG_SMP 467 if(last_task_used_math == current) { 468 #else 469 - if(current_thread_info()->flags & _TIF_USEDFPU) { 470 #endif 471 put_psr(get_psr() | PSR_EF); 472 fpsave(&p->thread.float_regs[0], &p->thread.fsr, 473 &p->thread.fpqueue[0], &p->thread.fpqdepth); 474 #ifdef CONFIG_SMP 475 - current_thread_info()->flags &= ~_TIF_USEDFPU; 476 #endif 477 } 478 ··· 609 return 1; 610 } 611 #ifdef CONFIG_SMP 612 - if (current_thread_info()->flags & _TIF_USEDFPU) { 613 put_psr(get_psr() | PSR_EF); 614 fpsave(&current->thread.float_regs[0], &current->thread.fsr, 615 &current->thread.fpqueue[0], &current->thread.fpqdepth); 616 if (regs != NULL) { 617 regs->psr &= ~(PSR_EF); 618 - current_thread_info()->flags &= ~(_TIF_USEDFPU); 619 } 620 } 621 #else
··· 348 #ifndef CONFIG_SMP 349 if(last_task_used_math == current) { 350 #else 351 + if (test_thread_flag(TIF_USEDFPU)) { 352 #endif 353 /* Keep process from leaving FPU in a bogon state. */ 354 put_psr(get_psr() | PSR_EF); ··· 357 #ifndef CONFIG_SMP 358 last_task_used_math = NULL; 359 #else 360 + clear_thread_flag(TIF_USEDFPU); 361 #endif 362 } 363 } ··· 371 #ifndef CONFIG_SMP 372 if(last_task_used_math == current) { 373 #else 374 + if (test_thread_flag(TIF_USEDFPU)) { 375 #endif 376 /* Clean the fpu. */ 377 put_psr(get_psr() | PSR_EF); ··· 380 #ifndef CONFIG_SMP 381 last_task_used_math = NULL; 382 #else 383 + clear_thread_flag(TIF_USEDFPU); 384 #endif 385 } 386 ··· 466 #ifndef CONFIG_SMP 467 if(last_task_used_math == current) { 468 #else 469 + if (test_thread_flag(TIF_USEDFPU)) { 470 #endif 471 put_psr(get_psr() | PSR_EF); 472 fpsave(&p->thread.float_regs[0], &p->thread.fsr, 473 &p->thread.fpqueue[0], &p->thread.fpqdepth); 474 #ifdef CONFIG_SMP 475 + clear_thread_flag(TIF_USEDFPU); 476 #endif 477 } 478 ··· 609 return 1; 610 } 611 #ifdef CONFIG_SMP 612 + if (test_thread_flag(TIF_USEDFPU)) { 613 put_psr(get_psr() | PSR_EF); 614 fpsave(&current->thread.float_regs[0], &current->thread.fsr, 615 &current->thread.fpqueue[0], &current->thread.fpqdepth); 616 if (regs != NULL) { 617 regs->psr &= ~(PSR_EF); 618 + clear_thread_flag(TIF_USEDFPU); 619 } 620 } 621 #else
+3 -3
arch/sparc/kernel/traps.c
··· 259 } else { 260 fpload(&current->thread.float_regs[0], &current->thread.fsr); 261 } 262 - current_thread_info()->flags |= _TIF_USEDFPU; 263 #endif 264 } 265 ··· 290 #ifndef CONFIG_SMP 291 if(!fpt) { 292 #else 293 - if(!(task_thread_info(fpt)->flags & _TIF_USEDFPU)) { 294 #endif 295 fpsave(&fake_regs[0], &fake_fsr, &fake_queue[0], &fake_depth); 296 regs->psr &= ~PSR_EF; ··· 333 /* nope, better SIGFPE the offending process... */ 334 335 #ifdef CONFIG_SMP 336 - task_thread_info(fpt)->flags &= ~_TIF_USEDFPU; 337 #endif 338 if(psr & PSR_PS) { 339 /* The first fsr store/load we tried trapped,
··· 259 } else { 260 fpload(&current->thread.float_regs[0], &current->thread.fsr); 261 } 262 + set_thread_flag(TIF_USEDFPU); 263 #endif 264 } 265 ··· 290 #ifndef CONFIG_SMP 291 if(!fpt) { 292 #else 293 + if (!test_tsk_thread_flag(fpt, TIF_USEDFPU)) { 294 #endif 295 fpsave(&fake_regs[0], &fake_fsr, &fake_queue[0], &fake_depth); 296 regs->psr &= ~PSR_EF; ··· 333 /* nope, better SIGFPE the offending process... */ 334 335 #ifdef CONFIG_SMP 336 + clear_tsk_thread_flag(fpt, TIF_USEDFPU); 337 #endif 338 if(psr & PSR_PS) { 339 /* The first fsr store/load we tried trapped,