xtensa: don't clear cpenable unconditionally on release
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 27 Nov 2018 00:30:51 +0000 (16:30 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Tue, 4 Dec 2018 22:08:23 +0000 (14:08 -0800)
Clearing cpenable special register for a task without changing
coprocessor owner for the coprocessors that were enabled will result in
coprocessor context flush and immediate reload at the next attempt to
access this coprocessor if it happens before the context switch.
Avoid it by only clearing cpenable special register if
coprocessor_release_all is called for the current task.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/kernel/process.c

index be9e0c3df9d2ded06874e2e0a64152d73124ba69..27be75e88ed35fef5a36ef800436390fe3c41bee 100644 (file)
@@ -87,7 +87,8 @@ void coprocessor_release_all(struct thread_info *ti)
        }
 
        ti->cpenable = cpenable;
-       xtensa_set_sr(0, cpenable);
+       if (ti == current_thread_info())
+               xtensa_set_sr(0, cpenable);
 
        preempt_enable();
 }