1:1 Userland threading stage 2.18/4:
authorSimon Schubert <corecode@dragonflybsd.org>
Mon, 19 Feb 2007 01:14:24 +0000 (01:14 +0000)
committerSimon Schubert <corecode@dragonflybsd.org>
Mon, 19 Feb 2007 01:14:24 +0000 (01:14 +0000)
Push lwp use a bit further by making some places lwp aware.
This commit deals with ddb, procfs/ptrace and various consumers of
allproc_scan.

23 files changed:
sys/ddb/db_ps.c
sys/emulation/linux/i386/linux_ptrace.c
sys/kern/kern_proc.c
sys/kern/kern_synch.c
sys/kern/sys_process.c
sys/platform/pc32/i386/procfs_machdep.c
sys/platform/vkernel/i386/procfs_machdep.c
sys/sys/proc.h
sys/vfs/procfs/procfs.h
sys/vfs/procfs/procfs_ctl.c
sys/vfs/procfs/procfs_dbregs.c
sys/vfs/procfs/procfs_fpregs.c
sys/vfs/procfs/procfs_map.c
sys/vfs/procfs/procfs_mem.c
sys/vfs/procfs/procfs_note.c
sys/vfs/procfs/procfs_regs.c
sys/vfs/procfs/procfs_rlimit.c
sys/vfs/procfs/procfs_status.c
sys/vfs/procfs/procfs_subr.c
sys/vfs/procfs/procfs_type.c
sys/vfs/procfs/procfs_vnops.c
sys/vm/vm_glue.c
sys/vm/vm_meter.c

index ec6cfe1..b43cf21 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ddb/db_ps.c,v 1.20 1999/08/28 00:41:09 peter Exp $
- * $DragonFly: src/sys/ddb/db_ps.c,v 1.21 2007/02/03 17:05:57 corecode Exp $
+ * $DragonFly: src/sys/ddb/db_ps.c,v 1.22 2007/02/19 01:14:23 corecode Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -57,11 +57,12 @@ db_ps(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
                p = allproc.lh_first;
        else
                p = &proc0;
+       lp = FIRST_LWP_IN_PROC(p);
 
        if (db_more(&nl) < 0)
            return;
-       db_printf("  pid   proc     uid  ppid  pgrp  flag stat wmesg   wchan   cmd\n");
-       while (--np >= 0) {
+       db_printf("  pid      lwp  uid  ppid  pgrp  pflag  lflag stat  wmesg    wchan cmd\n");
+       for (;;) {
                /*
                 * XXX just take 20 for now...
                 */
@@ -75,15 +76,13 @@ db_ps(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
                if (pp == NULL)
                        pp = p;
 
-               /* XXX lwp */
-               lp = FIRST_LWP_IN_PROC(p);
-               db_printf("%5d %8p %8p %4d %5d %5d %06x  %d",
-                   p->p_pid, (volatile void *)p,
-                   (void *)lp->lwp_thread->td_pcb,
+               db_printf("%5d %8p %4d %5d %5d %06x %06x  %d %d",
+                   p->p_pid, (volatile void *)lp,
                    p->p_ucred ? p->p_ucred->cr_ruid : 0, pp->p_pid,
-                   p->p_pgrp ? p->p_pgrp->pg_id : 0, p->p_flag, p->p_stat);
+                   p->p_pgrp ? p->p_pgrp->pg_id : 0, p->p_flag,
+                   lp->lwp_flag, p->p_stat, lp->lwp_stat);
                if (lp->lwp_wchan) {
-                       db_printf("  %6s %8p", lp->lwp_wmesg,
+                       db_printf(" %6s %8p", lp->lwp_wmesg,
                            (void *)lp->lwp_wchan);
                } else {
                        db_printf("                 ");
@@ -91,9 +90,16 @@ db_ps(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
                db_printf(" %s\n", p->p_comm ? p->p_comm : "");
                db_dump_td_tokens(lp->lwp_thread);
 
-               p = p->p_list.le_next;
-               if (p == NULL && np > 0)
-                       p = zombproc.lh_first;
+               lp = LIST_NEXT(lp, lwp_list);
+               if (lp == NULL) {
+                       --np;
+                       p = p->p_list.le_next;
+                       if (p == NULL && np > 0)
+                               p = zombproc.lh_first;
+                       if (p == NULL)
+                               break;
+                       lp = FIRST_LWP_IN_PROC(p);
+               }
        }
 
        /*
index b3e0422..97844fe 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/linux/linux_ptrace.c,v 1.7.4.3 2003/01/03 17:13:23 kan Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linux_ptrace.c,v 1.14 2007/02/03 17:05:57 corecode Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linux_ptrace.c,v 1.15 2007/02/19 01:14:23 corecode Exp $
  */
 
 #include "opt_cpu.h"
@@ -217,10 +217,8 @@ struct linux_pt_fpxreg {
 
 #ifndef CPU_DISABLE_SSE
 static int
-linux_proc_read_fpxregs(struct proc *p, struct linux_pt_fpxreg *fpxregs)
+linux_proc_read_fpxregs(struct lwp *lp, struct linux_pt_fpxreg *fpxregs)
 {
-       /* XXX lwp */
-       struct lwp *lp = FIRST_LWP_IN_PROC(p);
        int error;
 
        error = 0;
@@ -233,10 +231,8 @@ linux_proc_read_fpxregs(struct proc *p, struct linux_pt_fpxreg *fpxregs)
 }
 
 static int
-linux_proc_write_fpxregs(struct proc *p, struct linux_pt_fpxreg *fpxregs)
+linux_proc_write_fpxregs(struct lwp *lp, struct linux_pt_fpxreg *fpxregs)
 {
-       /* XXX lwp */
-       struct lwp *lp = FIRST_LWP_IN_PROC(p);
        int error;
 
        error = 0;
@@ -354,6 +350,7 @@ sys_linux_ptrace(struct linux_ptrace_args *uap)
        case PTRACE_GETFPXREGS: {
 #ifndef CPU_DISABLE_SSE
                struct proc *p;
+               struct lwp *lp;
 
                if (sizeof(struct linux_pt_fpxreg) != sizeof(struct savexmm)) {
                        static int once = 0;
@@ -399,19 +396,22 @@ sys_linux_ptrace(struct linux_ptrace_args *uap)
                        goto fail;
                }
 
+               /* XXX lwp */
+               lp = FIRST_LWP_IN_PROC(p);
+
                if (req == PTRACE_GETFPXREGS) {
-                       PHOLD(p);
-                       error = linux_proc_read_fpxregs(p, &r.fpxreg);
-                       PRELE(p);
+                       LWPHOLD(lp);
+                       error = linux_proc_read_fpxregs(lp, &r.fpxreg);
+                       LWPRELE(lp);
                        if (error == 0)
                                error = copyout(&r.fpxreg, (caddr_t)uap->data,
                                    sizeof(r.fpxreg));
                } else {
                        /* clear dangerous bits exactly as Linux does*/
                        r.fpxreg.mxcsr &= 0xffbf;
-                       PHOLD(p);
-                       error = linux_proc_write_fpxregs(p, &r.fpxreg);
-                       PRELE(p);
+                       LWPHOLD(lp);
+                       error = linux_proc_write_fpxregs(lp, &r.fpxreg);
+                       LWPRELE(lp);
                }
                break;
 
index 72ec79e..8de79bd 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.37 2007/02/18 16:15:23 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_proc.c,v 1.38 2007/02/19 01:14:23 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -542,6 +542,36 @@ allproc_scan(int (*callback)(struct proc *, void *), void *data)
        spin_unlock_rd(&allproc_spin);
 }
 
+/*
+ * Scan all lwps of processes on the allproc list.  The lwp is automatically
+ * held for the callback.  A return value of -1 terminates the loop.
+ *
+ * possibly not MPSAFE, needs to access foreingn proc structures
+ */
+void
+alllwp_scan(int (*callback)(struct lwp *, void *), void *data)
+{
+       struct proc *p;
+       struct lwp *lp;
+       int r = 0;
+
+       spin_lock_rd(&allproc_spin);
+       LIST_FOREACH(p, &allproc, p_list) {
+               PHOLD(p);
+               spin_unlock_rd(&allproc_spin);
+               FOREACH_LWP_IN_PROC(lp, p) {
+                       LWPHOLD(lp);
+                       r = callback(lp, data);
+                       LWPRELE(lp);
+               }
+               spin_lock_rd(&allproc_spin);
+               PRELE(p);
+               if (r < 0)
+                       break;
+       }
+       spin_unlock_rd(&allproc_spin);
+}
+
 /*
  * Scan all processes on the zombproc list.  The process is automatically
  * held for the callback.  A return value of -1 terminates the loop.
index 3efba15..ddac564 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.76 2007/02/18 16:16:11 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.77 2007/02/19 01:14:23 corecode Exp $
  */
 
 #include "opt_ktrace.h"
@@ -192,21 +192,21 @@ schedcpu_stats(struct proc *p, void *data __unused)
 {
        struct lwp *lp;
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        crit_enter();
        p->p_swtime++;
-       if (lp->lwp_stat == LSSLEEP)
-               lp->lwp_slptime++;
+       FOREACH_LWP_IN_PROC(lp, p) {
+               if (lp->lwp_stat == LSSLEEP)
+                       lp->lwp_slptime++;
 
-       /*
-        * Only recalculate processes that are active or have slept
-        * less then 2 seconds.  The schedulers understand this.
-        */
-       if (lp->lwp_slptime <= 1) {
-               p->p_usched->recalculate(lp);
-       } else {
-               lp->lwp_pctcpu = (lp->lwp_pctcpu * ccpu) >> FSHIFT;
+               /*
+                * Only recalculate processes that are active or have slept
+                * less then 2 seconds.  The schedulers understand this.
+                */
+               if (lp->lwp_slptime <= 1) {
+                       p->p_usched->recalculate(lp);
+               } else {
+                       lp->lwp_pctcpu = (lp->lwp_pctcpu * ccpu) >> FSHIFT;
+               }
        }
        crit_exit();
        return(0);
@@ -223,19 +223,20 @@ schedcpu_resource(struct proc *p, void *data __unused)
        u_int64_t ttime;
        struct lwp *lp;
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        crit_enter();
        if (p->p_stat == SIDL || 
            p->p_stat == SZOMB ||
-           p->p_limit == NULL || 
-           lp->lwp_thread == NULL
+           p->p_limit == NULL
        ) {
                crit_exit();
                return(0);
        }
 
-       ttime = lp->lwp_thread->td_sticks + lp->lwp_thread->td_uticks;
+       ttime = 0;
+       FOREACH_LWP_IN_PROC(lp, p) {
+               ttime += lp->lwp_thread->td_sticks;
+               ttime += lp->lwp_thread->td_uticks;
+       }
 
        switch(plimit_testcpulimit(p->p_limit, ttime)) {
        case PLIMIT_TESTCPU_KILL:
@@ -979,7 +980,7 @@ uio_yield(void)
  * Compute a tenex style load average of a quantity on
  * 1, 5 and 15 minute intervals.
  */
-static int loadav_count_runnable(struct proc *p, void *data);
+static int loadav_count_runnable(struct lwp *p, void *data);
 
 static void
 loadav(void *arg)
@@ -988,7 +989,7 @@ loadav(void *arg)
        int i, nrun;
 
        nrun = 0;
-       allproc_scan(loadav_count_runnable, &nrun);
+       alllwp_scan(loadav_count_runnable, &nrun);
        avg = &averunnable;
        for (i = 0; i < 3; i++) {
                avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
@@ -1005,14 +1006,11 @@ loadav(void *arg)
 }
 
 static int
-loadav_count_runnable(struct proc *p, void *data)
+loadav_count_runnable(struct lwp *lp, void *data)
 {
-       struct lwp *lp;
        int *nrunp = data;
        thread_t td;
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        switch (lp->lwp_stat) {
        case LSRUN:
                if ((td = lp->lwp_thread) == NULL)
index 47d268f..4427ac4 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/sys_process.c,v 1.51.2.6 2003/01/08 03:06:45 kan Exp $
- * $DragonFly: src/sys/kern/sys_process.c,v 1.29 2007/02/18 16:12:43 corecode Exp $
+ * $DragonFly: src/sys/kern/sys_process.c,v 1.30 2007/02/19 01:14:23 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -384,7 +384,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
        /*
         * Single step fixup ala procfs
         */
-       FIX_SSTEP(p);
+       FIX_SSTEP(lp);
 #endif
 
        /*
@@ -416,11 +416,11 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                if (data < 0 || data > _SIG_MAXSIG)
                        return EINVAL;
 
-               PHOLD(p);
+               LWPHOLD(lp);
 
                if (req == PT_STEP) {
                        if ((error = ptrace_single_step (lp))) {
-                               PRELE(p);
+                               LWPRELE(lp);
                                return error;
                        }
                }
@@ -428,11 +428,11 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                if (addr != (void *)1) {
                        if ((error = ptrace_set_pc (lp,
                            (u_long)(uintfptr_t)addr))) {
-                               PRELE(p);
+                               LWPRELE(lp);
                                return error;
                        }
                }
-               PRELE(p);
+               LWPRELE(lp);
 
                if (req == PT_DETACH) {
                        /* reset process parent */
@@ -489,7 +489,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                uio.uio_segflg = UIO_SYSSPACE;
                uio.uio_rw = write ? UIO_WRITE : UIO_READ;
                uio.uio_td = curthread;
-               error = procfs_domem(curp, p, NULL, &uio);
+               error = procfs_domem(curp, lp, NULL, &uio);
                if (uio.uio_resid != 0) {
                        /*
                         * XXX procfs_domem() doesn't currently return ENOSPC,
@@ -535,7 +535,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                default:
                        return (EINVAL);
                }
-               error = procfs_domem(curp, p, NULL, &uio);
+               error = procfs_domem(curp, lp, NULL, &uio);
                piod->piod_len -= uio.uio_resid;
                return (error);
 
@@ -553,7 +553,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                /* write = 0 above */
 #endif /* PT_SETREGS */
 #if defined(PT_SETREGS) || defined(PT_GETREGS)
-               if (!procfs_validregs(p))       /* no P_SYSTEM procs please */
+               if (!procfs_validregs(lp))      /* no P_SYSTEM procs please */
                        return EINVAL;
                else {
                        iov.iov_base = addr;
@@ -565,7 +565,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                        uio.uio_segflg = UIO_SYSSPACE;
                        uio.uio_rw = write ? UIO_WRITE : UIO_READ;
                        uio.uio_td = curthread;
-                       return (procfs_doregs(curp, p, NULL, &uio));
+                       return (procfs_doregs(curp, lp, NULL, &uio));
                }
 #endif /* defined(PT_SETREGS) || defined(PT_GETREGS) */
 
@@ -579,7 +579,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                /* write = 0 above */
 #endif /* PT_SETFPREGS */
 #if defined(PT_SETFPREGS) || defined(PT_GETFPREGS)
-               if (!procfs_validfpregs(p))     /* no P_SYSTEM procs please */
+               if (!procfs_validfpregs(lp))    /* no P_SYSTEM procs please */
                        return EINVAL;
                else {
                        iov.iov_base = addr;
@@ -591,7 +591,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                        uio.uio_segflg = UIO_SYSSPACE;
                        uio.uio_rw = write ? UIO_WRITE : UIO_READ;
                        uio.uio_td = curthread;
-                       return (procfs_dofpregs(curp, p, NULL, &uio));
+                       return (procfs_dofpregs(curp, lp, NULL, &uio));
                }
 #endif /* defined(PT_SETFPREGS) || defined(PT_GETFPREGS) */
 
@@ -605,7 +605,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                /* write = 0 above */
 #endif /* PT_SETDBREGS */
 #if defined(PT_SETDBREGS) || defined(PT_GETDBREGS)
-               if (!procfs_validdbregs(p))     /* no P_SYSTEM procs please */
+               if (!procfs_validdbregs(lp))    /* no P_SYSTEM procs please */
                        return EINVAL;
                else {
                        iov.iov_base = addr;
@@ -617,7 +617,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *re
                        uio.uio_segflg = UIO_SYSSPACE;
                        uio.uio_rw = write ? UIO_WRITE : UIO_READ;
                        uio.uio_td = curthread;
-                       return (procfs_dodbregs(curp, p, NULL, &uio));
+                       return (procfs_dodbregs(curp, lp, NULL, &uio));
                }
 #endif /* defined(PT_SETDBREGS) || defined(PT_GETDBREGS) */
 
index 00e4ddd..b79f2db 100644 (file)
  *
  * From:
  * $FreeBSD: src/sys/i386/i386/procfs_machdep.c,v 1.14 1999/10/11 14:50:03 peter Exp $
- * $DragonFly: src/sys/platform/pc32/i386/procfs_machdep.c,v 1.8 2007/02/03 17:05:58 corecode Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/procfs_machdep.c,v 1.9 2007/02/19 01:14:23 corecode Exp $
  */
 
 /*
  * Functions to be implemented here are:
  *
- * procfs_read_regs(proc, regs)
+ * procfs_read_regs(lwp, regs)
  *     Get the current user-visible register set from the process
  *     and copy it into the regs structure (<machine/reg.h>).
  *     The process is stopped at the time read_regs is called.
  *
- * procfs_write_regs(proc, regs)
+ * procfs_write_regs(lwp, regs)
  *     Update the current register set from the passed in regs
  *     structure.  Take care to avoid clobbering special CPU
  *     registers or privileged bits in the PSL.
@@ -63,7 +63,7 @@
  * procfs_read_dbregs, procfs_write_dbregs
  *     deal with the processor debug register set, otherwise as above.
  *
- * procfs_sstep(proc)
+ * procfs_sstep(lwp)
  *     Arrange for the process to trap after executing a single instruction.
  *
  */
 #include <vm/vm_map.h>
 
 int
-procfs_read_regs(struct proc *p, struct reg *regs)
+procfs_read_regs(struct lwp *lp, struct reg *regs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_regs(lp, regs));
 }
 
 int
-procfs_write_regs(struct proc *p, struct reg *regs)
+procfs_write_regs(struct lwp *lp, struct reg *regs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_regs(lp, regs));
 }
 
 int
-procfs_read_dbregs(struct proc *p, struct dbreg *dbregs)
+procfs_read_dbregs(struct lwp *lp, struct dbreg *dbregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_dbregs(lp, dbregs));
 }
 
 int
-procfs_write_dbregs(struct proc *p, struct dbreg *dbregs)
+procfs_write_dbregs(struct lwp *lp, struct dbreg *dbregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_dbregs(lp, dbregs));
 }
 
@@ -138,40 +111,19 @@ procfs_write_dbregs(struct proc *p, struct dbreg *dbregs)
  */
 
 int
-procfs_read_fpregs(struct proc *p, struct fpreg *fpregs)
+procfs_read_fpregs(struct lwp *lp, struct fpreg *fpregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_fpregs(lp, fpregs));
 }
 
 int
-procfs_write_fpregs(struct proc *p, struct fpreg *fpregs)
+procfs_write_fpregs(struct lwp *lp, struct fpreg *fpregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_fpregs(lp, fpregs));
 }
 
 int
-procfs_sstep(struct proc *p)
+procfs_sstep(struct lwp *lp)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (ptrace_single_step(lp));
 }
index ef8ace2..f929baf 100644 (file)
  *
  * From:
  * $FreeBSD: src/sys/i386/i386/procfs_machdep.c,v 1.14 1999/10/11 14:50:03 peter Exp $
- * $DragonFly: src/sys/platform/vkernel/i386/procfs_machdep.c,v 1.2 2007/02/03 17:05:58 corecode Exp $
+ * $DragonFly: src/sys/platform/vkernel/i386/procfs_machdep.c,v 1.3 2007/02/19 01:14:23 corecode Exp $
  */
 
 /*
  * Functions to be implemented here are:
  *
- * procfs_read_regs(proc, regs)
+ * procfs_read_regs(lwp, regs)
  *     Get the current user-visible register set from the process
  *     and copy it into the regs structure (<machine/reg.h>).
  *     The process is stopped at the time read_regs is called.
  *
- * procfs_write_regs(proc, regs)
+ * procfs_write_regs(lwp, regs)
  *     Update the current register set from the passed in regs
  *     structure.  Take care to avoid clobbering special CPU
  *     registers or privileged bits in the PSL.
@@ -63,7 +63,7 @@
  * procfs_read_dbregs, procfs_write_dbregs
  *     deal with the processor debug register set, otherwise as above.
  *
- * procfs_sstep(proc)
+ * procfs_sstep(lwp)
  *     Arrange for the process to trap after executing a single instruction.
  *
  */
 #include <vm/vm_map.h>
 
 int
-procfs_read_regs(struct proc *p, struct reg *regs)
+procfs_read_regs(struct lwp *lp, struct reg *regs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_regs(lp, regs));
 }
 
 int
-procfs_write_regs(struct proc *p, struct reg *regs)
+procfs_write_regs(struct lwp *lp, struct reg *regs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_regs(lp, regs));
 }
 
 int
-procfs_read_dbregs(struct proc *p, struct dbreg *dbregs)
+procfs_read_dbregs(struct lwp *lp, struct dbreg *dbregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_dbregs(lp, dbregs));
 }
 
 int
-procfs_write_dbregs(struct proc *p, struct dbreg *dbregs)
+procfs_write_dbregs(struct lwp *lp, struct dbreg *dbregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_dbregs(lp, dbregs));
 }
 
@@ -135,37 +111,19 @@ procfs_write_dbregs(struct proc *p, struct dbreg *dbregs)
  */
 
 int
-procfs_read_fpregs(struct proc *p, struct fpreg *fpregs)
+procfs_read_fpregs(struct lwp *lp, struct fpreg *fpregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (fill_fpregs(lp, fpregs));
 }
 
 int
-procfs_write_fpregs(struct proc *p, struct fpreg *fpregs)
+procfs_write_fpregs(struct lwp *lp, struct fpreg *fpregs)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (set_fpregs(lp, fpregs));
 }
 
 int
-procfs_sstep(struct proc *p)
+procfs_sstep(struct lwp *lp)
 {
-       struct lwp *lp;
-
-       if (p->p_flag & P_SWAPPEDOUT)
-               return (EIO);
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        return (ptrace_single_step(lp));
 }
index ce1406a..6287745 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.98 2007/02/18 16:17:09 corecode Exp $
+ * $DragonFly: src/sys/sys/proc.h,v 1.99 2007/02/19 01:14:23 corecode Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -460,6 +460,7 @@ void        proc_add_allproc(struct proc *p);
 void   proc_move_allproc_zombie(struct proc *);
 void   proc_remove_zombie(struct proc *);
 void   allproc_scan(int (*callback)(struct proc *, void *), void *data);
+void   alllwp_scan(int (*callback)(struct lwp *, void *), void *data);
 void   zombproc_scan(int (*callback)(struct proc *, void *), void *data);
 void   fixjobc (struct proc *p, struct pgrp *pgrp, int entering);
 void   updatepcpu(struct lwp *, int, int);
index 906ee98..2d565ed 100644 (file)
@@ -38,7 +38,7 @@
  *
  * From:
  * $FreeBSD: src/sys/miscfs/procfs/procfs.h,v 1.32.2.3 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs.h,v 1.7 2004/08/17 18:57:35 dillon Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs.h,v 1.8 2007/02/19 01:14:24 corecode Exp $
  */
 
 /*
@@ -127,33 +127,32 @@ void procfs_exit (struct thread *);
 int procfs_freevp (struct vnode *);
 int procfs_allocvp (struct mount *, struct vnode **, long, pfstype);
 struct vnode *procfs_findtextvp (struct proc *);
-int procfs_sstep (struct proc *);
-void procfs_fix_sstep (struct proc *);
-int procfs_read_regs (struct proc *, struct reg *);
-int procfs_write_regs (struct proc *, struct reg *);
-int procfs_read_fpregs (struct proc *, struct fpreg *);
-int procfs_write_fpregs (struct proc *, struct fpreg *);
-int procfs_read_dbregs (struct proc *, struct dbreg *);
-int procfs_write_dbregs (struct proc *, struct dbreg *);
-int procfs_donote (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_doregs (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dofpregs (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dodbregs (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_domem (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_doctl (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dostatus (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_domap (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dotype (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_docmdline (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dorlimit (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_sstep (struct lwp *);
+int procfs_read_regs (struct lwp *, struct reg *);
+int procfs_write_regs (struct lwp *, struct reg *);
+int procfs_read_fpregs (struct lwp *, struct fpreg *);
+int procfs_write_fpregs (struct lwp *, struct fpreg *);
+int procfs_read_dbregs (struct lwp *, struct dbreg *);
+int procfs_write_dbregs (struct lwp *, struct dbreg *);
+int procfs_donote (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_doregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_dofpregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_dodbregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_domem (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_doctl (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_dostatus (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_domap (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_dotype (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_docmdline (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
+int procfs_dorlimit (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
 
 /* functions to check whether or not files should be displayed */
-int procfs_validfile (struct proc *);
-int procfs_validfpregs (struct proc *);
-int procfs_validregs (struct proc *);
-int procfs_validdbregs (struct proc *);
-int procfs_validmap (struct proc *);
-int procfs_validtype (struct proc *);
+int procfs_validfile (struct lwp *);
+int procfs_validfpregs (struct lwp *);
+int procfs_validregs (struct lwp *);
+int procfs_validdbregs (struct lwp *);
+int procfs_validmap (struct lwp *);
+int procfs_validtype (struct lwp *);
 
 #define PROCFS_LOCKED  0x01
 #define PROCFS_WANT    0x02
index 4cad697..59be5f1 100644 (file)
@@ -38,7 +38,7 @@
  *
  * From:
  * $FreeBSD: src/sys/miscfs/procfs/procfs_ctl.c,v 1.20.2.2 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_ctl.c,v 1.11 2007/02/18 16:12:43 corecode Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_ctl.c,v 1.12 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -52,7 +52,7 @@
 #include <vm/vm.h>
 
 #ifndef FIX_SSTEP
-#define FIX_SSTEP(p)
+#define FIX_SSTEP(lp)
 #endif
 
 /*
@@ -101,11 +101,12 @@ static vfs_namemap_t signames[] = {
        { 0 },
 };
 
-static int     procfs_control (struct proc *curp, struct proc *p, int op);
+static int     procfs_control (struct proc *curp, struct lwp *lp, int op);
 
 static int
-procfs_control(struct proc *curp, struct proc *p, int op)
+procfs_control(struct proc *curp, struct lwp *lp, int op)
 {
+       struct proc *p = lp->lwp_proc;
        int error;
 
        /* Can't trace a process that's currently exec'ing. */ 
@@ -178,7 +179,7 @@ procfs_control(struct proc *curp, struct proc *p, int op)
        /*
         * do single-step fixup if needed
         */
-       FIX_SSTEP(p);
+       FIX_SSTEP(lp);
 #endif
 
        /*
@@ -203,6 +204,7 @@ procfs_control(struct proc *curp, struct proc *p, int op)
 
                /* remove pending SIGTRAP, else the process will die */
                SIGDELSET(p->p_siglist, SIGTRAP);
+               SIGDELSET(lp->lwp_siglist, SIGTRAP);
 
                /* give process back to original parent */
                if (p->p_oppid != p->p_pptr->p_pid) {
@@ -223,9 +225,9 @@ procfs_control(struct proc *curp, struct proc *p, int op)
         * Step.  Let the target process execute a single instruction.
         */
        case PROCFS_CTL_STEP:
-               PHOLD(p);
-               error = procfs_sstep(p);
-               PRELE(p);
+               LWPHOLD(lp);
+               error = procfs_sstep(lp);
+               LWPRELE(lp);
                if (error)
                        return (error);
                break;
@@ -277,9 +279,10 @@ procfs_control(struct proc *curp, struct proc *p, int op)
 }
 
 int
-procfs_doctl(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_doctl(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
             struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int xlen;
        int error;
        char msg[PROCFS_CTLLEN+1];
@@ -306,14 +309,14 @@ procfs_doctl(struct proc *curp, struct proc *p, struct pfsnode *pfs,
 
        nm = vfs_findname(ctlnames, msg, xlen);
        if (nm) {
-               error = procfs_control(curp, p, nm->nm_val);
+               error = procfs_control(curp, lp, nm->nm_val);
        } else {
                nm = vfs_findname(signames, msg, xlen);
                if (nm) {
                        if (TRACE_WAIT_P(curp, p)) {
                                p->p_xstat = nm->nm_val;
 #ifdef FIX_SSTEP
-                               FIX_SSTEP(p);
+                               FIX_SSTEP(lp);
 #endif
                                /*
                                 * Make the process runnable but do not
index b9d0337..291af64 100644 (file)
@@ -41,7 +41,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_dbregs.c,v 1.4.2.3 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_dbregs.c,v 1.9 2007/02/16 23:11:40 corecode Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_dbregs.c,v 1.10 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
 #include <vm/vm.h>
 
 int
-procfs_dodbregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_dodbregs(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
                struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int error;
        struct dbreg r;
        char *kv;
@@ -73,24 +74,24 @@ procfs_dodbregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
        if (kl > uio->uio_resid)
                kl = uio->uio_resid;
 
-       PHOLD(p);
-       error = procfs_read_dbregs(p, &r);
+       LWPHOLD(lp);
+       error = procfs_read_dbregs(lp, &r);
        if (error == 0)
                error = uiomove_frombuf(&r, sizeof(r), uio);
        if (error == 0 && uio->uio_rw == UIO_WRITE) {
-               if (p->p_stat != SSTOP)
+               if (lp->lwp_stat != LSSTOP)
                        error = EBUSY;
                else
-                       error = procfs_write_dbregs(p, &r);
+                       error = procfs_write_dbregs(lp, &r);
        }
-       PRELE(p);
+       LWPRELE(lp);
 
        uio->uio_offset = 0;
        return (error);
 }
 
 int
-procfs_validdbregs(struct proc *p)
+procfs_validdbregs(struct lwp *lp)
 {
-       return ((p->p_flag & P_SYSTEM) == 0);
+       return ((lp->lwp_proc->p_flag & P_SYSTEM) == 0);
 }
index f6cddf8..b57d676 100644 (file)
@@ -38,7 +38,7 @@
  *
  * From:
  * $FreeBSD: src/sys/miscfs/procfs/procfs_fpregs.c,v 1.11.2.3 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_fpregs.c,v 1.9 2007/02/16 23:11:40 corecode Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_fpregs.c,v 1.10 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
 #include <vm/vm.h>
 
 int
-procfs_dofpregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_dofpregs(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
                struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int error;
        struct fpreg r;
        char *kv;
@@ -70,24 +71,24 @@ procfs_dofpregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
        if (kl > uio->uio_resid)
                kl = uio->uio_resid;
 
-       PHOLD(p);
-       error = procfs_read_fpregs(p, &r);
+       LWPHOLD(lp);
+       error = procfs_read_fpregs(lp, &r);
        if (error == 0)
                error = uiomove_frombuf(&r, sizeof(r), uio);
        if (error == 0 && uio->uio_rw == UIO_WRITE) {
-               if (p->p_stat != SSTOP)
+               if (lp->lwp_stat != LSSTOP)
                        error = EBUSY;
                else
-                       error = procfs_write_fpregs(p, &r);
+                       error = procfs_write_fpregs(lp, &r);
        }
-       PRELE(p);
+       LWPRELE(lp);
 
        uio->uio_offset = 0;
        return (error);
 }
 
 int
-procfs_validfpregs(struct proc *p)
+procfs_validfpregs(struct lwp *lp)
 {
-       return ((p->p_flag & P_SYSTEM) == 0);
+       return ((lp->lwp_proc->p_flag & P_SYSTEM) == 0);
 }
index 2e89072..62d942b 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_status.c     8.3 (Berkeley) 2/17/94
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_map.c,v 1.24.2.1 2001/08/04 13:12:24 rwatson Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_map.c,v 1.6 2006/12/20 18:14:44 dillon Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_map.c,v 1.7 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
  * can try a bigger buffer.
  */
 int
-procfs_domap(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_domap(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
             struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int len;
        int error;
        vm_map_t map = &p->p_vmspace->vm_map;
@@ -178,7 +179,7 @@ case OBJT_DEVICE:
 }
 
 int
-procfs_validmap(struct proc *p)
+procfs_validmap(struct lwp *lp)
 {
-       return ((p->p_flag & P_SYSTEM) == 0);
+       return ((lp->lwp_proc->p_flag & P_SYSTEM) == 0);
 }
index b6ed166..07b9eaf 100644 (file)
@@ -38,7 +38,7 @@
  *     @(#)procfs_mem.c        8.5 (Berkeley) 6/15/94
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_mem.c,v 1.46.2.3 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_mem.c,v 1.14 2007/01/11 10:15:21 dillon Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_mem.c,v 1.15 2007/02/19 01:14:24 corecode Exp $
  */
 
 /*
@@ -162,9 +162,11 @@ procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
  * from the kernel address space.
  */
 int
-procfs_domem(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_domem(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
             struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
+
        if (uio->uio_resid == 0)
                return (0);
 
index 39d7de6..7d2be2e 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_note.c       8.2 (Berkeley) 1/21/94
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_note.c,v 1.6 1999/08/28 00:46:55 peter Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_note.c,v 1.4 2004/05/02 03:05:11 cpressey Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_note.c,v 1.5 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -45,7 +45,7 @@
 #include <vfs/procfs/procfs.h>
 
 int
-procfs_donote(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_donote(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
              struct uio *uio)
 {
        int xlen;
index 3b713ce..932b7e9 100644 (file)
@@ -38,7 +38,7 @@
  *
  * From:
  * $FreeBSD: src/sys/miscfs/procfs/procfs_regs.c,v 1.10.2.3 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_regs.c,v 1.10 2007/02/16 23:11:40 corecode Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_regs.c,v 1.11 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
 #include <vm/vm_extern.h>
 
 int
-procfs_doregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_doregs(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
              struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int error;
        struct reg r;
        char *kv;
@@ -71,25 +72,25 @@ procfs_doregs(struct proc *curp, struct proc *p, struct pfsnode *pfs,
        if (kl > uio->uio_resid)
                kl = uio->uio_resid;
 
-       PHOLD(p);
+       LWPHOLD(lp);
 
-               error = procfs_read_regs(p, &r);
+       error = procfs_read_regs(lp, &r);
        if (error == 0)
                error = uiomove_frombuf(&r, sizeof(r), uio);
        if (error == 0 && uio->uio_rw == UIO_WRITE) {
                if (p->p_stat != SSTOP)
                        error = EBUSY;
                else
-                       error = procfs_write_regs(p, &r);
+                       error = procfs_write_regs(lp, &r);
        }
-       PRELE(p);
+       LWPRELE(lp);
 
        uio->uio_offset = 0;
        return (error);
 }
 
 int
-procfs_validregs(struct proc *p)
+procfs_validregs(struct lwp *lp)
 {
-       return ((p->p_flag & P_SYSTEM) == 0);
+       return ((lp->lwp_proc->p_flag & P_SYSTEM) == 0);
 }
index 17626e3..790cdaa 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_status.c     8.4 (Berkeley) 6/15/94
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_rlimit.c,v 1.5 1999/12/08 08:59:37 phk Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_rlimit.c,v 1.6 2006/12/20 18:14:44 dillon Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_rlimit.c,v 1.7 2007/02/19 01:14:24 corecode Exp $
  */
 
 /*
 
 
 int
-procfs_dorlimit(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_dorlimit(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
                struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        char *ps;
        int i;
        int xlen;
index fd74e4a..628cf81 100644 (file)
@@ -38,7 +38,7 @@
  *
  * From:
  * $FreeBSD: src/sys/miscfs/procfs/procfs_status.c,v 1.20.2.4 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_status.c,v 1.14 2007/02/03 17:05:59 corecode Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_status.c,v 1.15 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
 
 #define DOCHECK() do { if (ps >= psbuf+sizeof(psbuf)) goto bailout; } while (0)
 int
-procfs_dostatus(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_dostatus(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
                struct uio *uio)
 {
-       struct lwp *lp;
+       struct proc *p = lp->lwp_proc;
        struct session *sess;
        struct tty *tp;
        struct ucred *cr;
@@ -88,8 +88,6 @@ procfs_dostatus(struct proc *curp, struct proc *p, struct pfsnode *pfs,
        KASSERT(sizeof(psbuf) > MAXCOMLEN,
                        ("Too short buffer for new MAXCOMLEN"));
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
        ps = psbuf;
        bcopy(p->p_comm, ps, MAXCOMLEN);
        ps[MAXCOMLEN] = '\0';
@@ -184,9 +182,10 @@ bailout:
 }
 
 int
-procfs_docmdline(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_docmdline(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
                 struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        char *ps;
        int xlen;
        int error;
index 355cf08..132a40c 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_subr.c       8.6 (Berkeley) 5/14/95
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_subr.c,v 1.26.2.3 2002/02/18 21:28:04 des Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_subr.c,v 1.15 2006/09/05 00:55:50 dillon Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_subr.c,v 1.16 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -264,6 +264,7 @@ procfs_rw(struct vop_read_args *ap)
        struct proc *curp;
        struct pfsnode *pfs = VTOPFS(vp);
        struct proc *p;
+       struct lwp *lp;
        int rtval;
 
        if (curtd == NULL)
@@ -276,6 +277,8 @@ procfs_rw(struct vop_read_args *ap)
                return (EINVAL);
        if (p->p_pid == 1 && securelevel > 0 && uio->uio_rw == UIO_WRITE)
                return (EACCES);
+       /* XXX lwp */
+       lp = FIRST_LWP_IN_PROC(p);
 
        while (pfs->pfs_lockowner) {
                tsleep(&pfs->pfs_lockowner, 0, "pfslck", 0);
@@ -285,47 +288,47 @@ procfs_rw(struct vop_read_args *ap)
        switch (pfs->pfs_type) {
        case Pnote:
        case Pnotepg:
-               rtval = procfs_donote(curp, p, pfs, uio);
+               rtval = procfs_donote(curp, lp, pfs, uio);
                break;
 
        case Pregs:
-               rtval = procfs_doregs(curp, p, pfs, uio);
+               rtval = procfs_doregs(curp, lp, pfs, uio);
                break;
 
        case Pfpregs:
-               rtval = procfs_dofpregs(curp, p, pfs, uio);
+               rtval = procfs_dofpregs(curp, lp, pfs, uio);
                break;
 
         case Pdbregs:
-                rtval = procfs_dodbregs(curp, p, pfs, uio);
+                rtval = procfs_dodbregs(curp, lp, pfs, uio);
                 break;
 
        case Pctl:
-               rtval = procfs_doctl(curp, p, pfs, uio);
+               rtval = procfs_doctl(curp, lp, pfs, uio);
                break;
 
        case Pstatus:
-               rtval = procfs_dostatus(curp, p, pfs, uio);
+               rtval = procfs_dostatus(curp, lp, pfs, uio);
                break;
 
        case Pmap:
-               rtval = procfs_domap(curp, p, pfs, uio);
+               rtval = procfs_domap(curp, lp, pfs, uio);
                break;
 
        case Pmem:
-               rtval = procfs_domem(curp, p, pfs, uio);
+               rtval = procfs_domem(curp, lp, pfs, uio);
                break;
 
        case Ptype:
-               rtval = procfs_dotype(curp, p, pfs, uio);
+               rtval = procfs_dotype(curp, lp, pfs, uio);
                break;
 
        case Pcmdline:
-               rtval = procfs_docmdline(curp, p, pfs, uio);
+               rtval = procfs_docmdline(curp, lp, pfs, uio);
                break;
 
        case Prlimit:
-               rtval = procfs_dorlimit(curp, p, pfs, uio);
+               rtval = procfs_dorlimit(curp, lp, pfs, uio);
                break;
 
        default:
index 971f1e4..7c9c265 100644 (file)
@@ -35,7 +35,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_type.c,v 1.6 1999/08/28 00:46:56 peter Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_type.c,v 1.4 2004/05/02 03:05:11 cpressey Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_type.c,v 1.5 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
 #include <vfs/procfs/procfs.h>
 
 int
-procfs_dotype(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+procfs_dotype(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
              struct uio *uio)
 {
+       struct proc *p = lp->lwp_proc;
        int len;
        int error;
        /*
@@ -76,7 +77,7 @@ procfs_dotype(struct proc *curp, struct proc *p, struct pfsnode *pfs,
 }
 
 int
-procfs_validtype(struct proc *p)
+procfs_validtype(struct lwp *lp)
 {
-       return ((p->p_flag & P_SYSTEM) == 0);
+       return ((lp->lwp_proc->p_flag & P_SYSTEM) == 0);
 }
index a912ad2..96f9195 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_vnops.c      8.18 (Berkeley) 5/21/95
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_vnops.c,v 1.76.2.7 2002/01/22 17:22:59 nectar Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_vnops.c,v 1.41 2006/12/23 00:41:30 swildner Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_vnops.c,v 1.42 2007/02/19 01:14:24 corecode Exp $
  */
 
 /*
@@ -126,7 +126,7 @@ static struct proc_target {
        u_char  pt_namlen;
        char    *pt_name;
        pfstype pt_pfstype;
-       int     (*pt_valid) (struct proc *p);
+       int     (*pt_valid) (struct lwp *p);
 } proc_targets[] = {
 #define N(s) sizeof(s)-1, s
        /*        name          type            validp */
@@ -709,6 +709,7 @@ procfs_lookup(struct vop_old_lookup_args *ap)
        pid_t pid;
        struct pfsnode *pfs;
        struct proc *p;
+       struct lwp *lp;
        int i;
        int error;
 
@@ -762,6 +763,8 @@ procfs_lookup(struct vop_old_lookup_args *ap)
                p = PFIND(pfs->pfs_pid);
                if (p == NULL)
                        break;
+               /* XXX lwp */
+               lp = FIRST_LWP_IN_PROC(p);
 
                if (!PRISON_CHECK(ap->a_cnp->cn_cred, p->p_ucred))
                        break;
@@ -773,7 +776,7 @@ procfs_lookup(struct vop_old_lookup_args *ap)
                for (pt = proc_targets, i = 0; i < nproc_targets; pt++, i++) {
                        if (cnp->cn_namelen == pt->pt_namlen &&
                            bcmp(pt->pt_name, pname, cnp->cn_namelen) == 0 &&
-                           (pt->pt_valid == NULL || (*pt->pt_valid)(p)))
+                           (pt->pt_valid == NULL || (*pt->pt_valid)(lp)))
                                goto found;
                }
                break;
@@ -810,9 +813,9 @@ out:
  * Does this process have a text file?
  */
 int
-procfs_validfile(struct proc *p)
+procfs_validfile(struct lwp *lp)
 {
-       return (procfs_findtextvp(p) != NULLVP);
+       return (procfs_findtextvp(lp->lwp_proc) != NULLVP);
 }
 
 /*
@@ -868,6 +871,7 @@ procfs_readdir_proc(struct vop_readdir_args *ap)
        struct pfsnode *pfs;
        int error, i, retval;
        struct proc *p;
+       struct lwp *lp;
        struct proc_target *pt;
        struct uio *uio = ap->a_uio;
 
@@ -877,6 +881,8 @@ procfs_readdir_proc(struct vop_readdir_args *ap)
                return(0);
        if (!PRISON_CHECK(ap->a_cred, p->p_ucred))
                return(0);
+       /* XXX lwp */
+       lp = FIRST_LWP_IN_PROC(p);
 
        error = 0;
        i = (int)uio->uio_offset;
@@ -885,7 +891,7 @@ procfs_readdir_proc(struct vop_readdir_args *ap)
 
        for (pt = &proc_targets[i];
             !error && uio->uio_resid > 0 && i < nproc_targets; pt++, i++) {
-               if (pt->pt_valid && (*pt->pt_valid)(p) == 0)
+               if (pt->pt_valid && (*pt->pt_valid)(lp) == 0)
                        continue;
 
                retval = vop_write_dirent(&error, uio,
index d55feea..6166060 100644 (file)
@@ -60,7 +60,7 @@
  * rights to redistribute these changes.
  *
  * $FreeBSD: src/sys/vm/vm_glue.c,v 1.94.2.4 2003/01/13 22:51:17 dillon Exp $
- * $DragonFly: src/sys/vm/vm_glue.c,v 1.50 2007/02/16 23:11:40 corecode Exp $
+ * $DragonFly: src/sys/vm/vm_glue.c,v 1.51 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include "opt_vm.h"
@@ -434,9 +434,12 @@ scheduler_callback(struct proc *p, void *data)
        int pri;
 
        if (p->p_flag & P_SWAPWAIT) {
-               /* XXX lwp */
-               lp = FIRST_LWP_IN_PROC(p);
-               pri = p->p_swtime + lp->lwp_slptime - p->p_nice * 8;
+               pri = 0;
+               FOREACH_LWP_IN_PROC(lp, p) {
+                       /* XXX lwp might need a different metric */
+                       pri += lp->lwp_slptime;
+               }
+               pri += p->p_swtime - p->p_nice * 8;
 
                /*
                 * The more pages paged out while we were swapped,
@@ -524,16 +527,20 @@ swapout_procs_callback(struct proc *p, void *data)
        struct vmspace *vm;
        struct lwp *lp;
        int action = *(int *)data;
+       int minslp = -1;
 
        if (!swappable(p))
                return(0);
 
        vm = p->p_vmspace;
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
+       /*
+        * We only consider active processes.
+        */
+       if (p->p_stat != SACTIVE && p->p_stat != SSTOP)
+               return(0);
 
-       if (lp->lwp_stat == LSSLEEP || lp->lwp_stat == LSRUN) {
+       FOREACH_LWP_IN_PROC(lp, p) {
                /*
                 * do not swap out a realtime process
                 */
@@ -557,23 +564,27 @@ swapout_procs_callback(struct proc *p, void *data)
                        return(0);
                }
 
-               ++vm->vm_refcnt;
+               if (minslp == -1 || lp->lwp_slptime < minslp)
+                       minslp = lp->lwp_slptime;
+       }
 
-               /*
-                * If the process has been asleep for awhile, swap
-                * it out.
-                */
-               if ((action & VM_SWAP_NORMAL) ||
-                   ((action & VM_SWAP_IDLE) &&
-                    (lp->lwp_slptime > swap_idle_threshold2))) {
-                       swapout(p);
-               }
+       ++vm->vm_refcnt;
 
-               /*
-                * cleanup our reference
-                */
-               vmspace_free(vm);
+       /*
+        * If the process has been asleep for awhile, swap
+        * it out.
+        */
+       if ((action & VM_SWAP_NORMAL) ||
+           ((action & VM_SWAP_IDLE) &&
+            (minslp > swap_idle_threshold2))) {
+               swapout(p);
        }
+
+       /*
+        * cleanup our reference
+        */
+       vmspace_free(vm);
+
        return(0);
 }
 
index 3df2e04..bc909a7 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)vm_meter.c  8.4 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/vm/vm_meter.c,v 1.34.2.7 2002/10/10 19:28:22 dillon Exp $
- * $DragonFly: src/sys/vm/vm_meter.c,v 1.13 2007/02/18 16:12:43 corecode Exp $
+ * $DragonFly: src/sys/vm/vm_meter.c,v 1.14 2007/02/19 01:14:24 corecode Exp $
  */
 
 #include <sys/param.h>
@@ -145,33 +145,34 @@ do_vmtotal_callback(struct proc *p, void *data)
        if (p->p_flag & P_SYSTEM)
                return(0);
 
-       /* XXX lwp */
-       lp = FIRST_LWP_IN_PROC(p);
+       FOREACH_LWP_IN_PROC(lp, p) {
+               switch (lp->lwp_stat) {
+               case LSSTOP:
+               case LSSLEEP:
+                       if ((p->p_flag & P_SWAPPEDOUT) == 0) {
+                               if ((lp->lwp_flag & LWP_SINTR) == 0)
+                                       totalp->t_dw++;
+                               else if (lp->lwp_slptime < maxslp)
+                                       totalp->t_sl++;
+                       } else if (lp->lwp_slptime < maxslp) {
+                               totalp->t_sw++;
+                       }
+                       if (lp->lwp_slptime >= maxslp)
+                               return(0);
+                       break;
 
-       switch (lp->lwp_stat) {
-       case 0:
-               return(0);
-       case LSSLEEP:
-               if ((p->p_flag & P_SWAPPEDOUT) == 0) {
-                       if ((lp->lwp_flag & LWP_SINTR) == 0)
-                               totalp->t_dw++;
-                       else if (lp->lwp_slptime < maxslp)
-                               totalp->t_sl++;
-               } else if (lp->lwp_slptime < maxslp) {
-                       totalp->t_sw++;
-               }
-               if (lp->lwp_slptime >= maxslp)
-                       return(0);
-               break;
+               case LSRUN:
+                       if (p->p_flag & P_SWAPPEDOUT)
+                               totalp->t_sw++;
+                       else
+                               totalp->t_rq++;
+                       if (p->p_stat == SIDL)
+                               return(0);
+                       break;
 
-       case LSRUN:
-               if (p->p_flag & P_SWAPPEDOUT)
-                       totalp->t_sw++;
-               else
-                       totalp->t_rq++;
-               if (p->p_stat == SIDL)
-                       return(0);
-               break;
+               default:
+                       return (0);
+               }
        }
        /*
         * Note active objects.