From owner-p4-projects@FreeBSD.ORG Wed Jan 17 22:45:41 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C2B2A16A492; Wed, 17 Jan 2007 22:45:41 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 9C18E16A40F for ; Wed, 17 Jan 2007 22:45:41 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 8D81B13C44C for ; Wed, 17 Jan 2007 22:45:41 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0HMjfsI077822 for ; Wed, 17 Jan 2007 22:45:41 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0HMjfuE077819 for perforce@freebsd.org; Wed, 17 Jan 2007 22:45:41 GMT (envelope-from rdivacky@FreeBSD.org) Date: Wed, 17 Jan 2007 22:45:41 GMT Message-Id: <200701172245.l0HMjfuE077819@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 113083 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Jan 2007 22:45:42 -0000 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); }