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