Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / arch / powerpc / kernel / process.c
index ef2ad2d..cf788d7 100644 (file)
@@ -551,24 +551,6 @@ static void tm_reclaim_thread(struct thread_struct *thr,
                msr_diff &= MSR_FP | MSR_VEC | MSR_VSX | MSR_FE0 | MSR_FE1;
        }
 
-       /*
-        * Use the current MSR TM suspended bit to track if we have
-        * checkpointed state outstanding.
-        * On signal delivery, we'd normally reclaim the checkpointed
-        * state to obtain stack pointer (see:get_tm_stackpointer()).
-        * This will then directly return to userspace without going
-        * through __switch_to(). However, if the stack frame is bad,
-        * we need to exit this thread which calls __switch_to() which
-        * will again attempt to reclaim the already saved tm state.
-        * Hence we need to check that we've not already reclaimed
-        * this state.
-        * We do this using the current MSR, rather tracking it in
-        * some specific thread_struct bit, as it has the additional
-        * benifit of checking for a potential TM bad thing exception.
-        */
-       if (!MSR_TM_SUSPENDED(mfmsr()))
-               return;
-
        /*
         * Use the current MSR TM suspended bit to track if we have
         * checkpointed state outstanding.
@@ -1257,6 +1239,16 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
                current->thread.regs = regs - 1;
        }
 
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+       /*
+        * Clear any transactional state, we're exec()ing. The cause is
+        * not important as there will never be a recheckpoint so it's not
+        * user visible.
+        */
+       if (MSR_TM_SUSPENDED(mfmsr()))
+               tm_reclaim_current(0);
+#endif
+
        memset(regs->gpr, 0, sizeof(regs->gpr));
        regs->ctr = 0;
        regs->link = 0;