OSDN Git Service

powerpc: Remove redundant clear of MSR_VSX in __giveup_vsx()
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 16 Aug 2017 06:01:17 +0000 (16:01 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 16 Aug 2017 12:35:03 +0000 (22:35 +1000)
__giveup_fpu() already does it and we cannot have MSR_VSX set
without having MSR_FP also set.

This also adds a warning to check we indeed do

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/process.c

index 32b5864..ff522bf 100644 (file)
@@ -331,11 +331,19 @@ static inline int restore_altivec(struct task_struct *tsk) { return 0; }
 #ifdef CONFIG_VSX
 static void __giveup_vsx(struct task_struct *tsk)
 {
-       if (tsk->thread.regs->msr & MSR_FP)
+       unsigned long msr = tsk->thread.regs->msr;
+
+       /*
+        * We should never be ssetting MSR_VSX without also setting
+        * MSR_FP and MSR_VEC
+        */
+       WARN_ON((msr & MSR_VSX) && !((msr & MSR_FP) && (msr & MSR_VEC)));
+
+       /* __giveup_fpu will clear MSR_VSX */
+       if (msr & MSR_FP)
                __giveup_fpu(tsk);
-       if (tsk->thread.regs->msr & MSR_VEC)
+       if (msr & MSR_VEC)
                __giveup_altivec(tsk);
-       tsk->thread.regs->msr &= ~MSR_VSX;
 }
 
 static void giveup_vsx(struct task_struct *tsk)