From 7d447c956b87965a9edeba23f103e2a88cdf7f15 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 1 May 2003 21:16:38 +0000 Subject: [PATCH] Initialize and destroy the struct proc mutex in the proc zone's init and fini routines instead of in fork() and wait(). This has the nice side benefit that the proc lock of any process on the allproc list is always valid and sched_lock doesn't have to be used to test against PRS_NEW anymore. --- sys/kern/kern_exit.c | 1 - sys/kern/kern_fork.c | 7 +++---- sys/kern/kern_proc.c | 3 +++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 8e16d3e1885..b77c1d9cc05 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -685,7 +685,6 @@ loop: * release while still running in process context. */ vm_waitproc(p); - mtx_destroy(&p->p_mtx); #ifdef MAC mac_destroy_proc(p); #endif diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 7d2c65ca1e9..17387f8bb5c 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -447,6 +447,9 @@ again: if (pages != 0) pmap_new_altkstack(td2, pages); + PROC_LOCK(p2); + PROC_LOCK(p1); + #define RANGEOF(type, start, end) (offsetof(type, end) - offsetof(type, start)) bzero(&p2->p_startzero, @@ -458,10 +461,6 @@ again: bzero(&kg2->kg_startzero, (unsigned) RANGEOF(struct ksegrp, kg_startzero, kg_endzero)); - mtx_init(&p2->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); - PROC_LOCK(p2); - PROC_LOCK(p1); - bcopy(&p1->p_startcopy, &p2->p_startcopy, (unsigned) RANGEOF(struct proc, p_startcopy, p_endcopy)); bcopy(&td->td_startcopy, &td2->td_startcopy, diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 5ad78829474..6810537fb12 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -194,6 +194,8 @@ proc_init(void *mem, int size) ke = kse_alloc(); kg = ksegrp_alloc(); proc_linkup(p, kg, ke, td); + bzero(&p->p_mtx, sizeof(struct mtx)); + mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); } /* @@ -220,6 +222,7 @@ proc_fini(void *mem, int size) thread_free(td); ksegrp_free(kg); kse_free(ke); + mtx_destroy(&p->p_mtx); } /*