svn commit: r289748 - in head/sys: kern sys

Ed Schouten ed at FreeBSD.org
Thu Oct 22 09:33:35 UTC 2015


Author: ed
Date: Thu Oct 22 09:33:34 2015
New Revision: 289748
URL: https://svnweb.freebsd.org/changeset/base/289748

Log:
  Add a way to distinguish between forking and thread creation in schedtail.
  
  For CloudABI we need to initialize the registers of new threads
  differently based on whether the thread got created through a fork or
  through simple thread creation.
  
  Add a flag, TDP_FORKING, that is set by do_fork() and cleared by
  fork_exit(). This can be tested against in schedtail.
  
  Reviewed by:	kib
  Differential Revision:	https://reviews.freebsd.org/D3973

Modified:
  head/sys/kern/kern_fork.c
  head/sys/kern/subr_syscall.c
  head/sys/sys/proc.h

Modified: head/sys/kern/kern_fork.c
==============================================================================
--- head/sys/kern/kern_fork.c	Thu Oct 22 09:07:53 2015	(r289747)
+++ head/sys/kern/kern_fork.c	Thu Oct 22 09:33:34 2015	(r289748)
@@ -586,7 +586,7 @@ do_fork(struct thread *td, int flags, st
 	 * been preserved.
 	 */
 	p2->p_flag |= p1->p_flag & P_SUGID;
-	td2->td_pflags |= td->td_pflags & TDP_ALTSTACK;
+	td2->td_pflags |= (td->td_pflags & TDP_ALTSTACK) | TDP_FORKING;
 	SESS_LOCK(p1->p_session);
 	if (p1->p_session->s_ttyvp != NULL && p1->p_flag & P_CONTROLT)
 		p2->p_flag |= P_CONTROLT;
@@ -1023,6 +1023,7 @@ fork_exit(void (*callout)(void *, struct
 
 	if (p->p_sysent->sv_schedtail != NULL)
 		(p->p_sysent->sv_schedtail)(td);
+	td->td_pflags &= ~TDP_FORKING;
 }
 
 /*

Modified: head/sys/kern/subr_syscall.c
==============================================================================
--- head/sys/kern/subr_syscall.c	Thu Oct 22 09:07:53 2015	(r289747)
+++ head/sys/kern/subr_syscall.c	Thu Oct 22 09:33:34 2015	(r289748)
@@ -176,6 +176,9 @@ syscallret(struct thread *td, int error,
 	struct proc *p, *p2;
 	int traced;
 
+	KASSERT((td->td_pflags & TDP_FORKING) == 0,
+	    ("fork() did not clear TDP_FORKING upon completion"));
+
 	p = td->td_proc;
 
 	/*

Modified: head/sys/sys/proc.h
==============================================================================
--- head/sys/sys/proc.h	Thu Oct 22 09:07:53 2015	(r289747)
+++ head/sys/sys/proc.h	Thu Oct 22 09:33:34 2015	(r289748)
@@ -446,7 +446,7 @@ do {									\
 #define	TDP_RESETSPUR	0x04000000 /* Reset spurious page fault history. */
 #define	TDP_NERRNO	0x08000000 /* Last errno is already in td_errno */
 #define	TDP_UIOHELD	0x10000000 /* Current uio has pages held in td_ma */
-#define	TDP_UNUSED29	0x20000000 /* --available-- */
+#define	TDP_FORKING	0x20000000 /* Thread is being created through fork() */
 #define	TDP_EXECVMSPC	0x40000000 /* Execve destroyed old vmspace */
 
 /*


More information about the svn-src-head mailing list