aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2012-09-03 16:49:47 +0000
committerBen Hutchings <ben@decadent.org.uk>2012-09-19 15:04:41 +0100
commitea1862390d3fa57b1b0eca2c445f25a98e02fc7d (patch)
treec4f876dc890c4eded6a4f6a9143b8167799bb295
parent5f31a641ff0e76081cf4ae1f72799cd59c20baea (diff)
downloadkernel_samsung_smdk4412-ea1862390d3fa57b1b0eca2c445f25a98e02fc7d.zip
kernel_samsung_smdk4412-ea1862390d3fa57b1b0eca2c445f25a98e02fc7d.tar.gz
kernel_samsung_smdk4412-ea1862390d3fa57b1b0eca2c445f25a98e02fc7d.tar.bz2
powerpc: Fix DSCR inheritance in copy_thread()
commit 1021cb268b3025573c4811f1dee4a11260c4507b upstream. If the default DSCR is non zero we set thread.dscr_inherit in copy_thread() meaning the new thread and all its children will ignore future updates to the default DSCR. This is not intended and is a change in behaviour that a number of our users have hit. We just need to inherit thread.dscr and thread.dscr_inherit from the parent which ends up being much simpler. This was found with the following test case: http://ozlabs.org/~anton/junkcode/dscr_default_test.c Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--arch/powerpc/kernel/process.c12
1 files changed, 2 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 6457574..d687e3f 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -778,16 +778,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
#endif /* CONFIG_PPC_STD_MMU_64 */
#ifdef CONFIG_PPC64
if (cpu_has_feature(CPU_FTR_DSCR)) {
- if (current->thread.dscr_inherit) {
- p->thread.dscr_inherit = 1;
- p->thread.dscr = current->thread.dscr;
- } else if (0 != dscr_default) {
- p->thread.dscr_inherit = 1;
- p->thread.dscr = dscr_default;
- } else {
- p->thread.dscr_inherit = 0;
- p->thread.dscr = 0;
- }
+ p->thread.dscr_inherit = current->thread.dscr_inherit;
+ p->thread.dscr = current->thread.dscr;
}
#endif