Date: Wed, 17 Jan 2007 22:45:41 GMT From: Roman Divacky <rdivacky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 113083 for review Message-ID: <200701172245.l0HMjfuE077819@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113083 Change 113083 by rdivacky@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701172245.l0HMjfuE077819>