From cc1d939b9668c58135ad52bb434f97fa2d2b9631 Mon Sep 17 00:00:00 2001 From: Simon Schubert Date: Sun, 18 Feb 2007 16:17:09 +0000 Subject: [PATCH] 1:1 Userland threading stage 2.17/4: Consolidate consumers of p_lock to use PHOLD/PRELE. Introduce lwp_lock, which will be used like p_lock as a "don't destruct" marker. --- sys/kern/kern_exit.c | 13 +++++++++++-- sys/kern/kern_fork.c | 3 ++- sys/kern/kern_kinfo.c | 3 ++- sys/platform/pc32/i386/trap.c | 14 +++++++------- sys/platform/vkernel/i386/trap.c | 14 +++++++------- sys/sys/kinfo.h | 3 ++- sys/sys/proc.h | 11 ++++++++--- 7 files changed, 39 insertions(+), 22 deletions(-) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index db70774d03..b71abed3fa 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -37,7 +37,7 @@ * * @(#)kern_exit.c 8.7 (Berkeley) 2/12/94 * $FreeBSD: src/sys/kern/kern_exit.c,v 1.92.2.11 2003/01/13 22:51:16 dillon Exp $ - * $DragonFly: src/sys/kern/kern_exit.c,v 1.72 2007/02/18 16:15:23 corecode Exp $ + * $DragonFly: src/sys/kern/kern_exit.c,v 1.73 2007/02/18 16:17:09 corecode Exp $ */ #include "opt_compat.h" @@ -479,7 +479,9 @@ loop: * At the moment, if this occurs, we are not woken * up and rely on a one-second retry. */ - if (p->p_lock) { + while (p->p_lock || deadlp->lwp_lock) { + while (deadlp->lwp_lock) + tsleep(deadlp, 0, "reap3l", hz); while (p->p_lock) tsleep(p, 0, "reap3", hz); } @@ -548,6 +550,13 @@ loop: proc_remove_zombie(p); leavepgrp(p); + /* + * Drain all references to the last lwp. + * Not sure if this is needed, but better safe than sorry. + */ + while (deadlp->lwp_lock) + tsleep(deadlp, 0, "reapl", hz); + if (--p->p_procsig->ps_refcnt == 0) { if (p->p_sigacts != &p->p_addr->u_sigacts) FREE(p->p_sigacts, M_SUBPROC); diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 2a3068a54f..283ff3953a 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -37,7 +37,7 @@ * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 * $FreeBSD: src/sys/kern/kern_fork.c,v 1.72.2.14 2003/06/26 04:15:10 silby Exp $ - * $DragonFly: src/sys/kern/kern_fork.c,v 1.62 2007/02/16 23:11:39 corecode Exp $ + * $DragonFly: src/sys/kern/kern_fork.c,v 1.63 2007/02/18 16:17:09 corecode Exp $ */ #include "opt_ktrace.h" @@ -328,6 +328,7 @@ fork1(struct lwp *lp1, int flags, struct proc **procp) */ p2->p_flag = 0; p2->p_lock = 0; + lp2->lwp_lock = 0; if (p1->p_flag & P_PROFIL) startprofclock(p2); p2->p_ucred = crhold(p1->p_ucred); diff --git a/sys/kern/kern_kinfo.c b/sys/kern/kern_kinfo.c index c6f1669928..e62b77249d 100644 --- a/sys/kern/kern_kinfo.c +++ b/sys/kern/kern_kinfo.c @@ -32,7 +32,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/kern_kinfo.c,v 1.7 2007/02/16 23:11:39 corecode Exp $ + * $DragonFly: src/sys/kern/kern_kinfo.c,v 1.8 2007/02/18 16:17:09 corecode Exp $ */ /* @@ -153,6 +153,7 @@ fill_kinfo_lwp(struct lwp *lwp, struct kinfo_lwp *kl) kl->kl_flags = lwp->lwp_flag; kl->kl_stat = lwp->lwp_stat; + kl->kl_lock = lwp->lwp_lock; kl->kl_tdflags = lwp->lwp_thread->td_flags; #ifdef SMP kl->kl_mpcount = lwp->lwp_thread->td_mpcount; diff --git a/sys/platform/pc32/i386/trap.c b/sys/platform/pc32/i386/trap.c index 48bd63b727..0bb02fce28 100644 --- a/sys/platform/pc32/i386/trap.c +++ b/sys/platform/pc32/i386/trap.c @@ -36,7 +36,7 @@ * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $ - * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.99 2007/02/18 16:12:43 corecode Exp $ + * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.100 2007/02/18 16:17:09 corecode Exp $ */ /* @@ -949,7 +949,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) * Keep swapout from messing with us during this * critical time. */ - ++p->p_lock; + PHOLD(p); /* * Grow the stack if necessary @@ -962,7 +962,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) */ if (!grow_stack (p, va)) { rv = KERN_FAILURE; - --p->p_lock; + PRELE(p); goto nogo; } @@ -971,7 +971,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); - --p->p_lock; + PRELE(p); } else { /* * Don't have to worry about process locking or stacks in the kernel. @@ -1146,10 +1146,10 @@ trapwrite(unsigned addr) p = curproc; vm = p->p_vmspace; - ++p->p_lock; + PHOLD(p); if (!grow_stack (p, va)) { - --p->p_lock; + PRELE(p); return (1); } @@ -1158,7 +1158,7 @@ trapwrite(unsigned addr) */ rv = vm_fault(&vm->vm_map, va, VM_PROT_WRITE, VM_FAULT_DIRTY); - --p->p_lock; + PRELE(p); if (rv != KERN_SUCCESS) return 1; diff --git a/sys/platform/vkernel/i386/trap.c b/sys/platform/vkernel/i386/trap.c index 46e82adb20..53babb60da 100644 --- a/sys/platform/vkernel/i386/trap.c +++ b/sys/platform/vkernel/i386/trap.c @@ -36,7 +36,7 @@ * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $ - * $DragonFly: src/sys/platform/vkernel/i386/trap.c,v 1.18 2007/02/18 16:12:43 corecode Exp $ + * $DragonFly: src/sys/platform/vkernel/i386/trap.c,v 1.19 2007/02/18 16:17:09 corecode Exp $ */ /* @@ -884,7 +884,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) * Keep swapout from messing with us during this * critical time. */ - ++p->p_lock; + PHOLD(p); /* * Grow the stack if necessary @@ -897,7 +897,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) */ if (!grow_stack (p, va)) { rv = KERN_FAILURE; - --p->p_lock; + PRELE(p); goto nogo; } @@ -906,7 +906,7 @@ trap_pfault(struct trapframe *frame, int usermode, vm_offset_t eva) (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); - --p->p_lock; + PRELE(p); } else { /* * Don't have to worry about process locking or stacks in the kernel. @@ -1071,10 +1071,10 @@ trapwrite(unsigned addr) p = curproc; vm = p->p_vmspace; - ++p->p_lock; + PHOLD(p); if (!grow_stack (p, va)) { - --p->p_lock; + PRELE(p); return (1); } @@ -1083,7 +1083,7 @@ trapwrite(unsigned addr) */ rv = vm_fault(&vm->vm_map, va, VM_PROT_WRITE, VM_FAULT_DIRTY); - --p->p_lock; + PRELE(p); if (rv != KERN_SUCCESS) return 1; diff --git a/sys/sys/kinfo.h b/sys/sys/kinfo.h index ef6dbeeb51..dc0242b9b7 100644 --- a/sys/sys/kinfo.h +++ b/sys/sys/kinfo.h @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/sys/kinfo.h,v 1.12 2007/02/16 23:11:40 corecode Exp $ + * $DragonFly: src/sys/sys/kinfo.h,v 1.13 2007/02/18 16:17:09 corecode Exp $ */ #ifndef _SYS_KINFO_H_ @@ -112,6 +112,7 @@ struct kinfo_lwp { int kl_flags; /* LWP_ flags */ enum lwpstat kl_stat; /* LS* lwp status */ + int kl_lock; /* lwp lock (prevent destruct) count */ int kl_tdflags; /* thread flags */ int kl_mpcount; /* MP lock held count */ int kl_prio; /* scheduling priority */ diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 6f488bdb69..ce1406a111 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -37,7 +37,7 @@ * * @(#)proc.h 8.15 (Berkeley) 5/19/95 * $FreeBSD: src/sys/sys/proc.h,v 1.99.2.9 2003/06/06 20:21:32 tegge Exp $ - * $DragonFly: src/sys/sys/proc.h,v 1.97 2007/02/18 16:16:11 corecode Exp $ + * $DragonFly: src/sys/sys/proc.h,v 1.98 2007/02/18 16:17:09 corecode Exp $ */ #ifndef _SYS_PROC_H_ @@ -160,6 +160,7 @@ struct lwp { int lwp_flag; /* LWP_* flags. */ enum lwpstat lwp_stat; /* LS* lwp status. */ + int lwp_lock; /* lwp lock (prevent destruct) count */ #define lwp_startzero lwp_dupfd int lwp_dupfd; /* Sideways return value from fdopen. XXX */ @@ -266,7 +267,7 @@ struct proc { #define p_startcopy p_comm char p_comm[MAXCOMLEN+1]; /* typ 16+1 bytes */ - char p_lock; /* Process lock (prevent swap) count. */ + char p_lock; /* Process lock (prevent destruct) count. */ char p_nice; /* Process "nice" value. */ char p_pad3; @@ -398,10 +399,14 @@ extern void stopevent(struct proc*, unsigned int, unsigned int); } \ } while (0) -/* hold process U-area in memory, normally for ptrace/procfs work */ +/* hold process in memory, don't destruct , normally for ptrace/procfs work */ #define PHOLD(p) (++(p)->p_lock) #define PRELE(p) (--(p)->p_lock) +/* hold lwp in memory, don't destruct , normally for ptrace/procfs work */ +#define LWPHOLD(lp) (++(lp)->lwp_lock) +#define LWPRELE(lp) (--(lp)->lwp_lock) + #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash]) extern LIST_HEAD(pidhashhead, proc) *pidhashtbl; extern u_long pidhash; -- 2.41.0