PERFORCE change 113083 for review
Roman Divacky
rdivacky at FreeBSD.org
Wed Jan 17 22:45:42 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=113083
Change 113083 by rdivacky at rdivacky_witten on 2007/01/17 22:45:02
Dont expose em via p->p_emuldata until its properly initialized.
This also enables us to get rid of some locking and simplify the
code because we are workin on a local copy.
Affected files ...
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#22 edit
Differences ...
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#22 (text+ko) ====
@@ -97,14 +97,9 @@
LIST_INIT(&s->threads);
em->shared = s;
}
- p = pfind(child);
- KASSERT(p != NULL, ("process not found in proc_init\n"));
- p->p_emuldata = em;
- PROC_UNLOCK(p);
- EMUL_LOCK(&emul_lock);
} else {
/* lookup the old one */
- em = em_find(td->td_proc, EMUL_DOLOCK);
+ em = em_find(td->td_proc, EMUL_DONTLOCK);
KASSERT(em != NULL, ("proc_init: emuldata not found in exec case.\n"));
}
@@ -120,11 +115,12 @@
if (flags & CLONE_THREAD) {
/* lookup the parent */
EMUL_SHARED_WLOCK(&emul_shared_lock);
- p_em = em_find(td->td_proc, EMUL_DONTLOCK);
+ p_em = em_find(td->td_proc, EMUL_DOLOCK);
KASSERT(p_em != NULL, ("proc_init: parent emuldata not found for CLONE_THREAD\n"));
em->shared = p_em->shared;
em->shared->refs++;
EMUL_SHARED_WUNLOCK(&emul_shared_lock);
+ EMUL_UNLOCK(&emul_lock);
} else {
/*
* handled earlier to avoid malloc(M_WAITOK) with
@@ -133,17 +129,17 @@
}
}
if (child != 0) {
- EMUL_UNLOCK(&emul_lock);
EMUL_SHARED_WLOCK(&emul_shared_lock);
LIST_INSERT_HEAD(&em->shared->threads, em, threads);
EMUL_SHARED_WUNLOCK(&emul_shared_lock);
p = pfind(child);
+ KASSERT(p != NULL, ("process not found in proc_init\n"));
+ p->p_emuldata = em;
/* we might have a sleeping linux_schedtail */
wakeup(&p->p_emuldata);
PROC_UNLOCK(p);
- } else
- EMUL_UNLOCK(&emul_lock);
+ }
return (0);
}
More information about the p4-projects
mailing list