Browse Source

sparc64: Fix accidental syscall restart on child return from clone/fork/vfork.

This fixes a regression added by
238468b2ac76020c192a7402c92df5097916bf4a ("[SPARC64]: Use trap type
stored in pt_regs to handle syscall restart.")

Because we now encode the "returning from syscall" status in the
pt_regs area, we have to be mindful to zap it out in the child
of a fork.

During a parallel kernel build I saw an accidental -EINTR return
from vfork() in 'make' because of this bug.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 17 years ago
parent
commit
fd7354108a
1 changed files with 6 additions and 0 deletions
  1. 6 0
      arch/sparc64/kernel/process.c

+ 6 - 0
arch/sparc64/kernel/process.c

@@ -591,6 +591,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
 	if (clone_flags & CLONE_SETTLS)
 		t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3];
 
+	/* We do not want to accidently trigger system call restart
+	 * handling in the new thread.  Therefore, clear out the trap
+	 * type, which will make pt_regs_regs_is_syscall() return false.
+	 */
+	pt_regs_clear_trap_type(t->kregs);
+
 	return 0;
 }