summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-07-07 07:03:28 -0400
committerRobert Morris <[email protected]>2019-07-07 07:03:28 -0400
commitc4f6a241cdc220dafe01bc7ca2ca7f8a253a838c (patch)
tree07baf234e50f2222c224d154758e566bf30f47de /kernel
parent7114bf43ed4bfcfd5534a2aa722c2778501ae2b3 (diff)
downloadxv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.tar.gz
xv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.tar.bz2
xv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.zip
avoid a double-lock of initproc->lock if child of init is reparenting
Diffstat (limited to 'kernel')
-rw-r--r--kernel/proc.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/proc.c b/kernel/proc.c
index 2266ca6..cfb3262 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -292,6 +292,7 @@ fork(void)
// are locked.
void reparent(struct proc *p, struct proc *parent) {
struct proc *pp;
+ int init_is_my_parent = (p->parent == initproc);
for(pp = ptable.proc; pp < &ptable.proc[NPROC]; pp++){
if (pp != p && pp != parent) {
@@ -299,9 +300,11 @@ void reparent(struct proc *p, struct proc *parent) {
if(pp->parent == p){
pp->parent = initproc;
if(pp->state == ZOMBIE) {
- acquire(&initproc->lock);
+ if(!init_is_my_parent)
+ acquire(&initproc->lock);
wakeup1(initproc);
- release(&initproc->lock);
+ if(!init_is_my_parent)
+ release(&initproc->lock);
}
}
release(&pp->lock);