Get rid of the p_stat SZOMB state. p_stat can now only be SIDL, SSLEEP, or
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 1 Dec 2005 18:30:13 +0000 (18:30 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 1 Dec 2005 18:30:13 +0000 (18:30 +0000)
SRUN.  Instead mark zombie processes with a new flag, P_ZOMBIE.  The eproc
code will convert P_ZOMBIE into SZOMB for /bin/ps.

This further isolates the tsleep code from the process status and fixes
a panic when a process in SZOMB tried to tsleep().

Reported-by: Stefan Krueger <skrueger@meinberlikomm.de>
12 files changed:
sys/amd64/amd64/genassym.c
sys/emulation/svr4/svr4_misc.c
sys/i386/i386/genassym.c
sys/kern/kern_descrip.c
sys/kern/kern_exit.c
sys/kern/kern_proc.c
sys/kern/kern_sig.c
sys/kern/kern_synch.c
sys/kern/tty.c
sys/platform/pc32/i386/genassym.c
sys/platform/vkernel/i386/genassym.c
sys/sys/proc.h

index 706748e..fbe9869 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)genassym.c    5.11 (Berkeley) 5/10/91
  * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.86.2.3 2002/03/03 05:42:49 nyan Exp $
- * $DragonFly: src/sys/amd64/amd64/Attic/genassym.c,v 1.8 2005/11/02 22:59:39 dillon Exp $
+ * $DragonFly: src/sys/amd64/amd64/Attic/genassym.c,v 1.9 2005/12/01 18:30:11 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -100,7 +100,6 @@ ASSYM(TDPRI_INT_SUPPORT, TDPRI_INT_SUPPORT);
 
 ASSYM(SSLEEP, SSLEEP);
 ASSYM(SRUN, SRUN);
-ASSYM(SZOMB, SZOMB);
 ASSYM(V_TRAP, offsetof(struct vmmeter, v_trap));
 ASSYM(V_SYSCALL, offsetof(struct vmmeter, v_syscall));
 ASSYM(V_SENDSYS, offsetof(struct vmmeter, v_sendsys));
index 4de38e1..d68b3d4 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_misc.c,v 1.13.2.7 2003/01/14 21:33:58 dillon Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_misc.c,v 1.30 2005/11/14 18:50:01 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_misc.c,v 1.31 2005/12/01 18:30:12 dillon Exp $
  */
 
 /*
@@ -1158,11 +1158,10 @@ svr4_setinfo(p, st, s)
 
        if (p) {
                i.si_pid = p->p_pid;
-               if (p->p_stat == SZOMB) {
+               if (p->p_flag & P_ZOMBIE) {
                        i.si_stime = p->p_ru->ru_stime.tv_sec;
                        i.si_utime = p->p_ru->ru_utime.tv_sec;
-               }
-               else {
+               } else {
                        i.si_stime = p->p_stats->p_ru.ru_stime.tv_sec;
                        i.si_utime = p->p_stats->p_ru.ru_utime.tv_sec;
                }
@@ -1238,7 +1237,7 @@ loop:
                        continue;
                }
                nfound++;
-               if (q->p_stat == SZOMB && 
+               if ((q->p_flag & P_ZOMBIE) && 
                    ((SCARG(uap, options) & (SVR4_WEXITED|SVR4_WTRAPPED)))) {
                        *retval = 0;
                        DPRINTF(("found %d\n", q->p_pid));
index da20224..c30373d 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)genassym.c    5.11 (Berkeley) 5/10/91
  * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.86.2.3 2002/03/03 05:42:49 nyan Exp $
- * $DragonFly: src/sys/i386/i386/Attic/genassym.c,v 1.47 2005/11/07 20:05:51 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/genassym.c,v 1.48 2005/12/01 18:30:13 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -106,7 +106,6 @@ ASSYM(TDPRI_INT_SUPPORT, TDPRI_INT_SUPPORT);
 
 ASSYM(SSLEEP, SSLEEP);
 ASSYM(SRUN, SRUN);
-ASSYM(SZOMB, SZOMB);
 ASSYM(V_TRAP, offsetof(struct vmmeter, v_trap));
 ASSYM(V_SYSCALL, offsetof(struct vmmeter, v_syscall));
 ASSYM(V_SENDSYS, offsetof(struct vmmeter, v_sendsys));
index 22b4c99..b5d1c94 100644 (file)
@@ -70,7 +70,7 @@
  *
  *     @(#)kern_descrip.c      8.6 (Berkeley) 4/19/94
  * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.19 2004/02/28 00:43:31 tegge Exp $
- * $DragonFly: src/sys/kern/kern_descrip.c,v 1.50 2005/11/19 17:58:20 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_descrip.c,v 1.51 2005/12/01 18:30:08 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -1890,7 +1890,7 @@ sysctl_kern_file(SYSCTL_HANDLER_ARGS)
        count = 0;
        error = 0;
        LIST_FOREACH(p, &allproc, p_list) {
-               if (p->p_stat == SIDL || p->p_stat == SZOMB)
+               if (p->p_stat == SIDL || (p->p_flag & P_ZOMBIE))
                        continue;
                if (!PRISON_CHECK(req->td->td_proc->p_ucred, p->p_ucred) != 0)
                        continue;
index 6680bb9..948b95b 100644 (file)
@@ -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.49 2005/11/19 17:58:20 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_exit.c,v 1.50 2005/12/01 18:30:08 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -323,7 +323,7 @@ exit1(int rv)
         */
        LIST_REMOVE(p, p_list);
        LIST_INSERT_HEAD(&zombproc, p, p_list);
-       p->p_stat = SZOMB;
+       p->p_flag |= P_ZOMBIE;
        while (p->p_lock)
                tsleep(p, 0, "reap1", hz / 10);
        LIST_REMOVE(p, p_hash);
@@ -467,7 +467,7 @@ loop:
                }
 
                nfound++;
-               if (p->p_stat == SZOMB) {
+               if (p->p_flag & P_ZOMBIE) {
                        /*
                         * The process's thread may still be in the middle
                         * of switching away, we can't rip its stack out from
index 1a300fe..a0eefeb 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_proc.c 8.7 (Berkeley) 2/14/95
  * $FreeBSD: src/sys/kern/kern_proc.c,v 1.63.2.9 2003/05/08 07:47:16 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_proc.c,v 1.21 2005/11/14 18:50:05 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_proc.c,v 1.22 2005/12/01 18:30:08 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -312,7 +312,7 @@ fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
        LIST_FOREACH(p, &p->p_children, p_sibling)
                if ((hispgrp = p->p_pgrp) != pgrp &&
                    hispgrp->pg_session == mysession &&
-                   p->p_stat != SZOMB) {
+                   (p->p_flag & P_ZOMBIE) == 0) {
                        if (entering)
                                hispgrp->pg_jobc++;
                        else if (--hispgrp->pg_jobc == 0)
@@ -421,7 +421,8 @@ fill_eproc(struct proc *p, struct eproc *ep)
        if (p->p_procsig) {
                ep->e_procsig = *p->p_procsig;
        }
-       if (p->p_stat != SIDL && p->p_stat != SZOMB && p->p_vmspace != NULL) {
+       if (p->p_stat != SIDL && (p->p_flag & P_ZOMBIE) == 0 && 
+           p->p_vmspace != NULL) {
                struct vmspace *vm = p->p_vmspace;
                ep->e_vm = *vm;
                ep->e_vm.vm_rssize = vmspace_resident_count(vm); /*XXX*/
@@ -493,6 +494,8 @@ sysctl_out_proc(struct proc *p, struct thread *td, struct sysctl_req *req, int d
                 */
                if (p->p_stat == SSLEEP && (p->p_flag & P_STOPPED))
                        xproc.p_stat = SSTOP;
+               if (p->p_flag & P_ZOMBIE)
+                       xproc.p_stat = SZOMB;
        } else if (td) {
                fill_eproc_td(td, &eproc, &xproc);
        }
index b520329..128a398 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_sig.c  8.7 (Berkeley) 4/18/94
  * $FreeBSD: src/sys/kern/kern_sig.c,v 1.72.2.17 2003/05/16 16:34:34 obrien Exp $
- * $DragonFly: src/sys/kern/kern_sig.c,v 1.39 2005/11/14 18:50:05 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_sig.c,v 1.40 2005/12/01 18:30:08 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -628,10 +628,11 @@ killpg(int sig, int pgid, int all)
                                return (ESRCH);
                }
                LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
-                       if (p->p_pid <= 1 || p->p_flag & P_SYSTEM ||
-                           p->p_stat == SZOMB ||
-                           !CANSIGNAL(p, sig))
+                       if (p->p_pid <= 1 || 
+                           (p->p_flag & (P_SYSTEM | P_ZOMBIE)) ||
+                           !CANSIGNAL(p, sig)) {
                                continue;
+                       }
                        nfound++;
                        if (sig)
                                psignal(p, sig);
index 4e0191c..d55305a 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_synch.c        8.9 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/kern/kern_synch.c,v 1.87.2.6 2002/10/13 07:29:53 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_synch.c,v 1.54 2005/11/19 17:19:47 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.55 2005/12/01 18:30:08 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -192,7 +192,8 @@ schedcpu(void *arg)
         */
        FOREACH_PROC_IN_SYSTEM(p) {
                crit_enter();
-               if (p->p_stat == SZOMB || 
+               if (p->p_stat == SIDL || 
+                   (p->p_flag & P_ZOMBIE) ||
                    p->p_limit == NULL || 
                    p->p_thread == NULL
                ) {
index acec586..dcf6238 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)tty.c       8.8 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $
- * $DragonFly: src/sys/kern/tty.c,v 1.19 2005/11/14 18:50:05 dillon Exp $
+ * $DragonFly: src/sys/kern/tty.c,v 1.20 2005/12/01 18:30:08 dillon Exp $
  */
 
 /*-
@@ -2421,7 +2421,7 @@ ttyinfo(tp)
 
                pctcpu = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
 
-               if (pick->p_stat == SIDL || pick->p_stat == SZOMB)
+               if (pick->p_stat == SIDL || (pick->p_flag & P_ZOMBIE))
                    vmsz = 0;
                else
                    vmsz = pgtok(vmspace_resident_count(pick->p_vmspace));
@@ -2492,7 +2492,7 @@ proc_compare(p1, p2)
        /*
         * weed out zombies
         */
-       switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
+       switch (TESTAB((p1->p_flag & P_ZOMBIE), (p2->p_flag & P_ZOMBIE))) {
        case ONLYA:
                return (1);
        case ONLYB:
index 0bbffb3..17a9fd0 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)genassym.c    5.11 (Berkeley) 5/10/91
  * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.86.2.3 2002/03/03 05:42:49 nyan Exp $
- * $DragonFly: src/sys/platform/pc32/i386/genassym.c,v 1.47 2005/11/07 20:05:51 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/genassym.c,v 1.48 2005/12/01 18:30:13 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -106,7 +106,6 @@ ASSYM(TDPRI_INT_SUPPORT, TDPRI_INT_SUPPORT);
 
 ASSYM(SSLEEP, SSLEEP);
 ASSYM(SRUN, SRUN);
-ASSYM(SZOMB, SZOMB);
 ASSYM(V_TRAP, offsetof(struct vmmeter, v_trap));
 ASSYM(V_SYSCALL, offsetof(struct vmmeter, v_syscall));
 ASSYM(V_SENDSYS, offsetof(struct vmmeter, v_sendsys));
index be3e7bd..8cb8beb 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)genassym.c    5.11 (Berkeley) 5/10/91
  * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.86.2.3 2002/03/03 05:42:49 nyan Exp $
- * $DragonFly: src/sys/platform/vkernel/i386/genassym.c,v 1.47 2005/11/07 20:05:51 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/i386/genassym.c,v 1.48 2005/12/01 18:30:13 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -106,7 +106,6 @@ ASSYM(TDPRI_INT_SUPPORT, TDPRI_INT_SUPPORT);
 
 ASSYM(SSLEEP, SSLEEP);
 ASSYM(SRUN, SRUN);
-ASSYM(SZOMB, SZOMB);
 ASSYM(V_TRAP, offsetof(struct vmmeter, v_trap));
 ASSYM(V_SYSCALL, offsetof(struct vmmeter, v_syscall));
 ASSYM(V_SENDSYS, offsetof(struct vmmeter, v_sendsys));
index 1182ce4..96f3380 100644 (file)
@@ -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.72 2005/11/14 18:50:11 dillon Exp $
+ * $DragonFly: src/sys/sys/proc.h,v 1.73 2005/12/01 18:30:10 dillon Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -311,7 +311,7 @@ struct      proc {
 #define        SRUN    2               /* Currently runnable. */
 #define        SSLEEP  3               /* Sleeping on an address. */
 #define        SSTOP   4               /* Synthesized from SSLEEP + P_STOPPED */
-#define        SZOMB   5               /* Awaiting collection by parent. */
+#define        SZOMB   5               /* Synthesized from P_ZOMBIE for eproc only */
 #define STHREAD        6               /* Synthesized for eproc only */
 
 /* These flags are kept in p_flags. */
@@ -338,7 +338,7 @@ struct      proc {
 #define        P_UPCALLPEND    0x20000 /* an upcall is pending */
 
 #define        P_SWAPWAIT      0x40000 /* Waiting for a swapin */
-#define        P_UNUSED80000   0x80000
+#define        P_ZOMBIE        0x80000 /* Now in a zombied state */
 
 /* Marked a kernel thread */
 #define        P_ONRUNQ        0x100000 /* on a user scheduling run queue */