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