linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Cyril Bur <cyrilbur@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: wei.guo.simon@gmail.com, mikey@neuling.org
Subject: [PATCH v4 05/20] powerpc: Never giveup a reclaimed thread when enabling kernel {fp, altivec, vsx}
Date: Tue,  6 Sep 2016 09:44:33 +1000	[thread overview]
Message-ID: <20160905234448.5866-6-cyrilbur@gmail.com> (raw)
In-Reply-To: <20160905234448.5866-1-cyrilbur@gmail.com>

After a thread is reclaimed from its active or suspended transactional
state the checkpointed state exists on CPU, this state (along with the
live/transactional state) has been saved in its entirety by the
reclaiming process.

There exists a sequence of events that would cause the kernel to call
one of enable_kernel_fp(), enable_kernel_altivec() or
enable_kernel_vsx() after a thread has been reclaimed. These functions
save away any user state on the CPU so that the kernel can use the
registers. Not only is this saving away unnecessary at this point, it
is actually incorrect. It causes a save of the checkpointed state to
the live structures within the thread struct thus destroying the true
live state for that thread.

Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
---
 arch/powerpc/kernel/process.c | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index c42581b..432884c 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -204,12 +204,23 @@ EXPORT_SYMBOL_GPL(flush_fp_to_thread);
 
 void enable_kernel_fp(void)
 {
+	unsigned long cpumsr;
+
 	WARN_ON(preemptible());
 
-	msr_check_and_set(MSR_FP);
+	cpumsr = msr_check_and_set(MSR_FP);
 
 	if (current->thread.regs && (current->thread.regs->msr & MSR_FP)) {
 		check_if_tm_restore_required(current);
+		/*
+		 * If a thread has already been reclaimed then the
+		 * checkpointed registers are on the CPU but have definitely
+		 * been saved by the reclaim code. Don't need to and *cannot*
+		 * giveup as this would save  to the 'live' structure not the
+		 * checkpointed structure.
+		 */
+		if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr))
+			return;
 		__giveup_fpu(current);
 	}
 }
@@ -256,12 +267,23 @@ EXPORT_SYMBOL(giveup_altivec);
 
 void enable_kernel_altivec(void)
 {
+	unsigned long cpumsr;
+
 	WARN_ON(preemptible());
 
-	msr_check_and_set(MSR_VEC);
+	cpumsr = msr_check_and_set(MSR_VEC);
 
 	if (current->thread.regs && (current->thread.regs->msr & MSR_VEC)) {
 		check_if_tm_restore_required(current);
+		/*
+		 * If a thread has already been reclaimed then the
+		 * checkpointed registers are on the CPU but have definitely
+		 * been saved by the reclaim code. Don't need to and *cannot*
+		 * giveup as this would save  to the 'live' structure not the
+		 * checkpointed structure.
+		 */
+		if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr))
+			return;
 		__giveup_altivec(current);
 	}
 }
@@ -330,12 +352,23 @@ static void save_vsx(struct task_struct *tsk)
 
 void enable_kernel_vsx(void)
 {
+	unsigned long cpumsr;
+
 	WARN_ON(preemptible());
 
-	msr_check_and_set(MSR_FP|MSR_VEC|MSR_VSX);
+	cpumsr = msr_check_and_set(MSR_FP|MSR_VEC|MSR_VSX);
 
 	if (current->thread.regs && (current->thread.regs->msr & MSR_VSX)) {
 		check_if_tm_restore_required(current);
+		/*
+		 * If a thread has already been reclaimed then the
+		 * checkpointed registers are on the CPU but have definitely
+		 * been saved by the reclaim code. Don't need to and *cannot*
+		 * giveup as this would save  to the 'live' structure not the
+		 * checkpointed structure.
+		 */
+		if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr))
+			return;
 		if (current->thread.regs->msr & MSR_FP)
 			__giveup_fpu(current);
 		if (current->thread.regs->msr & MSR_VEC)
-- 
2.9.3

  parent reply	other threads:[~2016-09-05 23:45 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-05 23:44 [PATCH v4 00/20] Consistent TM structures Cyril Bur
2016-09-05 23:44 ` [PATCH v4 01/20] selftests/powerpc: Compile selftests against headers without AT_HWCAP2 Cyril Bur
2016-09-05 23:44 ` [PATCH v4 02/20] powerpc: Always restore FPU/VEC/VSX if hardware transactional memory in use Cyril Bur
2016-09-05 23:44 ` [PATCH v4 03/20] powerpc: Add check_if_tm_restore_required() to giveup_all() Cyril Bur
2016-09-05 23:44 ` [PATCH v4 04/20] powerpc: Return the new MSR from msr_check_and_set() Cyril Bur
2016-09-05 23:44 ` Cyril Bur [this message]
2016-09-05 23:44 ` [PATCH v4 06/20] powerpc: signals: Stop using current in signal code Cyril Bur
2016-09-05 23:44 ` [PATCH v4 07/20] selftests/powerpc: Check for VSX preservation across userspace preemption Cyril Bur
2016-09-05 23:44 ` [PATCH v4 08/20] selftests/powerpc: Rework FPU stack placement macros and move to header file Cyril Bur
2016-09-05 23:44 ` [PATCH v4 09/20] selftests/powerpc: Move VMX stack frame macros " Cyril Bur
2016-09-05 23:44 ` [PATCH v4 10/20] selftests/powerpc: Introduce GPR asm helper " Cyril Bur
2016-09-05 23:44 ` [PATCH v4 11/20] selftests/powerpc: Allow tests to extend their kill timeout Cyril Bur
2016-09-05 23:44 ` [PATCH v4 12/20] selftests/powerpc: Add TM tcheck helpers in C Cyril Bur
2016-09-05 23:44 ` [PATCH v4 13/20] selftests/powerpc: Check that signals always get delivered Cyril Bur
2016-09-05 23:44 ` [PATCH v4 14/20] selftests/powerpc: Add checks for transactional GPRs in signal contexts Cyril Bur
2016-09-05 23:44 ` [PATCH v4 15/20] selftests/powerpc: Add checks for transactional FPUs " Cyril Bur
2016-09-05 23:44 ` [PATCH v4 16/20] selftests/powerpc: Add checks for transactional VMXs " Cyril Bur
2016-09-05 23:44 ` [PATCH v4 17/20] selftests/powerpc: Add checks for transactional VSXs " Cyril Bur
2016-09-05 23:44 ` [PATCH v4 18/20] powerpc: tm: Always use fp_state and vr_state to store live registers Cyril Bur
2016-09-05 23:44 ` [PATCH v4 19/20] powerpc: tm: Rename transct_(*) to ck(\1)_state Cyril Bur
2016-09-05 23:44 ` [PATCH v4 20/20] powerpc: Remove do_load_up_transact_{fpu,altivec} Cyril Bur

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160905234448.5866-6-cyrilbur@gmail.com \
    --to=cyrilbur@gmail.com \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mikey@neuling.org \
    --cc=wei.guo.simon@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).