[RFC PATCH 11/12] [WIP] powerpc/tm: Afterthoughts
Cyril Bur
cyrilbur at gmail.com
Tue Feb 20 11:22:40 AEDT 2018
---
arch/powerpc/kernel/process.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 674f75c56172..6ce41ee62b24 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1079,6 +1079,12 @@ static inline void __switch_to_tm(struct task_struct *prev,
if (!MSR_TM_ACTIVE(prev->thread.regs->msr) && prev->thread.load_tm == 0)
prev->thread.regs->msr &= ~MSR_TM;
}
+
+ /*
+ * Now that we're reclaiming on kernel entry, we should never
+ * get here still with user checkpointed state on the CPU
+ */
+ BUG_ON(MSR_TM_ACTIVE(mfmsr()));
}
/*
@@ -1326,7 +1332,17 @@ struct task_struct *__switch_to(struct task_struct *prev,
}
if (current_thread_info()->task->thread.regs) {
- restore_math(current_thread_info()->task->thread.regs);
+ /*
+ * Calling this now has reloaded the live state, which
+ * gets overwritten with the checkpointed state right
+ * before the trecheckpoint. BUT the MSR still has
+ * that the live state is on the CPU, which it isn't.
+ *
+ * restore_math(current_thread_info()->task->thread.regs);
+ * Therefore:
+ */
+ if (!MSR_TM_ACTIVE(current_thread_info()->task->thread.regs->msr))
+ restore_math(current_thread_info()->task->thread.regs);
/*
* The copy-paste buffer can only store into foreign real
--
2.16.2
More information about the Linuxppc-dev
mailing list