MIPS: Loongson: Fix COP2 usage for preemptible kernel
In preemptible kernel, only TIF_USEDFPU flag is reliable to distinguish whether _init_fpu()/_restore_fp() is needed. Because the value of the CP0_Status.CU1 isn't changed during preemption. V2: Fix coding style. Signed-off-by: Huacai Chen <chenhc@lemote.com> Cc: John Crispin <john@phrozen.org> Cc: Steven J. Hill <Steven.Hill@imgtec.com> Cc: Aurelien Jarno <aurelien@aurel32.net> Cc: linux-mips@linux-mips.org Cc: Fuxin Zhang <zhangfx@lemote.com> Cc: Zhangjin Wu <wuzhangjin@gmail.com> Patchwork: https://patchwork.linux-mips.org/patch/7515/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Родитель
bbbf6d8768
Коммит
bfcdf13063
|
@ -22,13 +22,13 @@
|
|||
static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
|
||||
void *data)
|
||||
{
|
||||
int fpu_enabled;
|
||||
int fpu_owned;
|
||||
int fr = !test_thread_flag(TIF_32BIT_FPREGS);
|
||||
|
||||
switch (action) {
|
||||
case CU2_EXCEPTION:
|
||||
preempt_disable();
|
||||
fpu_enabled = read_c0_status() & ST0_CU1;
|
||||
fpu_owned = __is_fpu_owner();
|
||||
if (!fr)
|
||||
set_c0_status(ST0_CU1 | ST0_CU2);
|
||||
else
|
||||
|
@ -39,8 +39,8 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
|
|||
KSTK_STATUS(current) |= ST0_FR;
|
||||
else
|
||||
KSTK_STATUS(current) &= ~ST0_FR;
|
||||
/* If FPU is enabled, we needn't init or restore fp */
|
||||
if(!fpu_enabled) {
|
||||
/* If FPU is owned, we needn't init or restore fp */
|
||||
if (!fpu_owned) {
|
||||
set_thread_flag(TIF_USEDFPU);
|
||||
if (!used_math()) {
|
||||
_init_fpu();
|
||||
|
|
Загрузка…
Ссылка в новой задаче