summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_exit.c1
-rw-r--r--sys/kern/kern_fork.c7
-rw-r--r--sys/kern/kern_proc.c3
3 files changed, 6 insertions, 5 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 8e16d3e..b77c1d9 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 7d2c65c..17387f8 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 5ad7882..6810537 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);
}
/*
OpenPOWER on IntegriCloud