This is a note to let you know that I've just added the patch titled

    powerpc: Keep thread.dscr and thread.dscr_inherit in sync

to the 3.4-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     powerpc-keep-thread.dscr-and-thread.dscr_inherit-in-sync.patch
and it can be found in the queue-3.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.


>From 00ca0de02f80924dfff6b4f630e1dff3db005e35 Mon Sep 17 00:00:00 2001
From: Anton Blanchard <[email protected]>
Date: Mon, 3 Sep 2012 16:48:46 +0000
Subject: powerpc: Keep thread.dscr and thread.dscr_inherit in sync

From: Anton Blanchard <[email protected]>

commit 00ca0de02f80924dfff6b4f630e1dff3db005e35 upstream.

When we update the DSCR either via emulation of mtspr(DSCR) or via
a change to dscr_default in sysfs we don't update thread.dscr.
We will eventually update it at context switch time but there is
a period where thread.dscr is incorrect.

If we fork at this point we will copy the old value of thread.dscr
into the child. To avoid this, always keep thread.dscr in sync with
reality.

This issue was found with the following testcase:

http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c

Signed-off-by: Anton Blanchard <[email protected]>
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

---
 arch/powerpc/kernel/sysfs.c |    4 +++-
 arch/powerpc/kernel/traps.c |    3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -196,8 +196,10 @@ static ssize_t show_dscr_default(struct
 
 static void update_dscr(void *dummy)
 {
-       if (!current->thread.dscr_inherit)
+       if (!current->thread.dscr_inherit) {
+               current->thread.dscr = dscr_default;
                mtspr(SPRN_DSCR, dscr_default);
+       }
 }
 
 static ssize_t __used store_dscr_default(struct device *dev,
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -972,8 +972,9 @@ static int emulate_instruction(struct pt
                        cpu_has_feature(CPU_FTR_DSCR)) {
                PPC_WARN_EMULATED(mtdscr, regs);
                rd = (instword >> 21) & 0x1f;
-               mtspr(SPRN_DSCR, regs->gpr[rd]);
+               current->thread.dscr = regs->gpr[rd];
                current->thread.dscr_inherit = 1;
+               mtspr(SPRN_DSCR, current->thread.dscr);
                return 0;
        }
 #endif


Patches currently in stable-queue which might be from [email protected] are

queue-3.4/powerpc-update-dscr-on-all-cpus-when-writing-sysfs-dscr_default.patch
queue-3.4/powerpc-fix-dscr-inheritance-in-copy_thread.patch
queue-3.4/powerpc-restore-correct-dscr-in-context-switch.patch
queue-3.4/powerpc-keep-thread.dscr-and-thread.dscr_inherit-in-sync.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to