Date: Fri, 12 Oct 2007 11:55:34 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 127424 for review Message-ID: <200710121155.l9CBtY79023689@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=127424 Change 127424 by zec@zec_tpx32 on 2007/10/12 11:55:17 Allow for a process in parent vprocg waiting for a child proc executing in a child vprocg context to be woken up when the child proc exits. Affected files ... .. //depot/projects/vimage/src/sys/kern/kern_exit.c#8 edit .. //depot/projects/vimage/src/sys/kern/kern_prot.c#5 edit .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#40 edit .. //depot/projects/vimage/src/sys/kern/sched_4bsd.c#13 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#41 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/kern_exit.c#8 (text+ko) ==== @@ -176,13 +176,8 @@ ("exit1: proc %p exiting with %d threads", p, p->p_numthreads)); #ifdef VIMAGE - /* - * Switch back to vprocg of our parent so we can deliver - * signals, otherwise we won't die - why?!? XXX - * - * XXX is PROC_UNLOCK()/PROC_LOCK() sequence safe here? - */ - if (p->p_pptr && p->p_ucred->cr_vimage->v_procg != + /* XXX is PROC_UNLOCK()/PROC_LOCK() sequence safe here? */ + if (p->p_ucred->cr_vimage->v_procg != p->p_pptr->p_ucred->cr_vimage->v_procg) { struct ucred *oldcred; @@ -190,12 +185,12 @@ crhold(p->p_pptr->p_ucred); oldcred = p->p_ucred; p->p_ucred = p->p_pptr->p_ucred; + PROC_UNLOCK(p); + sx_xlock(&allproc_lock); #ifdef SCHED_4BSD sched_load_reassign(oldcred->cr_vimage->v_procg, p->p_ucred->cr_vimage->v_procg); #endif - PROC_UNLOCK(p); - sx_xlock(&allproc_lock); oldcred->cr_vimage->v_procg->nprocs--; p->p_ucred->cr_vimage->v_procg->nprocs++; sx_xunlock(&allproc_lock); ==== //depot/projects/vimage/src/sys/kern/kern_prot.c#5 (text+ko) ==== @@ -46,6 +46,7 @@ #include "opt_compat.h" #include "opt_mac.h" +#include "opt_vimage.h" #include <sys/param.h> #include <sys/systm.h> @@ -67,6 +68,7 @@ #include <sys/socketvar.h> #include <sys/syscallsubr.h> #include <sys/sysctl.h> +#include <sys/vimage.h> #include <security/audit/audit.h> #include <security/mac/mac_framework.h> @@ -1720,6 +1722,9 @@ KASSERT(td == curthread, ("%s: td not curthread", __func__)); PROC_LOCK_ASSERT(p, MA_OWNED); +#ifdef VIMAGE + if (!vi_child_of(td->td_ucred->cr_vimage, p->p_ucred->cr_vimage)) +#endif if ((error = prison_check(td->td_ucred, p->p_ucred))) return (error); #ifdef MAC ==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#40 (text+ko) ==== @@ -67,7 +67,6 @@ static void vnet_mod_complete_registration(struct vnet_modlink *); static int vnet_mod_constructor(struct vnet_modlink *); static int vnet_mod_destructor(struct vnet_modlink *); -static int vi_child_of(struct vimage *, struct vimage *); #ifdef VI_PREALLOC_SIZE /* @@ -517,7 +516,7 @@ /* * XXX priv_check()? * XXX refcounting ucred -> vimage ? - * XXX change ucred for proc or thread, or both? + * XXX allow only a single td per proc here? */ newcred = crget(); PROC_LOCK(p); ==== //depot/projects/vimage/src/sys/kern/sched_4bsd.c#13 (text+ko) ==== @@ -239,7 +239,7 @@ INIT_VPROCG(td->td_ucred->cr_vimage->v_procg); V_sched_tdcnt++; - CTR1(KTR_SCHED, "global load: %d", sched_tdcnt); + CTR1(KTR_SCHED, "global load: %d", V_sched_tdcnt); } static __inline void @@ -248,7 +248,7 @@ INIT_VPROCG(td->td_ucred->cr_vimage->v_procg); V_sched_tdcnt--; - CTR1(KTR_SCHED, "global load: %d", sched_tdcnt); + CTR1(KTR_SCHED, "global load: %d", V_sched_tdcnt); } #ifdef VIMAGE @@ -1361,19 +1361,15 @@ thread_unlock(td); } +int #ifdef VIMAGE -int sched_load(struct vprocg *vprocg) -{ - return (V_sched_tdcnt); -} #else -int sched_load(void) +#endif { - return (sched_tdcnt); + return (V_sched_tdcnt); } -#endif int sched_sizeof_proc(void) ==== //depot/projects/vimage/src/sys/sys/vimage.h#41 (text+ko) ==== @@ -318,6 +318,7 @@ int vi_symlookup(struct kld_sym_lookup *, char *); struct vimage *vnet2vimage(struct vnet *); char *vnet_name(struct vnet *); +int vi_child_of(struct vimage *, struct vimage *); LIST_HEAD(vimage_list_head, vimage); extern struct vimage_list_head vimage_head;help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200710121155.l9CBtY79023689>
