powerpc: Keep thread.dscr and thread.dscr_inherit in sync Back-port upstream commit 00ca0de02f80924dfff6b4f630e1dff3db005e35 for 3.0 stable kernel
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]> Cc: <stable at kernel.org> # 3.0+ Signed-off-by: Haren Myneni <[email protected]> diff -Naur linux.orig/arch/powerpc/kernel/sysfs.c linux/arch/powerpc/kernel/sysfs.c --- linux.orig/arch/powerpc/kernel/sysfs.c 2012-10-01 23:23:43.494744866 -0400 +++ linux/arch/powerpc/kernel/sysfs.c 2012-10-01 23:26:05.174747313 -0400 @@ -194,8 +194,10 @@ 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 sysdev_class *class, diff -Naur linux.orig/arch/powerpc/kernel/traps.c linux/arch/powerpc/kernel/traps.c --- linux.orig/arch/powerpc/kernel/traps.c 2012-10-01 23:24:23.734745593 -0400 +++ linux/arch/powerpc/kernel/traps.c 2012-10-01 23:27:23.294748477 -0400 @@ -935,8 +935,9 @@ 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 -- 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
