summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libkvm/kvm_proc.c13
-rw-r--r--lib/libkvm/kvm_proc2.c41
-rw-r--r--sys/compat/common/tty_43.c4
-rw-r--r--sys/compat/linux/linux_file.c13
-rw-r--r--sys/compat/linux/linux_misc.c10
-rw-r--r--sys/compat/svr4/svr4_fcntl.c6
-rw-r--r--sys/compat/svr4/svr4_misc.c39
-rw-r--r--sys/ddb/db_usrreq.c9
-rw-r--r--sys/dev/usb/uhid.c16
-rw-r--r--sys/dev/wscons/wseventvar.h6
-rw-r--r--sys/dev/wscons/wskbd.c10
-rw-r--r--sys/dev/wscons/wsmouse.c10
-rw-r--r--sys/dev/wscons/wsmux.c10
-rw-r--r--sys/kern/exec_elf.c15
-rw-r--r--sys/kern/init_main.c13
-rw-r--r--sys/kern/kern_acct.c7
-rw-r--r--sys/kern/kern_descrip.c8
-rw-r--r--sys/kern/kern_exec.c8
-rw-r--r--sys/kern/kern_exit.c227
-rw-r--r--sys/kern/kern_fork.c35
-rw-r--r--sys/kern/kern_ktrace.c43
-rw-r--r--sys/kern/kern_proc.c138
-rw-r--r--sys/kern/kern_prot.c78
-rw-r--r--sys/kern/kern_resource.c92
-rw-r--r--sys/kern/kern_sig.c59
-rw-r--r--sys/kern/kern_sysctl.c48
-rw-r--r--sys/kern/spec_vnops.c6
-rw-r--r--sys/kern/subr_prf.c16
-rw-r--r--sys/kern/sys_generic.c8
-rw-r--r--sys/kern/sys_process.c22
-rw-r--r--sys/kern/tty.c65
-rw-r--r--sys/kern/tty_pty.c9
-rw-r--r--sys/kern/tty_tty.c10
-rw-r--r--sys/kern/vfs_vnops.c9
-rw-r--r--sys/miscfs/procfs/procfs_ctl.c22
-rw-r--r--sys/miscfs/procfs/procfs_status.c17
-rw-r--r--sys/miscfs/specfs/spec_vnops.c6
-rw-r--r--sys/sys/proc.h88
-rw-r--r--sys/sys/ptrace.h4
-rw-r--r--sys/sys/resource.h6
-rw-r--r--sys/sys/signalvar.h3
-rw-r--r--sys/sys/sysctl.h10
-rw-r--r--sys/sys/tty.h14
-rw-r--r--sys/sys/uio.h4
44 files changed, 715 insertions, 562 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index 9e35623f11a..63351d95ba4 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc.c,v 1.40 2010/01/10 03:37:50 guenther Exp $ */
+/* $OpenBSD: kvm_proc.c,v 1.41 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -303,9 +303,9 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
* gather eproc
*/
eproc.e_paddr = p;
- if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
+ if (KREAD(kd, (u_long)process.ps_pgrp, &pgrp)) {
_kvm_err(kd, kd->program, "can't read pgrp at %x",
- proc.p_pgrp);
+ process.ps_pgrp);
return (-1);
}
eproc.e_sess = pgrp.pg_session;
@@ -316,7 +316,7 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
pgrp.pg_session);
return (-1);
}
- if ((proc.p_flag & P_CONTROLT) && sess.s_ttyp != NULL) {
+ if ((process.ps_flags & PS_CONTROLT) && sess.s_ttyp != NULL) {
if (KREAD(kd, (u_long)sess.s_ttyp, &tty)) {
_kvm_err(kd, kd->program,
"can't read tty at %x", sess.s_ttyp);
@@ -337,7 +337,7 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
} else
eproc.e_tdev = NODEV;
eproc.e_flag = sess.s_ttyvp ? EPROC_CTTY : 0;
- if (sess.s_leader == p)
+ if (sess.s_leader == proc.p_p)
eproc.e_flag |= EPROC_SLEADER;
if (proc.p_wmesg)
(void)kvm_read(kd, (u_long)proc.p_wmesg,
@@ -356,11 +356,12 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
break;
case KERN_PROC_TTY:
- if ((proc.p_flag & P_CONTROLT) == 0 ||
+ if ((process.ps_flags & PS_CONTROLT) == 0 ||
eproc.e_tdev != (dev_t)arg)
continue;
break;
}
+ proc.p_flag |= process.ps_flags;
bcopy(&proc, &bp->kp_proc, sizeof(proc));
bcopy(&eproc, &bp->kp_eproc, sizeof(eproc));
++bp;
diff --git a/lib/libkvm/kvm_proc2.c b/lib/libkvm/kvm_proc2.c
index 00e7f774dec..e98c359323c 100644
--- a/lib/libkvm/kvm_proc2.c
+++ b/lib/libkvm/kvm_proc2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc2.c,v 1.2 2010/06/29 16:39:23 guenther Exp $ */
+/* $OpenBSD: kvm_proc2.c,v 1.3 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -110,7 +110,7 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
struct pcred pcred;
struct ucred ucred;
struct proc proc, proc2;
- struct process process;
+ struct process process, process2;
struct pgrp pgrp;
struct tty tty;
struct vmspace vm, *vmp;
@@ -139,9 +139,9 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
pcred.pc_ucred);
return (-1);
}
- if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
+ if (KREAD(kd, (u_long)process.ps_pgrp, &pgrp)) {
_kvm_err(kd, kd->program, "can't read pgrp at %x",
- proc.p_pgrp);
+ process.ps_pgrp);
return (-1);
}
if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
@@ -149,16 +149,23 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
pgrp.pg_session);
return (-1);
}
- if ((proc.p_flag & P_CONTROLT) && sess.s_ttyp != NULL &&
+ if ((process.ps_flags & PS_CONTROLT) && sess.s_ttyp != NULL &&
KREAD(kd, (u_long)sess.s_ttyp, &tty)) {
_kvm_err(kd, kd->program,
"can't read tty at %x", sess.s_ttyp);
return (-1);
}
- if (proc.p_pptr) {
- if (KREAD(kd, (u_long)proc.p_pptr, &proc2)) {
+ if (process.ps_pptr) {
+ if (KREAD(kd, (u_long)process.ps_pptr, &process2)) {
_kvm_err(kd, kd->program,
- "can't read proc at %x", proc.p_pptr);
+ "can't read process at %x",
+ process.ps_pptr);
+ return (-1);
+ }
+ if (KREAD(kd, (u_long)process2.ps_mainproc, &proc2)) {
+ _kvm_err(kd, kd->program,
+ "can't read proc at %x",
+ process2.ps_mainproc);
return (-1);
}
parent_pid = proc2.p_pid;
@@ -166,11 +173,17 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
else
parent_pid = 0;
if (sess.s_leader) {
- if (KREAD(kd, (u_long)sess.s_leader, &proc2)) {
+ if (KREAD(kd, (u_long)sess.s_leader, &process2)) {
_kvm_err(kd, kd->program,
"can't read proc at %x", sess.s_leader);
return (-1);
}
+ if (KREAD(kd, (u_long)process2.ps_mainproc, &proc2)) {
+ _kvm_err(kd, kd->program,
+ "can't read proc at %x",
+ process2.ps_mainproc);
+ return (-1);
+ }
leader_pid = proc2.p_pid;
}
else
@@ -189,12 +202,12 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
case KERN_PROC_SESSION:
if (sess.s_leader == NULL ||
- leader_pid == (pid_t)arg)
+ leader_pid != (pid_t)arg)
continue;
break;
case KERN_PROC_TTY:
- if ((proc.p_flag & P_CONTROLT) == 0 ||
+ if ((process.ps_flags & PS_CONTROLT) == 0 ||
sess.s_ttyp == NULL ||
tty.t_dev != (dev_t)arg)
continue;
@@ -253,16 +266,16 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
#define do_copy_str(_d, _s, _l) kvm_read(kd, (u_long)(_s), (_d), (_l)-1)
FILL_KPROC2(&kp, do_copy_str, &proc, &process, &pcred, &ucred,
- &pgrp, p, &sess, vmp, limp, ps);
+ &pgrp, p, proc.p_p, &sess, vmp, limp, ps);
#undef do_copy_str
/* stuff that's too painful to generalize into the macros */
kp.p_ppid = parent_pid;
kp.p_sid = leader_pid;
- if ((proc.p_flag & P_CONTROLT) && sess.s_ttyp != NULL) {
+ if ((process.ps_flags & PS_CONTROLT) && sess.s_ttyp != NULL) {
kp.p_tdev = tty.t_dev;
if (tty.t_pgrp != NULL &&
- tty.t_pgrp != proc.p_pgrp &&
+ tty.t_pgrp != process.ps_pgrp &&
KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
_kvm_err(kd, kd->program,
"can't read tpgrp at &x", tty.t_pgrp);
diff --git a/sys/compat/common/tty_43.c b/sys/compat/common/tty_43.c
index 8c7595b548e..e2973d4ad4d 100644
--- a/sys/compat/common/tty_43.c
+++ b/sys/compat/common/tty_43.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty_43.c,v 1.9 2004/09/19 21:34:42 mickey Exp $ */
+/* $OpenBSD: tty_43.c,v 1.10 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: tty_43.c,v 1.5 1996/05/20 14:29:17 mark Exp $ */
/*-
@@ -243,7 +243,7 @@ ttcompat(tp, com, data, flag, p)
if (tp->t_session->s_leader == NULL)
return ENOTTY;
- *(int *) data = tp->t_session->s_leader->p_pid;
+ *(int *) data = tp->t_session->s_leader->ps_pid;
break;
default:
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index d717b8df49f..3cce3741841 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: linux_file.c,v 1.23 2006/09/25 07:12:57 otto Exp $ */
+/* $OpenBSD: linux_file.c,v 1.24 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: linux_file.c,v 1.15 1996/05/20 01:59:09 fvdl Exp $ */
/*
@@ -190,7 +190,8 @@ linux_sys_open(p, v, retval)
* terminal yet, and the O_NOCTTY flag is not set, try to make
* this the controlling terminal.
*/
- if (!(fl & O_NOCTTY) && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
+ if (!(fl & O_NOCTTY) && SESS_LEADER(p->p_p) &&
+ !(p->p_p->ps_flags & PS_CONTROLT)) {
struct filedesc *fdp = p->p_fd;
struct file *fp;
@@ -417,13 +418,13 @@ linux_sys_fcntl(p, v, retval)
if ((long)arg <= 0) {
pgid = -(long)arg;
} else {
- struct proc *p1 = pfind((long)arg);
- if (p1 == 0)
+ struct process *pr = prfind((long)arg);
+ if (pr == 0)
return (ESRCH);
- pgid = (long)p1->p_pgrp->pg_id;
+ pgid = (long)pr->ps_pgrp->pg_id;
}
pgrp = pgfind(pgid);
- if (pgrp == NULL || pgrp->pg_session != p->p_session)
+ if (pgrp == NULL || pgrp->pg_session != p->p_p->ps_session)
return EPERM;
tp->t_pgrp = pgrp;
return 0;
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 5def1551993..cb7abec8993 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: linux_misc.c,v 1.64 2010/06/30 21:54:35 guenther Exp $ */
+/* $OpenBSD: linux_misc.c,v 1.65 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: linux_misc.c,v 1.27 1996/05/20 01:59:21 fvdl Exp $ */
/*-
@@ -1223,16 +1223,16 @@ linux_sys_getpgid(p, v, retval)
struct linux_sys_getpgid_args /* {
syscallarg(int) pid;
} */ *uap = v;
- struct proc *targp;
+ struct process *targpr;
if (SCARG(uap, pid) != 0 && SCARG(uap, pid) != p->p_pid) {
- if ((targp = pfind(SCARG(uap, pid))) == 0)
+ if ((targpr = prfind(SCARG(uap, pid))) == 0)
return ESRCH;
}
else
- targp = p;
+ targpr = p->p_p;
- retval[0] = targp->p_pgid;
+ retval[0] = targpr->ps_pgid;
return 0;
}
diff --git a/sys/compat/svr4/svr4_fcntl.c b/sys/compat/svr4/svr4_fcntl.c
index 02d10d8399a..eb4d927222f 100644
--- a/sys/compat/svr4/svr4_fcntl.c
+++ b/sys/compat/svr4/svr4_fcntl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: svr4_fcntl.c,v 1.22 2002/03/14 01:26:51 millert Exp $ */
+/* $OpenBSD: svr4_fcntl.c,v 1.23 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: svr4_fcntl.c,v 1.14 1995/10/14 20:24:24 christos Exp $ */
/*
@@ -338,8 +338,8 @@ svr4_sys_open(p, v, retval)
if (error)
return error;
- if (!(SCARG(&cup, flags) & O_NOCTTY) && SESS_LEADER(p) &&
- !(p->p_flag & P_CONTROLT)) {
+ if (!(SCARG(&cup, flags) & O_NOCTTY) && SESS_LEADER(p->p_p) &&
+ !(p->p_p->ps_flags & PS_CONTROLT)) {
struct filedesc *fdp = p->p_fd;
struct file *fp;
diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c
index f2700bf2d1a..dd2130514a2 100644
--- a/sys/compat/svr4/svr4_misc.c
+++ b/sys/compat/svr4/svr4_misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: svr4_misc.c,v 1.54 2010/05/25 16:39:15 thib Exp $ */
+/* $OpenBSD: svr4_misc.c,v 1.55 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: svr4_misc.c,v 1.42 1996/12/06 03:22:34 christos Exp $ */
/*
@@ -101,7 +101,7 @@ static void bsd_statfs_to_svr4_statvfs(const struct statfs *,
struct svr4_statvfs *);
static void bsd_statfs_to_svr4_statvfs64(const struct statfs *,
struct svr4_statvfs64 *);
-static struct proc *svr4_pfind(pid_t pid);
+static struct process *svr4_prfind(pid_t pid);
static int svr4_mknod(struct proc *, register_t *, char *,
svr4_mode_t, svr4_dev_t);
@@ -815,20 +815,20 @@ svr4_sys_ulimit(p, v, retval)
}
-static struct proc *
-svr4_pfind(pid)
- pid_t pid;
+static struct process *
+svr4_prfind(pid_t pid)
{
+ struct process *pr;
struct proc *p;
/* look in the live processes */
- if ((p = pfind(pid)) != NULL)
- return p;
+ if ((pr = prfind(pid)) != NULL)
+ return pr;
/* look in the zombies */
LIST_FOREACH(p, &zombproc, p_list)
if (p->p_pid == pid)
- return p;
+ return p->p_flag & P_THREAD ? NULL : p->p_p;
return NULL;
}
@@ -841,11 +841,12 @@ svr4_sys_pgrpsys(p, v, retval)
register_t *retval;
{
struct svr4_sys_pgrpsys_args *uap = v;
+ struct process *pr = p->p_p;
int error;
switch (SCARG(uap, cmd)) {
case 0: /* getpgrp() */
- *retval = p->p_pgrp->pg_id;
+ *retval = pr->ps_pgrp->pg_id;
return 0;
case 1: /* setpgrp() */
@@ -856,19 +857,19 @@ svr4_sys_pgrpsys(p, v, retval)
SCARG(&sa, pgid) = 0;
if ((error = sys_setpgid(p, &sa, retval)) != 0)
return error;
- *retval = p->p_pgrp->pg_id;
+ *retval = pr->ps_pgrp->pg_id;
return 0;
}
case 2: /* getsid(pid) */
if (SCARG(uap, pid) != 0 &&
- (p = svr4_pfind(SCARG(uap, pid))) == NULL)
+ (pr = svr4_prfind(SCARG(uap, pid))) == NULL)
return ESRCH;
/*
* we return the pid of the session leader for this
* process
*/
- *retval = (register_t) p->p_session->s_leader->p_pid;
+ *retval = (register_t)pr->ps_session->s_leader->ps_pid;
return 0;
case 3: /* setsid() */
@@ -877,10 +878,10 @@ svr4_sys_pgrpsys(p, v, retval)
case 4: /* getpgid(pid) */
if (SCARG(uap, pid) != 0 &&
- (p = svr4_pfind(SCARG(uap, pid))) == NULL)
+ (pr = svr4_prfind(SCARG(uap, pid))) == NULL)
return ESRCH;
- *retval = (int) p->p_pgrp->pg_id;
+ *retval = (int)pr->ps_pgrp->pg_id;
return 0;
case 5: /* setpgid(pid, pgid); */
@@ -1042,6 +1043,7 @@ svr4_sys_waitsys(q, v, retval)
struct svr4_sys_waitsys_args *uap = v;
int nfound;
int error;
+ struct process *pr;
struct proc *p;
switch (SCARG(uap, grp)) {
@@ -1049,7 +1051,7 @@ svr4_sys_waitsys(q, v, retval)
break;
case SVR4_P_PGID:
- SCARG(uap, id) = -q->p_pgid;
+ SCARG(uap, id) = -q->p_p->ps_pgid;
break;
case SVR4_P_ALL:
@@ -1065,12 +1067,13 @@ svr4_sys_waitsys(q, v, retval)
loop:
nfound = 0;
- LIST_FOREACH(p, &q->p_children, p_sibling) {
+ LIST_FOREACH(pr, &q->p_p->ps_children, ps_sibling) {
+ p = pr->ps_mainproc;
if (SCARG(uap, id) != WAIT_ANY &&
p->p_pid != SCARG(uap, id) &&
- p->p_pgid != -SCARG(uap, id)) {
+ pr->ps_pgid != -SCARG(uap, id)) {
DPRINTF(("pid %d pgid %d != %d\n", p->p_pid,
- p->p_pgid, SCARG(uap, id)));
+ pr->ps_pgid, SCARG(uap, id)));
continue;
}
nfound++;
diff --git a/sys/ddb/db_usrreq.c b/sys/ddb/db_usrreq.c
index f62908fcc65..b93d6674971 100644
--- a/sys/ddb/db_usrreq.c
+++ b/sys/ddb/db_usrreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_usrreq.c,v 1.13 2008/11/08 01:14:51 mpf Exp $ */
+/* $OpenBSD: db_usrreq.c,v 1.14 2010/07/26 01:56:27 guenther Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff. All rights reserved.
@@ -91,10 +91,11 @@ ddb_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
return (sysctl_int(oldp, oldlenp, newp, newlen, &db_log));
case DBCTL_TRIGGER:
if (newp && db_console) {
- struct proc *p = curproc;
+ struct process *pr = curproc->p_p;
+
if (securelevel < 1 ||
- (p->p_flag & P_CONTROLT && cn_tab &&
- cn_tab->cn_dev == p->p_session->s_ttyp->t_dev)) {
+ (pr->ps_flags & PS_CONTROLT && cn_tab &&
+ cn_tab->cn_dev == pr->ps_session->s_ttyp->t_dev)) {
Debugger();
newp = NULL;
} else
diff --git a/sys/dev/usb/uhid.c b/sys/dev/usb/uhid.c
index 6ebeba10455..9955bca0a97 100644
--- a/sys/dev/usb/uhid.c
+++ b/sys/dev/usb/uhid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uhid.c,v 1.47 2009/11/23 11:10:16 yuo Exp $ */
+/* $OpenBSD: uhid.c,v 1.48 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: uhid.c,v 1.57 2003/03/11 16:44:00 augustss Exp $ */
/*
@@ -81,10 +81,10 @@ struct uhid_softc {
struct clist sc_q;
struct selinfo sc_rsel;
- struct proc *sc_async; /* process that wants SIGIO */
- u_char sc_state; /* driver state */
-#define UHID_ASLP 0x01 /* waiting for device data */
-#define UHID_IMMED 0x02 /* return read data immediately */
+ struct process *sc_async; /* process that wants SIGIO */
+ u_char sc_state; /* driver state */
+#define UHID_ASLP 0x01 /* waiting for device data */
+#define UHID_IMMED 0x02 /* return read data immediately */
int sc_refcnt;
u_char sc_dying;
@@ -236,7 +236,7 @@ uhid_intr(struct uhidev *addr, void *data, u_int len)
selwakeup(&sc->sc_rsel);
if (sc->sc_async != NULL) {
DPRINTFN(3, ("uhid_intr: sending SIGIO %p\n", sc->sc_async));
- psignal(sc->sc_async, SIGIO);
+ prsignal(sc->sc_async, SIGIO);
}
}
@@ -427,7 +427,7 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr,
if (*(int *)addr) {
if (sc->sc_async != NULL)
return (EBUSY);
- sc->sc_async = p;
+ sc->sc_async = p->p_p;
DPRINTF(("uhid_do_ioctl: FIOASYNC %p\n", p));
} else
sc->sc_async = NULL;
@@ -437,7 +437,7 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr,
case TIOCSPGRP:
if (sc->sc_async == NULL)
return (EINVAL);
- if (*(int *)addr != sc->sc_async->p_pgid)
+ if (*(int *)addr != sc->sc_async->ps_pgid)
return (EPERM);
break;
diff --git a/sys/dev/wscons/wseventvar.h b/sys/dev/wscons/wseventvar.h
index f1eeb74dcd8..213ffc93a66 100644
--- a/sys/dev/wscons/wseventvar.h
+++ b/sys/dev/wscons/wseventvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: wseventvar.h,v 1.6 2009/11/09 17:53:39 nicm Exp $ */
+/* $OpenBSD: wseventvar.h,v 1.7 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: wseventvar.h,v 1.1 1998/03/22 14:24:03 drochner Exp $ */
/*
@@ -84,7 +84,7 @@ struct wseventvar {
u_int get; /* get (read) index (modified synchronously) */
volatile u_int put; /* put (write) index (modified by interrupt) */
struct selinfo sel; /* process selecting */
- struct proc *io; /* process that opened queue (can get SIGIO) */
+ struct process *io; /* process that opened queue (can get SIGIO) */
int wanted; /* wake up on input ready */
int async; /* send SIGIO on input ready */
struct wscons_event *q; /* circular buffer (queue) of events */
@@ -99,7 +99,7 @@ struct wseventvar {
wakeup((caddr_t)(ev)); \
} \
if ((ev)->async) \
- pgsignal((ev)->io->p_pgrp, SIGIO, 0); \
+ pgsignal((ev)->io->ps_pgrp, SIGIO, 0); \
}
void wsevent_init(struct wseventvar *);
diff --git a/sys/dev/wscons/wskbd.c b/sys/dev/wscons/wskbd.c
index 5fd868cd5f1..21bc897129b 100644
--- a/sys/dev/wscons/wskbd.c
+++ b/sys/dev/wscons/wskbd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wskbd.c,v 1.61 2009/10/13 19:33:19 pirofti Exp $ */
+/* $OpenBSD: wskbd.c,v 1.62 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: wskbd.c,v 1.80 2005/05/04 01:52:16 augustss Exp $ */
/*
@@ -815,7 +815,7 @@ wskbdopen(dev_t dev, int flags, int mode, struct proc *p)
evar = &sc->sc_base.me_evar;
wsevent_init(evar);
- evar->io = p;
+ evar->io = p->p_p;
error = wskbd_do_open(sc, evar);
if (error) {
@@ -937,15 +937,15 @@ wskbd_do_ioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data, int flag,
case FIOSETOWN:
if (sc->sc_base.me_evp == NULL)
return (EINVAL);
- if (-*(int *)data != sc->sc_base.me_evp->io->p_pgid &&
- *(int *)data != sc->sc_base.me_evp->io->p_pid)
+ if (-*(int *)data != sc->sc_base.me_evp->io->ps_pgid &&
+ *(int *)data != sc->sc_base.me_evp->io->ps_pid)
return (EPERM);
return (0);
case TIOCSPGRP:
if (sc->sc_base.me_evp == NULL)
return (EINVAL);
- if (*(int *)data != sc->sc_base.me_evp->io->p_pgid)
+ if (*(int *)data != sc->sc_base.me_evp->io->ps_pgid)
return (EPERM);
return (0);
}
diff --git a/sys/dev/wscons/wsmouse.c b/sys/dev/wscons/wsmouse.c
index bb5e5e12b43..e1ab5d29802 100644
--- a/sys/dev/wscons/wsmouse.c
+++ b/sys/dev/wscons/wsmouse.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsmouse.c,v 1.20 2009/10/13 19:33:19 pirofti Exp $ */
+/* $OpenBSD: wsmouse.c,v 1.21 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: wsmouse.c,v 1.35 2005/02/27 00:27:52 perry Exp $ */
/*
@@ -512,7 +512,7 @@ wsmouseopen(dev_t dev, int flags, int mode, struct proc *p)
evar = &sc->sc_base.me_evar;
wsevent_init(evar);
- evar->io = p;
+ evar->io = p->p_p;
error = wsmousedoopen(sc, evar);
if (error) {
@@ -638,15 +638,15 @@ wsmouse_do_ioctl(struct wsmouse_softc *sc, u_long cmd, caddr_t data, int flag,
case FIOSETOWN:
if (sc->sc_base.me_evp == NULL)
return (EINVAL);
- if (-*(int *)data != sc->sc_base.me_evp->io->p_pgid
- && *(int *)data != sc->sc_base.me_evp->io->p_pid)
+ if (-*(int *)data != sc->sc_base.me_evp->io->ps_pgid
+ && *(int *)data != sc->sc_base.me_evp->io->ps_pid)
return (EPERM);
return (0);
case TIOCSPGRP:
if (sc->sc_base.me_evp == NULL)
return (EINVAL);
- if (*(int *)data != sc->sc_base.me_evp->io->p_pgid)
+ if (*(int *)data != sc->sc_base.me_evp->io->ps_pgid)
return (EPERM);
return (0);
}
diff --git a/sys/dev/wscons/wsmux.c b/sys/dev/wscons/wsmux.c
index 1a9ac765eb0..1437256f886 100644
--- a/sys/dev/wscons/wsmux.c
+++ b/sys/dev/wscons/wsmux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsmux.c,v 1.23 2008/06/26 05:42:19 ray Exp $ */
+/* $OpenBSD: wsmux.c,v 1.24 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: wsmux.c,v 1.37 2005/04/30 03:47:12 augustss Exp $ */
/*
@@ -193,7 +193,7 @@ wsmuxopen(dev_t dev, int flags, int mode, struct proc *p)
evar = &sc->sc_base.me_evar;
wsevent_init(evar);
- evar->io = p;
+ evar->io = p->p_p;
#ifdef WSDISPLAY_COMPAT_RAWKBD
sc->sc_rawkbd = 0;
#endif
@@ -477,8 +477,8 @@ wsmux_do_ioctl(struct device *dv, u_long cmd, caddr_t data, int flag,
evar = sc->sc_base.me_evp;
if (evar == NULL)
return (EINVAL);
- if (-*(int *)data != evar->io->p_pgid
- && *(int *)data != evar->io->p_pid)
+ if (-*(int *)data != evar->io->ps_pgid
+ && *(int *)data != evar->io->ps_pid)
return (EPERM);
return (0);
case TIOCSPGRP:
@@ -486,7 +486,7 @@ wsmux_do_ioctl(struct device *dv, u_long cmd, caddr_t data, int flag,
evar = sc->sc_base.me_evp;
if (evar == NULL)
return (EINVAL);
- if (*(int *)data != evar->io->p_pgid)
+ if (*(int *)data != evar->io->ps_pgid)
return (EPERM);
return (0);
default:
diff --git a/sys/kern/exec_elf.c b/sys/kern/exec_elf.c
index e962f9fb0f0..10993c60152 100644
--- a/sys/kern/exec_elf.c
+++ b/sys/kern/exec_elf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec_elf.c,v 1.75 2010/07/24 09:50:45 guenther Exp $ */
+/* $OpenBSD: exec_elf.c,v 1.76 2010/07/26 01:56:27 guenther Exp $ */
/*
* Copyright (c) 1996 Per Fogelstrom
@@ -1137,6 +1137,7 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
struct uio uio;
struct elfcore_procinfo cpi;
Elf_Note nhdr;
+ struct process *pr = p->p_p;
struct proc *q;
size_t size, notesize;
int error;
@@ -1159,11 +1160,11 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
cpi.cpi_sigignore = p->p_sigignore;
cpi.cpi_sigcatch = p->p_sigcatch;
- cpi.cpi_pid = p->p_pid;
- cpi.cpi_ppid = p->p_pptr->p_pid;
- cpi.cpi_pgrp = p->p_pgid;
- if (p->p_session->s_leader)
- cpi.cpi_sid = p->p_session->s_leader->p_pid;
+ cpi.cpi_pid = pr->ps_pid;
+ cpi.cpi_ppid = pr->ps_pptr->ps_pid;
+ cpi.cpi_pgrp = pr->ps_pgid;
+ if (pr->ps_session->s_leader)
+ cpi.cpi_sid = pr->ps_session->s_leader->ps_pid;
else
cpi.cpi_sid = 0;
@@ -1263,7 +1264,7 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
* per-thread notes. Since we're dumping core, we don't bother
* locking.
*/
- TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
+ TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) {
if (q == p) /* we've taken care of this thread */
continue;
error = ELFNAMEEND(coredump_note)(q, iocookie, &notesize);
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index e3d5d4c3ee2..14afa2af599 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: init_main.c,v 1.169 2010/07/03 04:44:51 guenther Exp $ */
+/* $OpenBSD: init_main.c,v 1.170 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */
/*
@@ -184,6 +184,7 @@ int
main(void *framep)
{
struct proc *p;
+ struct process *pr;
struct pdevinit *pdev;
struct timeval rtv;
quad_t lim;
@@ -263,21 +264,21 @@ main(void *framep)
TAILQ_INIT(&process0.ps_threads);
TAILQ_INSERT_TAIL(&process0.ps_threads, p, p_thr_link);
process0.ps_refcnt = 1;
- p->p_p = &process0;
+ p->p_p = pr = &process0;
/* Set the default routing table/domain. */
process0.ps_rtableid = 0;
LIST_INSERT_HEAD(&allproc, p, p_list);
- p->p_pgrp = &pgrp0;
+ pr->ps_pgrp = &pgrp0;
LIST_INSERT_HEAD(PIDHASH(0), p, p_hash);
LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
LIST_INIT(&pgrp0.pg_members);
- LIST_INSERT_HEAD(&pgrp0.pg_members, p, p_pglist);
+ LIST_INSERT_HEAD(&pgrp0.pg_members, pr, ps_pglist);
pgrp0.pg_session = &session0;
session0.s_count = 1;
- session0.s_leader = p;
+ session0.s_leader = pr;
atomic_setbits_int(&p->p_flag, P_SYSTEM | P_NOCLDWAIT);
p->p_stat = SONPROC;
@@ -303,7 +304,7 @@ main(void *framep)
p->p_fd = fdinit(NULL);
/* Create the limits structures. */
- p->p_p->ps_limit = &limit0;
+ pr->ps_limit = &limit0;
for (i = 0; i < nitems(p->p_rlimit); i++)
limit0.pl_rlimit[i].rlim_cur =
limit0.pl_rlimit[i].rlim_max = RLIM_INFINITY;
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 52f002b1a29..0051d4fe1c5 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_acct.c,v 1.22 2010/01/14 23:12:11 schwarze Exp $ */
+/* $OpenBSD: kern_acct.c,v 1.23 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_acct.c,v 1.42 1996/02/04 02:15:12 christos Exp $ */
/*-
@@ -216,8 +216,9 @@ acct_process(struct proc *p)
acct.ac_gid = p->p_cred->p_rgid;
/* (7) The terminal from which the process was started */
- if ((p->p_flag & P_CONTROLT) && p->p_pgrp->pg_session->s_ttyp)
- acct.ac_tty = p->p_pgrp->pg_session->s_ttyp->t_dev;
+ if ((p->p_p->ps_flags & PS_CONTROLT) &&
+ p->p_p->ps_pgrp->pg_session->s_ttyp)
+ acct.ac_tty = p->p_p->ps_pgrp->pg_session->s_ttyp->t_dev;
else
acct.ac_tty = NODEV;
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 12c44f0294d..e669c3e365a 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_descrip.c,v 1.84 2010/07/19 23:00:15 guenther Exp $ */
+/* $OpenBSD: kern_descrip.c,v 1.85 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_descrip.c,v 1.42 1996/03/30 22:24:38 christos Exp $ */
/*
@@ -389,12 +389,12 @@ restart:
if ((long)SCARG(uap, arg) <= 0) {
SCARG(uap, arg) = (void *)(-(long)SCARG(uap, arg));
} else {
- struct proc *p1 = pfind((long)SCARG(uap, arg));
- if (p1 == 0) {
+ struct process *pr1 = prfind((long)SCARG(uap, arg));
+ if (pr1 == 0) {
error = ESRCH;
break;
}
- SCARG(uap, arg) = (void *)(long)p1->p_pgrp->pg_id;
+ SCARG(uap, arg) = (void *)(long)pr1->ps_pgrp->pg_id;
}
error = ((*fp->f_ops->fo_ioctl)
(fp, TIOCSPGRP, (caddr_t)&SCARG(uap, arg), p));
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 3bd0efe326e..5afdacd42d9 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exec.c,v 1.112 2010/05/18 22:26:10 tedu Exp $ */
+/* $OpenBSD: kern_exec.c,v 1.113 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */
/*-
@@ -468,9 +468,9 @@ sys_execve(struct proc *p, void *v, register_t *retval)
p->p_textvp = pack.ep_vp;
atomic_setbits_int(&p->p_flag, P_EXEC);
- if (p->p_flag & P_PPWAIT) {
- atomic_clearbits_int(&p->p_flag, P_PPWAIT);
- wakeup((caddr_t)p->p_pptr);
+ if (p->p_p->ps_mainproc->p_flag & P_PPWAIT) {
+ atomic_clearbits_int(&p->p_p->ps_mainproc->p_flag, P_PPWAIT);
+ wakeup(p->p_p->ps_pptr);
}
/*
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index bf36116bd53..3302bc6eb00 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exit.c,v 1.95 2010/07/19 23:00:15 guenther Exp $ */
+/* $OpenBSD: kern_exit.c,v 1.96 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */
/*
@@ -120,34 +120,37 @@ void
exit1(struct proc *p, int rv, int flags)
{
struct proc *q, *nq;
+ struct process *pr, *qr, *nqr;
if (p->p_pid == 1)
panic("init died (signal %d, exit %d)",
WTERMSIG(rv), WEXITSTATUS(rv));
+ atomic_setbits_int(&p->p_flag, P_WEXIT);
+
/* unlink ourselves from the active threads */
- TAILQ_REMOVE(&p->p_p->ps_threads, p, p_thr_link);
- if (TAILQ_EMPTY(&p->p_p->ps_threads))
- wakeup(&p->p_p->ps_threads);
+ pr = p->p_p;
+ TAILQ_REMOVE(&pr->ps_threads, p, p_thr_link);
+ if (TAILQ_EMPTY(&pr->ps_threads))
+ wakeup(&pr->ps_threads);
/*
* if one thread calls exit, we take down everybody.
* we have to be careful not to get recursively caught.
* this is kinda sick.
*/
if (flags == EXIT_NORMAL && (p->p_flag & P_THREAD) &&
- (p->p_p->ps_mainproc->p_flag & P_WEXIT) == 0) {
+ (pr->ps_mainproc->p_flag & P_WEXIT) == 0) {
/*
* we are one of the threads. we SIGKILL the parent,
* it will wake us up again, then we proceed.
*/
- atomic_setbits_int(&p->p_p->ps_mainproc->p_flag, P_IGNEXITRV);
- p->p_p->ps_mainproc->p_xstat = rv;
- ptsignal(p->p_p->ps_mainproc, SIGKILL, SPROPAGATED);
- tsleep(p->p_p, PUSER, "thrdying", 0);
+ atomic_setbits_int(&pr->ps_mainproc->p_flag, P_IGNEXITRV);
+ pr->ps_mainproc->p_xstat = rv;
+ ptsignal(pr->ps_mainproc, SIGKILL, SPROPAGATED);
+ tsleep(pr, PUSER, "thrdying", 0);
} else if ((p->p_flag & P_THREAD) == 0) {
- atomic_setbits_int(&p->p_flag, P_WEXIT);
if (flags == EXIT_NORMAL) {
- q = TAILQ_FIRST(&p->p_p->ps_threads);
+ q = TAILQ_FIRST(&pr->ps_threads);
for (; q != NULL; q = nq) {
nq = TAILQ_NEXT(q, p_thr_link);
atomic_setbits_int(&q->p_flag, P_IGNEXITRV);
@@ -155,23 +158,22 @@ exit1(struct proc *p, int rv, int flags)
ptsignal(q, SIGKILL, SPROPAGATED);
}
}
- wakeup(p->p_p);
- while (!TAILQ_EMPTY(&p->p_p->ps_threads))
- tsleep(&p->p_p->ps_threads, PUSER, "thrdeath", 0);
+ wakeup(pr);
+ while (!TAILQ_EMPTY(&pr->ps_threads))
+ tsleep(&pr->ps_threads, PUSER, "thrdeath", 0);
+ /*
+ * If parent is waiting for us to exit or exec, P_PPWAIT
+ * is set; we wake up the parent early to avoid deadlock.
+ */
+ if (p->p_flag & P_PPWAIT) {
+ atomic_clearbits_int(&p->p_flag, P_PPWAIT);
+ wakeup(pr->ps_pptr);
+ }
}
if (p->p_flag & P_PROFIL)
stopprofclock(p);
p->p_ru = pool_get(&rusage_pool, PR_WAITOK);
- /*
- * If parent is waiting for us to exit or exec, P_PPWAIT is set; we
- * wake up the parent early to avoid deadlock.
- */
- atomic_setbits_int(&p->p_flag, P_WEXIT);
- if (p->p_flag & P_PPWAIT) {
- atomic_clearbits_int(&p->p_flag, P_PPWAIT);
- wakeup(p->p_pptr);
- }
p->p_sigignore = ~0;
p->p_siglist = 0;
timeout_del(&p->p_realit_to);
@@ -183,46 +185,52 @@ exit1(struct proc *p, int rv, int flags)
*/
fdfree(p);
+ if ((p->p_flag & P_THREAD) == 0) {
#ifdef SYSVSEM
- if ((p->p_flag & P_THREAD) == 0)
- semexit(p->p_p);
+ semexit(pr);
#endif
- if (SESS_LEADER(p)) {
- struct session *sp = p->p_session;
+ if (SESS_LEADER(pr)) {
+ struct session *sp = pr->ps_session;
- if (sp->s_ttyvp) {
- /*
- * Controlling process.
- * Signal foreground pgrp,
- * drain controlling terminal
- * and revoke access to controlling terminal.
- */
- if (sp->s_ttyp->t_session == sp) {
- if (sp->s_ttyp->t_pgrp)
- pgsignal(sp->s_ttyp->t_pgrp, SIGHUP, 1);
- (void) ttywait(sp->s_ttyp);
+ if (sp->s_ttyvp) {
/*
- * The tty could have been revoked
- * if we blocked.
+ * Controlling process.
+ * Signal foreground pgrp,
+ * drain controlling terminal
+ * and revoke access to controlling terminal.
*/
+ if (sp->s_ttyp->t_session == sp) {
+ if (sp->s_ttyp->t_pgrp)
+ pgsignal(sp->s_ttyp->t_pgrp,
+ SIGHUP, 1);
+ (void) ttywait(sp->s_ttyp);
+ /*
+ * The tty could have been revoked
+ * if we blocked.
+ */
+ if (sp->s_ttyvp)
+ VOP_REVOKE(sp->s_ttyvp,
+ REVOKEALL);
+ }
if (sp->s_ttyvp)
- VOP_REVOKE(sp->s_ttyvp, REVOKEALL);
+ vrele(sp->s_ttyvp);
+ sp->s_ttyvp = NULL;
+ /*
+ * s_ttyp is not zero'd; we use this to
+ * indicate that the session once had a
+ * controlling terminal. (for logging and
+ * informational purposes)
+ */
}
- if (sp->s_ttyvp)
- vrele(sp->s_ttyvp);
- sp->s_ttyvp = NULL;
- /*
- * s_ttyp is not zero'd; we use this to indicate
- * that the session once had a controlling terminal.
- * (for logging and informational purposes)
- */
+ sp->s_leader = NULL;
}
- sp->s_leader = NULL;
- }
- fixjobc(p, p->p_pgrp, 0);
+ fixjobc(pr, pr->ps_pgrp, 0);
+
#ifdef ACCOUNTING
- (void)acct_process(p);
+ (void)acct_process(p);
#endif
+ }
+
#ifdef KTRACE
/*
* release trace file
@@ -254,19 +262,22 @@ exit1(struct proc *p, int rv, int flags)
/*
* Give orphaned children to init(8).
*/
- q = LIST_FIRST(&p->p_children);
- if (q) /* only need this if any child is S_ZOMB */
- wakeup(initproc);
- for (; q != 0; q = nq) {
- nq = LIST_NEXT(q, p_sibling);
- proc_reparent(q, initproc);
- /*
- * Traced processes are killed
- * since their existence means someone is screwing up.
- */
- if (q->p_flag & P_TRACED) {
- atomic_clearbits_int(&q->p_flag, P_TRACED);
- psignal(q, SIGKILL);
+ if ((p->p_flag & P_THREAD) == 0) {
+ qr = LIST_FIRST(&pr->ps_children);
+ if (qr) /* only need this if any child is S_ZOMB */
+ wakeup(initproc->p_p);
+ for (; qr != 0; qr = nqr) {
+ nqr = LIST_NEXT(qr, ps_sibling);
+ proc_reparent(qr, initproc->p_p);
+ /*
+ * Traced processes are killed
+ * since their existence means someone is screwing up.
+ */
+ if (qr->ps_mainproc->p_flag & P_TRACED) {
+ atomic_clearbits_int(&qr->ps_mainproc->p_flag,
+ P_TRACED);
+ prsignal(qr, SIGKILL);
+ }
}
}
@@ -286,27 +297,27 @@ exit1(struct proc *p, int rv, int flags)
*/
p->p_pctcpu = 0;
- /*
- * notify interested parties of our demise.
- */
- if (p == p->p_p->ps_mainproc)
- KNOTE(&p->p_p->ps_klist, NOTE_EXIT);
+ if ((p->p_flag & P_THREAD) == 0) {
+ /* notify interested parties of our demise */
+ KNOTE(&pr->ps_klist, NOTE_EXIT);
- /*
- * Notify parent that we're gone. If we have P_NOZOMBIE or parent has
- * the P_NOCLDWAIT flag set, notify process 1 instead (and hope it
- * will handle this situation).
- */
- if ((p->p_flag & P_NOZOMBIE) || (p->p_pptr->p_flag & P_NOCLDWAIT)) {
- struct proc *pp = p->p_pptr;
- proc_reparent(p, initproc);
/*
- * If this was the last child of our parent, notify
- * parent, so in case he was wait(2)ing, he will
- * continue.
+ * Notify parent that we're gone. If we have P_NOZOMBIE
+ * or parent has the P_NOCLDWAIT flag set, notify process 1
+ * instead (and hope it will handle this situation).
*/
- if (LIST_EMPTY(&pp->p_children))
- wakeup(pp);
+ if ((p->p_flag & P_NOZOMBIE) ||
+ (pr->ps_pptr->ps_mainproc->p_flag & P_NOCLDWAIT)) {
+ struct process *ppr = pr->ps_pptr;
+ proc_reparent(pr, initproc->p_p);
+ /*
+ * If this was the last child of our parent, notify
+ * parent, so in case he was wait(2)ing, he will
+ * continue.
+ */
+ if (LIST_EMPTY(&ppr->ps_children))
+ wakeup(ppr);
+ }
}
/*
@@ -407,9 +418,9 @@ reaper(void)
p->p_stat = SZOMB;
if (P_EXITSIG(p) != 0)
- psignal(p->p_pptr, P_EXITSIG(p));
+ prsignal(p->p_p->ps_pptr, P_EXITSIG(p));
/* Wake up the parent so it can get exit status. */
- wakeup(p->p_pptr);
+ wakeup(p->p_p->ps_pptr);
} else {
/* Noone will wait for us. Just zap the process now */
proc_zap(p);
@@ -429,21 +440,23 @@ sys_wait4(struct proc *q, void *v, register_t *retval)
syscallarg(struct rusage *) rusage;
} */ *uap = v;
int nfound;
+ struct process *pr;
struct proc *p;
int status, error;
if (SCARG(uap, pid) == 0)
- SCARG(uap, pid) = -q->p_pgid;
+ SCARG(uap, pid) = -q->p_p->ps_pgid;
if (SCARG(uap, options) &~ (WUNTRACED|WNOHANG|WALTSIG|WCONTINUED))
return (EINVAL);
loop:
nfound = 0;
- LIST_FOREACH(p, &q->p_children, p_sibling) {
+ LIST_FOREACH(pr, &q->p_p->ps_children, ps_sibling) {
+ p = pr->ps_mainproc;
if ((p->p_flag & P_NOZOMBIE) ||
(SCARG(uap, pid) != WAIT_ANY &&
p->p_pid != SCARG(uap, pid) &&
- p->p_pgid != -SCARG(uap, pid)))
+ pr->ps_pgid != -SCARG(uap, pid)))
continue;
/*
@@ -505,7 +518,7 @@ loop:
retval[0] = 0;
return (0);
}
- if ((error = tsleep(q, PWAIT | PCATCH, "wait", 0)) != 0)
+ if ((error = tsleep(q->p_p, PWAIT | PCATCH, "wait", 0)) != 0)
return (error);
goto loop;
}
@@ -513,19 +526,19 @@ loop:
void
proc_finish_wait(struct proc *waiter, struct proc *p)
{
- struct proc *t;
+ struct process *tr;
/*
* If we got the child via a ptrace 'attach',
* we need to give it back to the old parent.
*/
- if (p->p_oppid && (t = pfind(p->p_oppid))) {
+ if (p->p_oppid && (tr = prfind(p->p_oppid))) {
atomic_clearbits_int(&p->p_flag, P_TRACED);
p->p_oppid = 0;
- proc_reparent(p, t);
+ proc_reparent(p->p_p, tr);
if (p->p_exitsig != 0)
- psignal(t, p->p_exitsig);
- wakeup(t);
+ prsignal(tr, p->p_exitsig);
+ wakeup(tr);
} else {
scheduler_wait_hook(waiter, p);
p->p_xstat = 0;
@@ -538,24 +551,24 @@ proc_finish_wait(struct proc *waiter, struct proc *p)
* make process 'parent' the new parent of process 'child'.
*/
void
-proc_reparent(struct proc *child, struct proc *parent)
+proc_reparent(struct process *child, struct process *parent)
{
- if (child->p_pptr == parent)
+ if (child->ps_pptr == parent)
return;
- if (parent == initproc)
- child->p_exitsig = SIGCHLD;
+ if (parent == initproc->p_p)
+ child->ps_mainproc->p_exitsig = SIGCHLD;
- LIST_REMOVE(child, p_sibling);
- LIST_INSERT_HEAD(&parent->p_children, child, p_sibling);
- child->p_pptr = parent;
+ LIST_REMOVE(child, ps_sibling);
+ LIST_INSERT_HEAD(&parent->ps_children, child, ps_sibling);
+ child->ps_pptr = parent;
}
void
proc_zap(struct proc *p)
{
- struct process *pr;
+ struct process *pr = p->p_p;
pool_put(&rusage_pool, p->p_ru);
if (p->p_ptstat)
@@ -565,9 +578,11 @@ proc_zap(struct proc *p)
* Finally finished with old proc entry.
* Unlink it from its process group and free it.
*/
- leavepgrp(p);
+ if ((p->p_flag & P_THREAD) == 0)
+ leavepgrp(pr);
LIST_REMOVE(p, p_list); /* off zombproc */
- LIST_REMOVE(p, p_sibling);
+ if ((p->p_flag & P_THREAD) == 0)
+ LIST_REMOVE(pr, ps_sibling);
/*
* Decrement the count of procs running with this uid.
@@ -584,7 +599,6 @@ proc_zap(struct proc *p)
* Remove us from our process list, possibly killing the process
* in the process (pun intended).
*/
- pr = p->p_p;
if (--pr->ps_refcnt == 0) {
KASSERT(TAILQ_EMPTY(&pr->ps_threads));
limfree(pr->ps_limit);
@@ -596,4 +610,3 @@ proc_zap(struct proc *p)
pool_put(&proc_pool, p);
nprocs--;
}
-
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 07b8b1bc2c7..b92ea4a2cdb 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.121 2010/07/23 14:19:02 miod Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.122 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -158,12 +158,16 @@ process_new(struct proc *newproc, struct proc *parentproc)
pr = pool_get(&process_pool, PR_WAITOK);
pr->ps_mainproc = newproc;
+ parent = parentproc->p_p;
+
TAILQ_INIT(&pr->ps_threads);
TAILQ_INSERT_TAIL(&pr->ps_threads, newproc, p_thr_link);
+ LIST_INSERT_AFTER(parent, pr, ps_pglist);
+ pr->ps_pptr = parent;
+ LIST_INSERT_HEAD(&parent->ps_children, pr, ps_sibling);
+ LIST_INIT(&pr->ps_children);
pr->ps_refcnt = 1;
- parent = parentproc->p_p;
-
/*
* Make a process structure for the new process.
* Start by zeroing the section of proc that is zero-initialized,
@@ -180,6 +184,10 @@ process_new(struct proc *newproc, struct proc *parentproc)
crhold(parent->ps_cred->pc_ucred);
pr->ps_limit->p_refcnt++;
+ if (parent->ps_session->s_ttyvp != NULL &&
+ parent->ps_flags & PS_CONTROLT)
+ atomic_setbits_int(&pr->ps_flags, PS_CONTROLT);
+
newproc->p_p = pr;
}
@@ -311,14 +319,10 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
else
p2->p_fd = fdcopy(p1);
- if (p1->p_session->s_ttyvp != NULL && p1->p_flag & P_CONTROLT)
- atomic_setbits_int(&p2->p_flag, P_CONTROLT);
if (flags & FORK_PPWAIT)
atomic_setbits_int(&p2->p_flag, P_PPWAIT);
- p2->p_pptr = p1;
if (flags & FORK_NOZOMBIE)
atomic_setbits_int(&p2->p_flag, P_NOZOMBIE);
- LIST_INIT(&p2->p_children);
#ifdef KTRACE
/*
@@ -396,12 +400,12 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
LIST_INSERT_HEAD(&allproc, p2, p_list);
LIST_INSERT_HEAD(PIDHASH(p2->p_pid), p2, p_hash);
- LIST_INSERT_HEAD(&p1->p_children, p2, p_sibling);
- LIST_INSERT_AFTER(p1, p2, p_pglist);
+
if (p2->p_flag & P_TRACED) {
p2->p_oppid = p1->p_pid;
- if (p2->p_pptr != p1->p_pptr)
- proc_reparent(p2, p1->p_pptr);
+ if ((flags & FORK_THREAD) == 0 &&
+ p2->p_p->ps_pptr != p1->p_p->ps_pptr)
+ proc_reparent(p2->p_p, p1->p_p->ps_pptr);
/*
* Set ptrace status.
@@ -459,11 +463,11 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
/*
* Preserve synchronization semantics of vfork. If waiting for
* child to exec or exit, set P_PPWAIT on child, and sleep on our
- * proc (in case of exit).
+ * process (in case of exit).
*/
if (flags & FORK_PPWAIT)
while (p2->p_flag & P_PPWAIT)
- tsleep(p1, PWAIT, "ppwait", 0);
+ tsleep(p1->p_p, PWAIT, "ppwait", 0);
/*
* If we're tracing the child, alert the parent too.
@@ -494,9 +498,10 @@ pidtaken(pid_t pid)
return (1);
if (pgfind(pid) != NULL)
return (1);
- LIST_FOREACH(p, &zombproc, p_list)
- if (p->p_pid == pid || (p->p_pgrp && p->p_pgrp->pg_id == pid))
+ LIST_FOREACH(p, &zombproc, p_list) {
+ if (p->p_pid == pid || (p->p_p->ps_pgrp && p->p_p->ps_pgrp->pg_id == pid))
return (1);
+ }
return (0);
}
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index f0f8d6da6f8..a5312566288 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_ktrace.c,v 1.48 2009/10/31 12:00:08 fgsch Exp $ */
+/* $OpenBSD: kern_ktrace.c,v 1.49 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $ */
/*
@@ -54,7 +54,7 @@
void ktrinitheader(struct ktr_header *, struct proc *, int);
int ktrops(struct proc *, struct proc *, int, int, struct vnode *);
-int ktrsetchildren(struct proc *, struct proc *, int, int,
+int ktrsetchildren(struct proc *, struct process *, int, int,
struct vnode *);
int ktrwrite(struct proc *, struct ktr_header *);
int ktrcanset(struct proc *, struct proc *);
@@ -290,6 +290,7 @@ sys_ktrace(struct proc *curp, void *v, register_t *retval)
} */ *uap = v;
struct vnode *vp = NULL;
struct proc *p = NULL;
+ struct process *pr = NULL;
struct pgrp *pg;
int facs = SCARG(uap, facs) & ~((unsigned) KTRFAC_ROOT);
int ops = KTROP(SCARG(uap, ops));
@@ -352,25 +353,29 @@ sys_ktrace(struct proc *curp, void *v, register_t *retval)
error = ESRCH;
goto done;
}
- LIST_FOREACH(p, &pg->pg_members, p_pglist)
+ LIST_FOREACH(pr, &pg->pg_members, ps_pglist) {
if (descend)
- ret |= ktrsetchildren(curp, p, ops, facs, vp);
+ ret |= ktrsetchildren(curp, pr, ops, facs, vp);
else
- ret |= ktrops(curp, p, ops, facs, vp);
+ TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link)
+ ret |= ktrops(curp, p, ops, facs, vp);
+ }
} else {
/*
* by pid
*/
- p = pfind(SCARG(uap, pid));
- if (p == NULL) {
+ pr = prfind(SCARG(uap, pid));
+ if (pr == NULL) {
error = ESRCH;
goto done;
}
if (descend)
- ret |= ktrsetchildren(curp, p, ops, facs, vp);
+ ret |= ktrsetchildren(curp, pr, ops, facs, vp);
else
- ret |= ktrops(curp, p, ops, facs, vp);
+ TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
+ ret |= ktrops(curp, p, ops, facs, vp);
+ }
}
if (!ret)
error = EPERM;
@@ -412,30 +417,32 @@ ktrops(struct proc *curp, struct proc *p, int ops, int facs, struct vnode *vp)
}
int
-ktrsetchildren(struct proc *curp, struct proc *top, int ops, int facs,
+ktrsetchildren(struct proc *curp, struct process *top, int ops, int facs,
struct vnode *vp)
{
+ struct process *pr;
struct proc *p;
int ret = 0;
- p = top;
+ pr = top;
for (;;) {
- ret |= ktrops(curp, p, ops, facs, vp);
+ TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link)
+ ret |= ktrops(curp, p, ops, facs, vp);
/*
* If this process has children, descend to them next,
* otherwise do any siblings, and if done with this level,
* follow back up the tree (but not past top).
*/
- if (!LIST_EMPTY(&p->p_children))
- p = LIST_FIRST(&p->p_children);
+ if (!LIST_EMPTY(&pr->ps_children))
+ pr = LIST_FIRST(&pr->ps_children);
else for (;;) {
- if (p == top)
+ if (pr == top)
return (ret);
- if (LIST_NEXT(p, p_sibling) != NULL) {
- p = LIST_NEXT(p, p_sibling);
+ if (LIST_NEXT(pr, ps_sibling) != NULL) {
+ pr = LIST_NEXT(pr, ps_sibling);
break;
}
- p = p->p_pptr;
+ pr = pr->ps_pptr;
}
}
/*NOTREACHED*/
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 96276b58303..d609994c930 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_proc.c,v 1.44 2010/07/19 23:00:15 guenther Exp $ */
+/* $OpenBSD: kern_proc.c,v 1.45 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_proc.c,v 1.14 1996/02/09 18:59:41 christos Exp $ */
/*
@@ -135,7 +135,7 @@ uid_find(uid_t uid)
}
/*
- * Change the count associated with number of processes
+ * Change the count associated with number of threads
* a given user is using.
*/
int
@@ -154,17 +154,17 @@ chgproccnt(uid_t uid, int diff)
* Is p an inferior of parent?
*/
int
-inferior(struct proc *p, struct proc *parent)
+inferior(struct process *pr, struct process *parent)
{
- for (; p != parent; p = p->p_pptr)
- if (p->p_pid == 0 || p->p_pid == 1)
+ for (; pr != parent; pr = pr->ps_pptr)
+ if (pr->ps_pid == 0 || pr->ps_pid == 1)
return (0);
return (1);
}
/*
- * Locate a process by number
+ * Locate a proc (thread) by number
*/
struct proc *
pfind(pid_t pid)
@@ -178,6 +178,20 @@ pfind(pid_t pid)
}
/*
+ * Locate a process by number
+ */
+struct process *
+prfind(pid_t pid)
+{
+ struct proc *p;
+
+ LIST_FOREACH(p, PIDHASH(pid), p_hash)
+ if (p->p_pid == pid)
+ return (p->p_flag & P_THREAD ? NULL : p->p_p);
+ return (NULL);
+}
+
+/*
* Locate a process group by number
*/
struct pgrp *
@@ -195,9 +209,10 @@ pgfind(pid_t pgid)
* Move p to a new or existing process group (and session)
* Caller provides a pre-allocated pgrp and session that should
* be freed if they are not used.
+ * XXX need proctree lock
*/
int
-enterpgrp(struct proc *p, pid_t pgid, struct pgrp *newpgrp,
+enterpgrp(struct process *pr, pid_t pgid, struct pgrp *newpgrp,
struct session *newsess)
{
struct pgrp *pgrp = pgfind(pgid);
@@ -205,52 +220,44 @@ enterpgrp(struct proc *p, pid_t pgid, struct pgrp *newpgrp,
#ifdef DIAGNOSTIC
if (pgrp != NULL && newsess) /* firewalls */
panic("enterpgrp: setsid into non-empty pgrp");
- if (SESS_LEADER(p))
+ if (SESS_LEADER(pr))
panic("enterpgrp: session leader attempted setpgrp");
#endif
if (pgrp == NULL) {
- struct proc *np;
/*
* new process group
*/
#ifdef DIAGNOSTIC
- if (p->p_pid != pgid)
+ if (pr->ps_pid != pgid)
panic("enterpgrp: new pgrp and pid != pgid");
#endif
- if ((np = pfind(p->p_pid)) == NULL || np != p) {
- pool_put(&pgrp_pool, newpgrp);
- if (newsess)
- pool_put(&session_pool, newsess);
- return (ESRCH);
- }
-
pgrp = newpgrp;
if (newsess) {
/*
* new session
*/
- newsess->s_leader = p;
+ newsess->s_leader = pr;
newsess->s_count = 1;
newsess->s_ttyvp = NULL;
newsess->s_ttyp = NULL;
- bcopy(p->p_session->s_login, newsess->s_login,
+ bcopy(pr->ps_session->s_login, newsess->s_login,
sizeof(newsess->s_login));
- atomic_clearbits_int(&p->p_flag, P_CONTROLT);
+ atomic_clearbits_int(&pr->ps_flags, PS_CONTROLT);
pgrp->pg_session = newsess;
#ifdef DIAGNOSTIC
- if (p != curproc)
- panic("enterpgrp: mksession and p != curproc");
+ if (pr != curproc->p_p)
+ panic("enterpgrp: mksession but not curproc");
#endif
} else {
- pgrp->pg_session = p->p_session;
+ pgrp->pg_session = pr->ps_session;
pgrp->pg_session->s_count++;
}
pgrp->pg_id = pgid;
LIST_INIT(&pgrp->pg_members);
LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash);
pgrp->pg_jobc = 0;
- } else if (pgrp == p->p_pgrp) {
+ } else if (pgrp == pr->ps_pgrp) {
if (newsess)
pool_put(&session_pool, newsess);
pool_put(&pgrp_pool, newpgrp);
@@ -266,29 +273,28 @@ enterpgrp(struct proc *p, pid_t pgid, struct pgrp *newpgrp,
* Increment eligibility counts before decrementing, otherwise we
* could reach 0 spuriously during the first call.
*/
- fixjobc(p, pgrp, 1);
- fixjobc(p, p->p_pgrp, 0);
-
- LIST_REMOVE(p, p_pglist);
- if (LIST_EMPTY(&p->p_pgrp->pg_members))
- pgdelete(p->p_pgrp);
- p->p_pgrp = pgrp;
- LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
+ fixjobc(pr, pgrp, 1);
+ fixjobc(pr, pr->ps_pgrp, 0);
+
+ LIST_REMOVE(pr, ps_pglist);
+ if (LIST_EMPTY(&pr->ps_pgrp->pg_members))
+ pgdelete(pr->ps_pgrp);
+ pr->ps_pgrp = pgrp;
+ LIST_INSERT_HEAD(&pgrp->pg_members, pr, ps_pglist);
return (0);
}
/*
* remove process from process group
*/
-int
-leavepgrp(struct proc *p)
+void
+leavepgrp(struct process *pr)
{
- LIST_REMOVE(p, p_pglist);
- if (LIST_EMPTY(&p->p_pgrp->pg_members))
- pgdelete(p->p_pgrp);
- p->p_pgrp = 0;
- return (0);
+ LIST_REMOVE(pr, ps_pglist);
+ if (LIST_EMPTY(&pr->ps_pgrp->pg_members))
+ pgdelete(pr->ps_pgrp);
+ pr->ps_pgrp = 0;
}
/*
@@ -313,20 +319,21 @@ pgdelete(struct pgrp *pgrp)
* process group of the same session). If that count reaches zero, the
* process group becomes orphaned. Check both the specified process'
* process group and that of its children.
- * entering == 0 => p is leaving specified group.
- * entering == 1 => p is entering specified group.
+ * entering == 0 => pr is leaving specified group.
+ * entering == 1 => pr is entering specified group.
+ * XXX need proctree lock
*/
void
-fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
+fixjobc(struct process *pr, struct pgrp *pgrp, int entering)
{
struct pgrp *hispgrp;
struct session *mysession = pgrp->pg_session;
/*
- * Check p's parent to see whether p qualifies its own process
- * group; if so, adjust count for p's process group.
+ * Check pr's parent to see whether pr qualifies its own process
+ * group; if so, adjust count for pr's process group.
*/
- if ((hispgrp = p->p_pptr->p_pgrp) != pgrp &&
+ if ((hispgrp = pr->ps_pptr->ps_pgrp) != pgrp &&
hispgrp->pg_session == mysession) {
if (entering)
pgrp->pg_jobc++;
@@ -339,10 +346,10 @@ fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
* their process groups; if so, adjust counts for children's
* process groups.
*/
- LIST_FOREACH(p, &p->p_children, p_sibling)
- if ((hispgrp = p->p_pgrp) != pgrp &&
+ LIST_FOREACH(pr, &pr->ps_children, ps_sibling)
+ if ((hispgrp = pr->ps_pgrp) != pgrp &&
hispgrp->pg_session == mysession &&
- P_ZOMBIE(p) == 0) {
+ P_ZOMBIE(pr->ps_mainproc) == 0) {
if (entering)
hispgrp->pg_jobc++;
else if (--hispgrp->pg_jobc == 0)
@@ -358,13 +365,13 @@ fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
static void
orphanpg(struct pgrp *pg)
{
- struct proc *p;
+ struct process *pr;
- LIST_FOREACH(p, &pg->pg_members, p_pglist) {
- if (p->p_stat == SSTOP) {
- LIST_FOREACH(p, &pg->pg_members, p_pglist) {
- psignal(p, SIGHUP);
- psignal(p, SIGCONT);
+ LIST_FOREACH(pr, &pg->pg_members, ps_pglist) {
+ if (pr->ps_mainproc->p_stat == SSTOP) {
+ LIST_FOREACH(pr, &pg->pg_members, ps_pglist) {
+ prsignal(pr, SIGHUP);
+ prsignal(pr, SIGCONT);
}
return;
}
@@ -381,6 +388,7 @@ proc_printit(struct proc *p, const char *modif, int (*pr)(const char *, ...))
char pstbuf[5];
const char *pst = pstbuf;
+
if (p->p_stat < 1 || p->p_stat > sizeof(pstat) / sizeof(pstat[0]))
snprintf(pstbuf, sizeof(pstbuf), "%d", p->p_stat);
else
@@ -392,8 +400,8 @@ proc_printit(struct proc *p, const char *modif, int (*pr)(const char *, ...))
p->p_priority, p->p_usrpri, p->p_nice);
(*pr)(" forw=%p, list=%p,%p\n",
TAILQ_NEXT(p, p_runq), p->p_list.le_next, p->p_list.le_prev);
- (*pr)(" user=%p, vmspace=%p\n",
- p->p_addr, p->p_vmspace);
+ (*pr)(" process=%p user=%p, vmspace=%p\n",
+ p->p_p, p->p_addr, p->p_vmspace);
(*pr)(" estcpu=%u, cpticks=%d, pctcpu=%u.%u%, swtime=%u\n",
p->p_estcpu, p->p_cpticks, p->p_pctcpu / 100, p->p_pctcpu % 100,
p->p_swtime);
@@ -410,7 +418,8 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
{
char *mode;
int doingzomb = 0;
- struct proc *p, *pp;
+ struct proc *p;
+ struct process *pr, *ppr;
if (modif[0] == 0)
modif[0] = 'n'; /* default == normal mode */
@@ -445,7 +454,8 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
}
while (p != 0) {
- pp = p->p_pptr;
+ pr = p->p_p;
+ ppr = pr->ps_pptr;
if (p->p_stat) {
db_printf("%c%5d ", p == curproc ? '*' : ' ',
@@ -461,9 +471,9 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
case 'n':
db_printf("%5d %5d %5d %d %#10x "
"%-12.12s %-16s\n",
- pp ? pp->p_pid : -1,
- p->p_pgrp ? p->p_pgrp->pg_id : -1,
- p->p_cred->p_ruid, p->p_stat, p->p_flag,
+ ppr ? ppr->ps_pid : -1,
+ pr->ps_pgrp ? pr->ps_pgrp->pg_id : -1,
+ pr->ps_cred->p_ruid, p->p_stat, p->p_flag,
(p->p_wchan && p->p_wmesg) ?
p->p_wmesg : "", p->p_comm);
break;
@@ -491,7 +501,7 @@ void
pgrpdump(void)
{
struct pgrp *pgrp;
- struct proc *p;
+ struct process *pr;
int i;
for (i = 0; i <= pgrphash; i++) {
@@ -502,9 +512,9 @@ pgrpdump(void)
pgrp, pgrp->pg_id, pgrp->pg_session,
pgrp->pg_session->s_count,
LIST_FIRST(&pgrp->pg_members));
- LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
+ LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist) {
printf("\t\tpid %d addr %p pgrp %p\n",
- p->p_pid, p, p->p_pgrp);
+ pr->ps_pid, pr, pr->ps_pgrp);
}
}
}
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 3f49186d5c2..a34714c4ba5 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_prot.c,v 1.45 2010/07/01 02:41:12 guenther Exp $ */
+/* $OpenBSD: kern_prot.c,v 1.46 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_prot.c,v 1.33 1996/02/09 18:59:42 christos Exp $ */
/*
@@ -59,8 +59,8 @@ int
sys_getpid(struct proc *p, void *v, register_t *retval)
{
- retval[0] = p->p_p->ps_mainproc->p_pid;
- retval[1] = p->p_p->ps_mainproc->p_pptr->p_pid;
+ retval[0] = p->p_p->ps_pid;
+ retval[1] = p->p_p->ps_pptr->ps_pid;
return (0);
}
@@ -80,7 +80,7 @@ int
sys_getppid(struct proc *p, void *v, register_t *retval)
{
- *retval = p->p_p->ps_mainproc->p_pptr->p_pid;
+ *retval = p->p_p->ps_pptr->ps_pid;
return (0);
}
@@ -89,7 +89,7 @@ int
sys_getpgrp(struct proc *p, void *v, register_t *retval)
{
- *retval = p->p_pgrp->pg_id;
+ *retval = p->p_p->ps_pgrp->pg_id;
return (0);
}
@@ -102,16 +102,16 @@ sys_getpgid(struct proc *curp, void *v, register_t *retval)
struct sys_getpgid_args /* {
syscallarg(pid_t) pid;
} */ *uap = v;
- struct proc *targp = curp;
+ struct process *targpr = curp->p_p;
- if (SCARG(uap, pid) == 0 || SCARG(uap, pid) == curp->p_pid)
+ if (SCARG(uap, pid) == 0 || SCARG(uap, pid) == targpr->ps_pid)
goto found;
- if ((targp = pfind(SCARG(uap, pid))) == NULL)
+ if ((targpr = prfind(SCARG(uap, pid))) == NULL)
return (ESRCH);
- if (targp->p_session != curp->p_session)
+ if (targpr->ps_session != curp->p_p->ps_session)
return (EPERM);
found:
- *retval = targp->p_pgid;
+ *retval = targpr->ps_pgid;
return (0);
}
@@ -121,19 +121,19 @@ sys_getsid(struct proc *curp, void *v, register_t *retval)
struct sys_getsid_args /* {
syscallarg(pid_t) pid;
} */ *uap = v;
- struct proc *targp = curp;
+ struct process *targpr = curp->p_p;
- if (SCARG(uap, pid) == 0 || SCARG(uap, pid) == curp->p_pid)
+ if (SCARG(uap, pid) == 0 || SCARG(uap, pid) == targpr->ps_pid)
goto found;
- if ((targp = pfind(SCARG(uap, pid))) == NULL)
+ if ((targpr = prfind(SCARG(uap, pid))) == NULL)
return (ESRCH);
- if (targp->p_session != curp->p_session)
+ if (targpr->ps_session != curp->p_p->ps_session)
return (EPERM);
found:
/* Skip exiting processes */
- if (targp->p_pgrp->pg_session->s_leader == NULL)
+ if (targpr->ps_pgrp->pg_session->s_leader == NULL)
return (ESRCH);
- *retval = targp->p_pgrp->pg_session->s_leader->p_pid;
+ *retval = targpr->ps_pgrp->pg_session->s_leader->ps_pid;
return (0);
}
@@ -223,17 +223,19 @@ sys_setsid(struct proc *p, void *v, register_t *retval)
{
struct session *newsess;
struct pgrp *newpgrp;
+ struct process *pr = p->p_p;
+ pid_t pid = pr->ps_pid;
newsess = pool_get(&session_pool, PR_WAITOK);
newpgrp = pool_get(&pgrp_pool, PR_WAITOK);
- if (p->p_pgid == p->p_pid || pgfind(p->p_pid)) {
+ if (pr->ps_pgid == pid || pgfind(pid)) {
pool_put(&pgrp_pool, newpgrp);
pool_put(&session_pool, newsess);
return (EPERM);
} else {
- (void) enterpgrp(p, p->p_pid, newpgrp, newsess);
- *retval = p->p_pid;
+ (void) enterpgrp(pr, pid, newpgrp, newsess);
+ *retval = pid;
return (0);
}
}
@@ -259,7 +261,8 @@ sys_setpgid(struct proc *curp, void *v, register_t *retval)
syscallarg(pid_t) pid;
syscallarg(int) pgid;
} */ *uap = v;
- struct proc *targp; /* target process */
+ struct process *curpr = curp->p_p;
+ struct process *targpr; /* target process */
struct pgrp *pgrp, *newpgrp; /* target pgrp */
pid_t pid;
int pgid, error;
@@ -272,34 +275,34 @@ sys_setpgid(struct proc *curp, void *v, register_t *retval)
newpgrp = pool_get(&pgrp_pool, PR_WAITOK);
- if (pid != 0 && pid != curp->p_pid) {
- if ((targp = pfind(pid)) == 0 || !inferior(targp, curp)) {
+ if (pid != 0 && pid != curpr->ps_pid) {
+ if ((targpr = prfind(pid)) == 0 || !inferior(targpr, curpr)) {
error = ESRCH;
goto out;
}
- if (targp->p_session != curp->p_session) {
+ if (targpr->ps_session != curpr->ps_session) {
error = EPERM;
goto out;
}
- if (targp->p_flag & P_EXEC) {
+ if (targpr->ps_mainproc->p_flag & P_EXEC) {
error = EACCES;
goto out;
}
} else
- targp = curp;
- if (SESS_LEADER(targp)) {
+ targpr = curpr;
+ if (SESS_LEADER(targpr)) {
error = EPERM;
goto out;
}
if (pgid == 0)
- pgid = targp->p_pid;
- else if (pgid != targp->p_pid)
+ pgid = targpr->ps_pid;
+ else if (pgid != targpr->ps_pid)
if ((pgrp = pgfind(pgid)) == 0 ||
- pgrp->pg_session != curp->p_session) {
+ pgrp->pg_session != curpr->ps_session) {
error = EPERM;
goto out;
}
- return (enterpgrp(targp, pgid, newpgrp, NULL));
+ return (enterpgrp(targpr, pgid, newpgrp, NULL));
out:
pool_put(&pgrp_pool, newpgrp);
return (error);
@@ -843,11 +846,12 @@ sys_getlogin(struct proc *p, void *v, register_t *retval)
syscallarg(char *) namebuf;
syscallarg(u_int) namelen;
} */ *uap = v;
+ struct session *s = p->p_p->ps_pgrp->pg_session;
- if (SCARG(uap, namelen) > sizeof (p->p_pgrp->pg_session->s_login))
- SCARG(uap, namelen) = sizeof (p->p_pgrp->pg_session->s_login);
- return (copyout((caddr_t) p->p_pgrp->pg_session->s_login,
- (caddr_t) SCARG(uap, namebuf), SCARG(uap, namelen)));
+ if (SCARG(uap, namelen) > sizeof(s->s_login))
+ SCARG(uap, namelen) = sizeof(s->s_login);
+ return (copyout((caddr_t)s->s_login,
+ (caddr_t)SCARG(uap, namebuf), SCARG(uap, namelen)));
}
/*
@@ -860,13 +864,13 @@ sys_setlogin(struct proc *p, void *v, register_t *retval)
struct sys_setlogin_args /* {
syscallarg(const char *) namebuf;
} */ *uap = v;
+ struct session *s = p->p_p->ps_pgrp->pg_session;
int error;
if ((error = suser(p, 0)) != 0)
return (error);
- error = copyinstr((caddr_t) SCARG(uap, namebuf),
- (caddr_t) p->p_pgrp->pg_session->s_login,
- sizeof (p->p_pgrp->pg_session->s_login), (size_t *)0);
+ error = copyinstr((caddr_t)SCARG(uap, namebuf), (caddr_t)s->s_login,
+ sizeof(s->s_login), NULL);
if (error == ENAMETOOLONG)
error = EINVAL;
return (error);
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 9bf4e2eab72..76a078d9e03 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_resource.c,v 1.35 2010/06/29 20:14:46 guenther Exp $ */
+/* $OpenBSD: kern_resource.c,v 1.36 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */
/*-
@@ -68,6 +68,7 @@ sys_getpriority(struct proc *curp, void *v, register_t *retval)
syscallarg(int) which;
syscallarg(id_t) who;
} */ *uap = v;
+ struct process *pr;
struct proc *p;
int low = NZERO + PRIO_MAX + 1;
@@ -75,25 +76,29 @@ sys_getpriority(struct proc *curp, void *v, register_t *retval)
case PRIO_PROCESS:
if (SCARG(uap, who) == 0)
- p = curp;
+ pr = curp->p_p;
else
- p = pfind(SCARG(uap, who));
- if (p == 0)
+ pr = prfind(SCARG(uap, who));
+ if (pr == NULL)
break;
- low = p->p_nice;
+ TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
+ if (p->p_nice < low)
+ low = p->p_nice;
+ }
break;
case PRIO_PGRP: {
struct pgrp *pg;
if (SCARG(uap, who) == 0)
- pg = curp->p_pgrp;
+ pg = curp->p_p->ps_pgrp;
else if ((pg = pgfind(SCARG(uap, who))) == NULL)
break;
- LIST_FOREACH(p, &pg->pg_members, p_pglist) {
- if (p->p_nice < low)
- low = p->p_nice;
- }
+ LIST_FOREACH(pr, &pg->pg_members, ps_pglist)
+ TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
+ if (p->p_nice < low)
+ low = p->p_nice;
+ }
break;
}
@@ -124,19 +129,19 @@ sys_setpriority(struct proc *curp, void *v, register_t *retval)
syscallarg(id_t) who;
syscallarg(int) prio;
} */ *uap = v;
- struct proc *p;
+ struct process *pr;
int found = 0, error = 0;
switch (SCARG(uap, which)) {
case PRIO_PROCESS:
if (SCARG(uap, who) == 0)
- p = curp;
+ pr = curp->p_p;
else
- p = pfind(SCARG(uap, who));
- if (p == 0)
+ pr = prfind(SCARG(uap, who));
+ if (pr == NULL)
break;
- error = donice(curp, p, SCARG(uap, prio));
+ error = donice(curp, pr, SCARG(uap, prio));
found++;
break;
@@ -144,25 +149,28 @@ sys_setpriority(struct proc *curp, void *v, register_t *retval)
struct pgrp *pg;
if (SCARG(uap, who) == 0)
- pg = curp->p_pgrp;
+ pg = curp->p_p->ps_pgrp;
else if ((pg = pgfind(SCARG(uap, who))) == NULL)
break;
- LIST_FOREACH(p, &pg->pg_members, p_pglist) {
- error = donice(curp, p, SCARG(uap, prio));
+ LIST_FOREACH(pr, &pg->pg_members, ps_pglist) {
+ error = donice(curp, pr, SCARG(uap, prio));
found++;
}
break;
}
- case PRIO_USER:
+ case PRIO_USER: {
+ struct proc *p;
if (SCARG(uap, who) == 0)
SCARG(uap, who) = curp->p_ucred->cr_uid;
LIST_FOREACH(p, &allproc, p_list)
- if (p->p_ucred->cr_uid == SCARG(uap, who)) {
- error = donice(curp, p, SCARG(uap, prio));
+ if ((p->p_flag & P_THREAD) == 0 &&
+ p->p_ucred->cr_uid == SCARG(uap, who)) {
+ error = donice(curp, p->p_p, SCARG(uap, prio));
found++;
}
break;
+ }
default:
return (EINVAL);
@@ -173,25 +181,28 @@ sys_setpriority(struct proc *curp, void *v, register_t *retval)
}
int
-donice(struct proc *curp, struct proc *chgp, int n)
+donice(struct proc *curp, struct process *chgpr, int n)
{
struct pcred *pcred = curp->p_cred;
+ struct proc *p;
int s;
if (pcred->pc_ucred->cr_uid && pcred->p_ruid &&
- pcred->pc_ucred->cr_uid != chgp->p_ucred->cr_uid &&
- pcred->p_ruid != chgp->p_ucred->cr_uid)
+ pcred->pc_ucred->cr_uid != chgpr->ps_cred->pc_ucred->cr_uid &&
+ pcred->p_ruid != chgpr->ps_cred->pc_ucred->cr_uid)
return (EPERM);
if (n > PRIO_MAX)
n = PRIO_MAX;
if (n < PRIO_MIN)
n = PRIO_MIN;
n += NZERO;
- if (n < chgp->p_nice && suser(curp, 0))
+ /* XXX wrong: p_nice should be in process */
+ if (n < chgpr->ps_mainproc->p_nice && suser(curp, 0))
return (EACCES);
- chgp->p_nice = n;
+ chgpr->ps_mainproc->p_nice = n;
SCHED_LOCK(s);
- (void)resetpriority(chgp);
+ TAILQ_FOREACH(p, &chgpr->ps_threads, p_thr_link)
+ (void)resetpriority(p);
SCHED_UNLOCK(s);
return (0);
}
@@ -364,13 +375,40 @@ sys_getrusage(struct proc *p, void *v, register_t *retval)
syscallarg(int) who;
syscallarg(struct rusage *) rusage;
} */ *uap = v;
+ struct process *pr = p->p_p;
+ struct rusage ru;
struct rusage *rup;
switch (SCARG(uap, who)) {
case RUSAGE_SELF:
+ calcru(p, &p->p_stats->p_ru.ru_utime,
+ &p->p_stats->p_ru.ru_stime, NULL);
+ ru = p->p_stats->p_ru;
+ rup = &ru;
+
+ /* XXX add on already dead threads */
+
+ /* add on other living threads */
+ {
+ struct proc *q;
+
+ TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) {
+ if (q == p || P_ZOMBIE(q))
+ continue;
+ /*
+ * XXX this is approximate: no call
+ * to calcru in other running threads
+ */
+ ruadd(rup, &q->p_stats->p_ru);
+ }
+ }
+ break;
+
+ case RUSAGE_THREAD:
rup = &p->p_stats->p_ru;
calcru(p, &rup->ru_utime, &rup->ru_stime, NULL);
+ ru = *rup;
break;
case RUSAGE_CHILDREN:
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index eaff0b94351..a672064a4d1 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.115 2010/07/02 19:57:15 tedu Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.116 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -96,7 +96,7 @@ cansignal(struct proc *p, struct pcred *pc, struct proc *q, int signum)
if (p == q)
return (1); /* process can always signal itself */
- if (signum == SIGCONT && q->p_session == p->p_session)
+ if (signum == SIGCONT && q->p_p->ps_session == p->p_p->ps_session)
return (1); /* SIGCONT in session */
/*
@@ -620,6 +620,7 @@ int
killpg1(struct proc *cp, int signum, int pgid, int all)
{
struct proc *p;
+ struct process *pr;
struct pcred *pc = cp->p_cred;
struct pgrp *pgrp;
int nfound = 0;
@@ -641,13 +642,14 @@ killpg1(struct proc *cp, int signum, int pgid, int all)
/*
* zero pgid means send to my process group.
*/
- pgrp = cp->p_pgrp;
+ pgrp = cp->p_p->ps_pgrp;
else {
pgrp = pgfind(pgid);
if (pgrp == NULL)
return (ESRCH);
}
- LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
+ LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist) {
+ p = pr->ps_mainproc;
if (p->p_pid <= 1 || p->p_flag & (P_SYSTEM|P_THREAD) ||
!cansignal(cp, pc, p, signum))
continue;
@@ -659,14 +661,14 @@ killpg1(struct proc *cp, int signum, int pgid, int all)
return (nfound ? 0 : ESRCH);
}
-#define CANDELIVER(uid, euid, p) \
+#define CANDELIVER(uid, euid, pr) \
(euid == 0 || \
- (uid) == (p)->p_cred->p_ruid || \
- (uid) == (p)->p_cred->p_svuid || \
- (uid) == (p)->p_ucred->cr_uid || \
- (euid) == (p)->p_cred->p_ruid || \
- (euid) == (p)->p_cred->p_svuid || \
- (euid) == (p)->p_ucred->cr_uid)
+ (uid) == (pr)->ps_cred->p_ruid || \
+ (uid) == (pr)->ps_cred->p_svuid || \
+ (uid) == (pr)->ps_cred->pc_ucred->cr_uid || \
+ (euid) == (pr)->ps_cred->p_ruid || \
+ (euid) == (pr)->ps_cred->p_svuid || \
+ (euid) == (pr)->ps_cred->pc_ucred->cr_uid)
/*
* Deliver signum to pgid, but first check uid/euid against each
@@ -676,7 +678,7 @@ void
csignal(pid_t pgid, int signum, uid_t uid, uid_t euid)
{
struct pgrp *pgrp;
- struct proc *p;
+ struct process *pr;
if (pgid == 0)
return;
@@ -684,14 +686,14 @@ csignal(pid_t pgid, int signum, uid_t uid, uid_t euid)
pgid = -pgid;
if ((pgrp = pgfind(pgid)) == NULL)
return;
- LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
- if (CANDELIVER(uid, euid, p))
- psignal(p, signum);
+ LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist)
+ if (CANDELIVER(uid, euid, pr))
+ prsignal(pr, signum);
} else {
- if ((p = pfind(pgid)) == NULL)
+ if ((pr = prfind(pgid)) == NULL)
return;
- if (CANDELIVER(uid, euid, p))
- psignal(p, signum);
+ if (CANDELIVER(uid, euid, pr))
+ prsignal(pr, signum);
}
}
@@ -714,13 +716,12 @@ gsignal(int pgid, int signum)
void
pgsignal(struct pgrp *pgrp, int signum, int checkctty)
{
- struct proc *p;
+ struct process *pr;
if (pgrp)
- LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
- if ((checkctty == 0 || p->p_flag & P_CONTROLT) &&
- (p->p_flag & P_THREAD) == 0)
- psignal(p, signum);
+ LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist)
+ if (checkctty == 0 || pr->ps_flags & PS_CONTROLT)
+ prsignal(pr, signum);
}
/*
@@ -866,7 +867,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
* the action is default; don't stop the process below
* if sleeping, and don't clear any pending SIGCONT.
*/
- if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0)
+ if (prop & SA_TTYSTOP && p->p_p->ps_pgrp->pg_jobc == 0)
return;
}
}
@@ -1031,7 +1032,7 @@ run:
out:
SCHED_UNLOCK(s);
if (wakeparent)
- wakeup(p->p_pptr);
+ wakeup(p->p_p->ps_pptr);
}
/*
@@ -1136,7 +1137,7 @@ issignal(struct proc *p)
*/
if (prop & SA_STOP) {
if (p->p_flag & P_TRACED ||
- (p->p_pgrp->pg_jobc == 0 &&
+ (p->p_p->ps_pgrp->pg_jobc == 0 &&
prop & SA_TTYSTOP))
break; /* == ignore */
p->p_xstat = signum;
@@ -1226,9 +1227,9 @@ proc_stop_sweep(void *v)
continue;
atomic_clearbits_int(&p->p_flag, P_STOPPED);
- if ((p->p_pptr->p_flag & P_NOCLDSTOP) == 0)
- psignal(p->p_pptr, SIGCHLD);
- wakeup(p->p_pptr);
+ if ((p->p_p->ps_pptr->ps_mainproc->p_flag & P_NOCLDSTOP) == 0)
+ prsignal(p->p_p->ps_pptr, SIGCHLD);
+ wakeup(p->p_p->ps_pptr);
}
}
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 2e78801663c..4973cf62f25 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.190 2010/07/19 23:00:15 guenther Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.191 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -1316,6 +1316,7 @@ sysctl_doproc(int *name, u_int namelen, char *where, size_t *sizep)
struct kinfo_proc2 *kproc2 = NULL;
struct eproc *eproc = NULL;
struct proc *p;
+ struct process *pr;
char *dp;
int arg, buflen, doingzomb, elem_size, elem_count;
int error, needed, type, op;
@@ -1354,7 +1355,8 @@ again:
continue;
/* XXX skip processes in the middle of being zapped */
- if (p->p_pgrp == NULL)
+ pr = p->p_p;
+ if (pr->ps_pgrp == NULL)
continue;
/*
@@ -1370,20 +1372,20 @@ again:
case KERN_PROC_PGRP:
/* could do this by traversing pgrp */
- if (p->p_pgrp->pg_id != (pid_t)arg)
+ if (pr->ps_pgrp->pg_id != (pid_t)arg)
continue;
break;
case KERN_PROC_SESSION:
- if (p->p_session->s_leader == NULL ||
- p->p_session->s_leader->p_pid != (pid_t)arg)
+ if (pr->ps_session->s_leader == NULL ||
+ pr->ps_session->s_leader->ps_pid != (pid_t)arg)
continue;
break;
case KERN_PROC_TTY:
- if ((p->p_flag & P_CONTROLT) == 0 ||
- p->p_session->s_ttyp == NULL ||
- p->p_session->s_ttyp->t_dev != (dev_t)arg)
+ if ((pr->ps_flags & PS_CONTROLT) == 0 ||
+ pr->ps_session->s_ttyp == NULL ||
+ pr->ps_session->s_ttyp->t_dev != (dev_t)arg)
continue;
break;
@@ -1475,7 +1477,7 @@ fill_eproc(struct proc *p, struct eproc *ep)
struct tty *tp;
ep->e_paddr = p;
- ep->e_sess = p->p_pgrp->pg_session;
+ ep->e_sess = p->p_p->ps_pgrp->pg_session;
ep->e_pcred = *p->p_cred;
ep->e_ucred = *p->p_ucred;
if (p->p_stat == SIDL || P_ZOMBIE(p)) {
@@ -1495,13 +1497,13 @@ fill_eproc(struct proc *p, struct eproc *ep)
ep->e_pstats = *p->p_stats;
ep->e_pstats_valid = 1;
}
- if (p->p_pptr)
- ep->e_ppid = p->p_pptr->p_pid;
+ if (p->p_p->ps_pptr)
+ ep->e_ppid = p->p_p->ps_pptr->ps_pid;
else
ep->e_ppid = 0;
- ep->e_pgid = p->p_pgrp->pg_id;
- ep->e_jobc = p->p_pgrp->pg_jobc;
- if ((p->p_flag & P_CONTROLT) &&
+ ep->e_pgid = p->p_p->ps_pgrp->pg_id;
+ ep->e_jobc = p->p_p->ps_pgrp->pg_jobc;
+ if ((p->p_p->ps_flags & PS_CONTROLT) &&
(tp = ep->e_sess->s_ttyp)) {
ep->e_tdev = tp->t_dev;
ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
@@ -1509,7 +1511,7 @@ fill_eproc(struct proc *p, struct eproc *ep)
} else
ep->e_tdev = NODEV;
ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0;
- if (SESS_LEADER(p))
+ if (SESS_LEADER(p->p_p))
ep->e_flag |= EPROC_SLEADER;
strncpy(ep->e_wmesg, p->p_wmesg ? p->p_wmesg : "", WMESGLEN);
ep->e_wmesg[WMESGLEN] = '\0';
@@ -1529,19 +1531,21 @@ fill_eproc(struct proc *p, struct eproc *ep)
void
fill_kproc2(struct proc *p, struct kinfo_proc2 *ki)
{
+ struct process *pr = p->p_p;
+ struct session *s = pr->ps_session;
struct tty *tp;
struct timeval ut, st;
- FILL_KPROC2(ki, strlcpy, p, p->p_p, p->p_cred, p->p_ucred, p->p_pgrp,
- p, p->p_session, p->p_vmspace, p->p_p->ps_limit, p->p_stats);
+ FILL_KPROC2(ki, strlcpy, p, pr, p->p_cred, p->p_ucred, pr->ps_pgrp,
+ p, pr, s, p->p_vmspace, pr->ps_limit, p->p_stats);
/* stuff that's too painful to generalize into the macros */
- if (p->p_pptr)
- ki->p_ppid = p->p_pptr->p_pid;
- if (p->p_session->s_leader)
- ki->p_sid = p->p_session->s_leader->p_pid;
+ if (pr->ps_pptr)
+ ki->p_ppid = pr->ps_pptr->ps_pid;
+ if (s->s_leader)
+ ki->p_sid = s->s_leader->ps_pid;
- if ((p->p_flag & P_CONTROLT) && (tp = p->p_session->s_ttyp)) {
+ if ((pr->ps_flags & PS_CONTROLT) && (tp = s->s_ttyp)) {
ki->p_tdev = tp->t_dev;
ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : -1;
ki->p_tsess = PTRTOINT64(tp->t_session);
diff --git a/sys/kern/spec_vnops.c b/sys/kern/spec_vnops.c
index c1816c58186..11fde4c819b 100644
--- a/sys/kern/spec_vnops.c
+++ b/sys/kern/spec_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spec_vnops.c,v 1.57 2010/05/18 04:41:14 dlg Exp $ */
+/* $OpenBSD: spec_vnops.c,v 1.58 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */
/*
@@ -500,9 +500,9 @@ spec_close(void *v)
* plus the session), release the reference from the session.
*/
if (vcount(vp) == 2 && ap->a_p &&
- vp == ap->a_p->p_session->s_ttyvp) {
+ vp == ap->a_p->p_p->ps_session->s_ttyvp) {
vrele(vp);
- ap->a_p->p_session->s_ttyvp = NULL;
+ ap->a_p->p_p->ps_session->s_ttyvp = NULL;
}
if (cdevsw[major(dev)].d_flags & D_CLONE)
return (spec_close_clone(ap));
diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c
index 5d18a97b55a..30e7dcef6be 100644
--- a/sys/kern/subr_prf.c
+++ b/sys/kern/subr_prf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_prf.c,v 1.74 2008/06/27 17:23:24 miod Exp $ */
+/* $OpenBSD: subr_prf.c,v 1.75 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: subr_prf.c,v 1.45 1997/10/24 18:14:25 chuck Exp $ */
/*-
@@ -357,12 +357,12 @@ kputchar(int c, int flags, struct tty *tp)
void
uprintf(const char *fmt, ...)
{
- struct proc *p = curproc;
+ struct process *pr = curproc->p_p;
va_list ap;
- if (p->p_flag & P_CONTROLT && p->p_session->s_ttyvp) {
+ if (pr->ps_flags & PS_CONTROLT && pr->ps_session->s_ttyvp) {
va_start(ap, fmt);
- kprintf(fmt, TOTTY, p->p_session->s_ttyp, NULL, ap);
+ kprintf(fmt, TOTTY, pr->ps_session->s_ttyp, NULL, ap);
va_end(ap);
}
}
@@ -380,6 +380,7 @@ uprintf(const char *fmt, ...)
/*
* tprintf_open: get a tprintf handle on a process "p"
+ * XXX change s/proc/process
*
* => returns NULL if process can't be printed to
*/
@@ -387,10 +388,11 @@ uprintf(const char *fmt, ...)
tpr_t
tprintf_open(struct proc *p)
{
+ struct process *pr = p->p_p;
- if (p->p_flag & P_CONTROLT && p->p_session->s_ttyvp) {
- SESSHOLD(p->p_session);
- return ((tpr_t) p->p_session);
+ if (pr->ps_flags & PS_CONTROLT && pr->ps_session->s_ttyvp) {
+ SESSHOLD(pr->ps_session);
+ return ((tpr_t)pr->ps_session);
}
return ((tpr_t) NULL);
}
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 73e30f60fa7..9e49c7fa74f 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_generic.c,v 1.69 2010/07/08 20:15:03 deraadt Exp $ */
+/* $OpenBSD: sys_generic.c,v 1.70 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */
/*
@@ -476,12 +476,12 @@ sys_ioctl(struct proc *p, void *v, register_t *retval)
if (tmp <= 0) {
tmp = -tmp;
} else {
- struct proc *p1 = pfind(tmp);
- if (p1 == 0) {
+ struct process *pr = prfind(tmp);
+ if (pr == NULL) {
error = ESRCH;
break;
}
- tmp = p1->p_pgrp->pg_id;
+ tmp = pr->ps_pgrp->pg_id;
}
error = (*fp->f_ops->fo_ioctl)
(fp, TIOCSPGRP, (caddr_t)&tmp, p);
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index d3944c41811..e38e673e7e5 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_process.c,v 1.46 2010/06/26 23:24:45 guenther Exp $ */
+/* $OpenBSD: sys_process.c,v 1.47 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */
/*-
@@ -172,7 +172,7 @@ sys_ptrace(struct proc *p, void *v, register_t *retval)
* not init (because that would create a loop in
* the process graph).
*/
- if (t->p_pid != 1 && inferior(p, t))
+ if (t->p_pid != 1 && inferior(p->p_p, t->p_p))
return (EINVAL);
break;
@@ -217,7 +217,7 @@ sys_ptrace(struct proc *p, void *v, register_t *retval)
/*
* (2) it's not being traced by _you_, or
*/
- if (t->p_pptr != p)
+ if (t->p_p->ps_pptr != p->p_p)
return (EBUSY);
/*
@@ -242,7 +242,7 @@ sys_ptrace(struct proc *p, void *v, register_t *retval)
case PT_TRACE_ME:
/* Just set the trace flag. */
atomic_setbits_int(&t->p_flag, P_TRACED);
- t->p_oppid = t->p_pptr->p_pid;
+ t->p_oppid = t->p_p->ps_pptr->ps_pid;
if (t->p_ptstat == NULL)
t->p_ptstat = malloc(sizeof(*t->p_ptstat),
M_SUBPROC, M_WAITOK);
@@ -387,11 +387,11 @@ sys_ptrace(struct proc *p, void *v, register_t *retval)
#endif
/* give process back to original parent or init */
- if (t->p_oppid != t->p_pptr->p_pid) {
- struct proc *pp;
+ if (t->p_oppid != t->p_p->ps_pptr->ps_pid) {
+ struct process *ppr;
- pp = pfind(t->p_oppid);
- proc_reparent(t, pp ? pp : initproc);
+ ppr = prfind(t->p_oppid);
+ proc_reparent(t->p_p, ppr ? ppr : initproc->p_p);
}
/* not being traced any more */
@@ -432,9 +432,9 @@ sys_ptrace(struct proc *p, void *v, register_t *retval)
* Stop the target.
*/
atomic_setbits_int(&t->p_flag, P_TRACED);
- t->p_oppid = t->p_pptr->p_pid;
- if (t->p_pptr != p)
- proc_reparent(t, p);
+ t->p_oppid = t->p_p->ps_pptr->ps_pid;
+ if (t->p_p->ps_pptr != p->p_p)
+ proc_reparent(t->p_p, p->p_p);
if (t->p_ptstat == NULL)
t->p_ptstat = malloc(sizeof(*t->p_ptstat),
M_SUBPROC, M_WAITOK);
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index d946e0d11cd..c8120bf02c6 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.87 2010/07/02 17:27:01 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.88 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */
/*-
@@ -719,6 +719,7 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
{
extern struct tty *constty; /* Temporary virtual console. */
extern int nlinesw;
+ struct process *pr = p->p_p;
int s, error;
/* If the ioctl involves modification, hang if in the background. */
@@ -747,13 +748,13 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case TIOCSETP:
case TIOCSLTC:
#endif
- while (isbackground(p, tp) &&
+ while (isbackground(pr, tp) &&
(p->p_flag & P_PPWAIT) == 0 &&
(p->p_sigignore & sigmask(SIGTTOU)) == 0 &&
(p->p_sigmask & sigmask(SIGTTOU)) == 0) {
- if (p->p_pgrp->pg_jobc == 0)
+ if (pr->ps_pgrp->pg_jobc == 0)
return (EIO);
- pgsignal(p->p_pgrp, SIGTTOU, 1);
+ pgsignal(pr->ps_pgrp, SIGTTOU, 1);
error = ttysleep(tp, &lbolt, TTOPRI | PCATCH,
ttybg, 0);
if (error)
@@ -841,7 +842,7 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
splx(s);
break;
case TIOCGPGRP: /* get pgrp of tty */
- if (!isctty(p, tp) && suser(p, 0))
+ if (!isctty(pr, tp) && suser(p, 0))
return (ENOTTY);
*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
break;
@@ -901,7 +902,7 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
tp->t_ospeed = t->c_ospeed;
if (t->c_ospeed == 0 && tp->t_session &&
tp->t_session->s_leader)
- psignal(tp->t_session->s_leader,
+ prsignal(tp->t_session->s_leader,
SIGHUP);
}
ttsetwater(tp);
@@ -970,7 +971,7 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case TIOCSTI: /* simulate terminal input */
if (p->p_ucred->cr_uid && (flag & FREAD) == 0)
return (EPERM);
- if (p->p_ucred->cr_uid && !isctty(p, tp))
+ if (p->p_ucred->cr_uid && !isctty(pr, tp))
return (EACCES);
(*linesw[tp->t_line].l_rint)(*(u_char *)data, tp);
break;
@@ -984,26 +985,26 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
break;
case TIOCSCTTY: /* become controlling tty */
/* Session ctty vnode pointer set in vnode layer. */
- if (!SESS_LEADER(p) ||
- ((p->p_session->s_ttyvp || tp->t_session) &&
- (tp->t_session != p->p_session)))
+ if (!SESS_LEADER(pr) ||
+ ((pr->ps_session->s_ttyvp || tp->t_session) &&
+ (tp->t_session != pr->ps_session)))
return (EPERM);
if (tp->t_session)
SESSRELE(tp->t_session);
- SESSHOLD(p->p_session);
- tp->t_session = p->p_session;
- tp->t_pgrp = p->p_pgrp;
- p->p_session->s_ttyp = tp;
- atomic_setbits_int(&p->p_flag, P_CONTROLT);
+ SESSHOLD(pr->ps_session);
+ tp->t_session = pr->ps_session;
+ tp->t_pgrp = pr->ps_pgrp;
+ pr->ps_session->s_ttyp = tp;
+ atomic_setbits_int(&pr->ps_flags, PS_CONTROLT);
break;
case TIOCSPGRP: { /* set pgrp of tty */
struct pgrp *pgrp = pgfind(*(int *)data);
- if (!isctty(p, tp))
+ if (!isctty(pr, tp))
return (ENOTTY);
else if (pgrp == NULL)
return (EINVAL);
- else if (pgrp->pg_session != p->p_session)
+ else if (pgrp->pg_session != pr->ps_session)
return (EPERM);
tp->t_pgrp = pgrp;
break;
@@ -1363,7 +1364,7 @@ ttymodem(struct tty *tp, int flag)
if (ISSET(tp->t_state, TS_ISOPEN) &&
!ISSET(tp->t_cflag, CLOCAL)) {
if (tp->t_session && tp->t_session->s_leader)
- psignal(tp->t_session->s_leader, SIGHUP);
+ prsignal(tp->t_session->s_leader, SIGHUP);
ttyflush(tp, FREAD | FWRITE);
return (0);
}
@@ -1392,7 +1393,7 @@ nullmodem(struct tty *tp, int flag)
if (ISSET(tp->t_state, TS_ISOPEN) &&
!ISSET(tp->t_cflag, CLOCAL)) {
if (tp->t_session && tp->t_session->s_leader)
- psignal(tp->t_session->s_leader, SIGHUP);
+ prsignal(tp->t_session->s_leader, SIGHUP);
ttyflush(tp, FREAD | FWRITE);
return (0);
}
@@ -1440,6 +1441,7 @@ ttread(struct tty *tp, struct uio *uio, int flag)
{
struct timeout *stime = NULL;
struct proc *p = curproc;
+ struct process *pr = p->p_p;
int s, first, error = 0;
u_char *cc = tp->t_cc;
struct clist *qp;
@@ -1459,14 +1461,14 @@ loop: lflag = tp->t_lflag;
/*
* Hang process if it's in the background.
*/
- if (isbackground(p, tp)) {
+ if (isbackground(pr, tp)) {
if ((p->p_sigignore & sigmask(SIGTTIN)) ||
(p->p_sigmask & sigmask(SIGTTIN)) ||
- p->p_flag & P_PPWAIT || p->p_pgrp->pg_jobc == 0) {
+ p->p_flag & P_PPWAIT || pr->ps_pgrp->pg_jobc == 0) {
error = EIO;
goto out;
}
- pgsignal(p->p_pgrp, SIGTTIN, 1);
+ pgsignal(pr->ps_pgrp, SIGTTIN, 1);
error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
if (error)
goto out;
@@ -1678,6 +1680,7 @@ ttwrite(struct tty *tp, struct uio *uio, int flag)
u_char *cp = NULL;
int cc, ce, obufcc = 0;
struct proc *p;
+ struct process *pr;
int i, hiwat, error, s;
size_t cnt;
u_char obuf[OBUFSIZ];
@@ -1713,15 +1716,16 @@ loop:
* Hang the process if it's in the background.
*/
p = curproc;
- if (isbackground(p, tp) &&
+ pr = p->p_p;
+ if (isbackground(pr, tp) &&
ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
(p->p_sigignore & sigmask(SIGTTOU)) == 0 &&
(p->p_sigmask & sigmask(SIGTTOU)) == 0) {
- if (p->p_pgrp->pg_jobc == 0) {
+ if (pr->ps_pgrp->pg_jobc == 0) {
error = EIO;
goto out;
}
- pgsignal(p->p_pgrp, SIGTTOU, 1);
+ pgsignal(pr->ps_pgrp, SIGTTOU, 1);
error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
if (error)
goto out;
@@ -2079,7 +2083,8 @@ ttsetwater(struct tty *tp)
void
ttyinfo(struct tty *tp)
{
- struct proc *p, *pick;
+ struct process *pr;
+ struct proc *pick;
struct timeval utime, stime;
int tmp;
@@ -2094,16 +2099,16 @@ ttyinfo(struct tty *tp)
ttyprintf(tp, "not a controlling terminal\n");
else if (tp->t_pgrp == NULL)
ttyprintf(tp, "no foreground process group\n");
- else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
+ else if ((pr = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
ttyprintf(tp, "empty foreground process group\n");
else {
int pctcpu;
long rss;
/* Pick interesting process. */
- for (pick = NULL; p != 0; p = LIST_NEXT(p, p_pglist))
- if (proc_compare(pick, p))
- pick = p;
+ for (pick = NULL; pr != NULL; pr = LIST_NEXT(pr, ps_pglist))
+ if (proc_compare(pick, pr->ps_mainproc))
+ pick = pr->ps_mainproc;
/* Calculate percentage cpu, resident set size. */
pctcpu = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c
index 810ddff7070..5ea88c167fd 100644
--- a/sys/kern/tty_pty.c
+++ b/sys/kern/tty_pty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty_pty.c,v 1.49 2010/07/21 18:48:01 nicm Exp $ */
+/* $OpenBSD: tty_pty.c,v 1.50 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: tty_pty.c,v 1.33.4.1 1996/06/02 09:08:11 mrg Exp $ */
/*
@@ -283,19 +283,20 @@ int
ptsread(dev_t dev, struct uio *uio, int flag)
{
struct proc *p = curproc;
+ struct process *pr = p->p_p;
struct pt_softc *pti = pt_softc[minor(dev)];
struct tty *tp = pti->pt_tty;
int error = 0;
again:
if (pti->pt_flags & PF_REMOTE) {
- while (isbackground(p, tp)) {
+ while (isbackground(pr, tp)) {
if ((p->p_sigignore & sigmask(SIGTTIN)) ||
(p->p_sigmask & sigmask(SIGTTIN)) ||
- p->p_pgrp->pg_jobc == 0 ||
+ pr->ps_pgrp->pg_jobc == 0 ||
p->p_flag & P_PPWAIT)
return (EIO);
- pgsignal(p->p_pgrp, SIGTTIN, 1);
+ pgsignal(pr->ps_pgrp, SIGTTIN, 1);
error = ttysleep(tp, &lbolt,
TTIPRI | PCATCH, ttybg, 0);
if (error)
diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c
index e2a4b4accbb..2a410b10456 100644
--- a/sys/kern/tty_tty.c
+++ b/sys/kern/tty_tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty_tty.c,v 1.10 2007/03/15 10:22:30 art Exp $ */
+/* $OpenBSD: tty_tty.c,v 1.11 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: tty_tty.c,v 1.13 1996/03/30 22:24:46 christos Exp $ */
/*-
@@ -45,7 +45,9 @@
#include <sys/conf.h>
-#define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL)
+#define cttyvp(p) \
+ ((p)->p_p->ps_flags & PS_CONTROLT ? \
+ (p)->p_p->ps_session->s_ttyvp : NULL)
/*ARGSUSED*/
int
@@ -118,8 +120,8 @@ cttyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
if (cmd == TIOCSCTTY) /* XXX */
return (EINVAL);
if (cmd == TIOCNOTTY) {
- if (!SESS_LEADER(p)) {
- atomic_clearbits_int(&p->p_flag, P_CONTROLT);
+ if (!SESS_LEADER(p->p_p)) {
+ atomic_clearbits_int(&p->p_p->ps_flags, PS_CONTROLT);
return (0);
} else
return (EINVAL);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index f6f5e28d1f3..d92dd347348 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_vnops.c,v 1.64 2010/01/08 19:18:21 stsp Exp $ */
+/* $OpenBSD: vfs_vnops.c,v 1.65 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: vfs_vnops.c,v 1.20 1996/02/04 02:18:41 christos Exp $ */
/*
@@ -435,9 +435,10 @@ vn_ioctl(struct file *fp, u_long com, caddr_t data, struct proc *p)
case VBLK:
error = VOP_IOCTL(vp, com, data, fp->f_flag, p->p_ucred, p);
if (error == 0 && com == TIOCSCTTY) {
- if (p->p_session->s_ttyvp)
- vrele(p->p_session->s_ttyvp);
- p->p_session->s_ttyvp = vp;
+ struct session *s = p->p_p->ps_session;
+ if (s->s_ttyvp)
+ vrele(s->s_ttyvp);
+ s->s_ttyvp = vp;
vref(vp);
}
return (error);
diff --git a/sys/miscfs/procfs/procfs_ctl.c b/sys/miscfs/procfs/procfs_ctl.c
index b2d5a1ce74c..0fed64e4fc6 100644
--- a/sys/miscfs/procfs/procfs_ctl.c
+++ b/sys/miscfs/procfs/procfs_ctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_ctl.c,v 1.21 2007/06/18 08:30:07 jasper Exp $ */
+/* $OpenBSD: procfs_ctl.c,v 1.22 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: procfs_ctl.c,v 1.14 1996/02/09 22:40:48 christos Exp $ */
/*
@@ -57,7 +57,7 @@
*/
#define TRACE_WAIT_P(curp, p) \
((p)->p_stat == SSTOP && \
- (p)->p_pptr == (curp) && \
+ (p)->p_p->ps_pptr == (curp)->p_p && \
ISSET((p)->p_flag, P_TRACED))
#ifdef PTRACE
@@ -137,9 +137,9 @@ procfs_control(struct proc *curp, struct proc *p, int op)
*/
atomic_setbits_int(&p->p_flag, P_TRACED);
p->p_xstat = 0; /* XXX ? */
- if (p->p_pptr != curp) {
- p->p_oppid = p->p_pptr->p_pid;
- proc_reparent(p, curp);
+ if (p->p_p->ps_pptr != curp->p_p) {
+ p->p_oppid = p->p_p->ps_pptr->ps_pid;
+ proc_reparent(p->p_p, curp->p_p);
}
psignal(p, SIGSTOP);
return (0);
@@ -187,12 +187,12 @@ procfs_control(struct proc *curp, struct proc *p, int op)
atomic_clearbits_int(&p->p_flag, P_TRACED);
/* give process back to original parent */
- if (p->p_oppid != p->p_pptr->p_pid) {
- struct proc *pp;
+ if (p->p_oppid != p->p_p->ps_pptr->ps_pid) {
+ struct process *ppr;
- pp = pfind(p->p_oppid);
- if (pp)
- proc_reparent(p, pp);
+ ppr = prfind(p->p_oppid);
+ if (ppr)
+ proc_reparent(p->p_p, ppr);
}
p->p_oppid = 0;
@@ -232,7 +232,7 @@ procfs_control(struct proc *curp, struct proc *p, int op)
while (error == 0 &&
(p->p_stat != SSTOP) &&
ISSET(p->p_flag, P_TRACED) &&
- (p->p_pptr == curp)) {
+ (p->p_p->ps_pptr == curp->p_p)) {
error = tsleep(p, PWAIT|PCATCH, "procfsx", 0);
}
if (error == 0 && !TRACE_WAIT_P(curp, p))
diff --git a/sys/miscfs/procfs/procfs_status.c b/sys/miscfs/procfs/procfs_status.c
index 0a6fbb47fff..0a629e92a04 100644
--- a/sys/miscfs/procfs/procfs_status.c
+++ b/sys/miscfs/procfs/procfs_status.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_status.c,v 1.10 2007/06/18 08:30:07 jasper Exp $ */
+/* $OpenBSD: procfs_status.c,v 1.11 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: procfs_status.c,v 1.11 1996/03/16 23:52:50 christos Exp $ */
/*
@@ -64,6 +64,7 @@ int procfs_stat_gen(struct proc *, char *s, int);
int
procfs_stat_gen(struct proc *p, char *s, int l)
{
+ struct process *pr = p->p_p;
struct session *sess;
struct tty *tp;
struct ucred *cr;
@@ -72,11 +73,11 @@ procfs_stat_gen(struct proc *p, char *s, int l)
char ps[256], *sep;
int i, n;
- pid = p->p_pid;
- ppid = p->p_pptr ? p->p_pptr->p_pid : 0;
- pgid = p->p_pgrp->pg_id;
- sess = p->p_pgrp->pg_session;
- sid = sess->s_leader ? sess->s_leader->p_pid : 0;
+ pid = pr->ps_pid;
+ ppid = pr->ps_pptr ? pr->ps_pptr->ps_pid : 0;
+ pgid = pr->ps_pgrp->pg_id;
+ sess = pr->ps_pgrp->pg_session;
+ sid = sess->s_leader ? sess->s_leader->ps_pid : 0;
n = 0;
if (s)
@@ -90,7 +91,7 @@ procfs_stat_gen(struct proc *p, char *s, int l)
pid, ppid, pgid, sid);
COUNTORCAT(s, l, ps, n);
- if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp))
+ if ((pr->ps_flags & PS_CONTROLT) && (tp = sess->s_ttyp))
snprintf(ps, sizeof(ps), "%d,%d ",
major(tp->t_dev), minor(tp->t_dev));
else
@@ -105,7 +106,7 @@ procfs_stat_gen(struct proc *p, char *s, int l)
COUNTORCAT(s, l, ps, n);
}
- if (SESS_LEADER(p)) {
+ if (SESS_LEADER(pr)) {
snprintf(ps, sizeof(ps), "%ssldr", sep);
sep = ",";
COUNTORCAT(s, l, ps, n);
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index c1816c58186..11fde4c819b 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spec_vnops.c,v 1.57 2010/05/18 04:41:14 dlg Exp $ */
+/* $OpenBSD: spec_vnops.c,v 1.58 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */
/*
@@ -500,9 +500,9 @@ spec_close(void *v)
* plus the session), release the reference from the session.
*/
if (vcount(vp) == 2 && ap->a_p &&
- vp == ap->a_p->p_session->s_ttyvp) {
+ vp == ap->a_p->p_p->ps_session->s_ttyvp) {
vrele(vp);
- ap->a_p->p_session->s_ttyvp = NULL;
+ ap->a_p->p_p->ps_session->s_ttyvp = NULL;
}
if (cdevsw[major(dev)].d_flags & D_CLONE)
return (spec_close_clone(ap));
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 3e857da868e..b04820ec06e 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: proc.h,v 1.131 2010/07/19 23:00:15 guenther Exp $ */
+/* $OpenBSD: proc.h,v 1.132 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */
/*-
@@ -41,9 +41,9 @@
#define _SYS_PROC_H_
#include <machine/proc.h> /* Machine-dependent proc substruct. */
-#include <sys/selinfo.h> /* For struct selinfo. */
+#include <sys/selinfo.h> /* For struct selinfo */
#include <sys/queue.h>
-#include <sys/timeout.h> /* For struct timeout. */
+#include <sys/timeout.h> /* For struct timeout */
#include <sys/event.h> /* For struct klist */
#include <sys/mutex.h> /* For struct mutex */
#include <machine/atomic.h>
@@ -55,9 +55,10 @@
/*
* One structure allocated per session.
*/
+struct process;
struct session {
int s_count; /* Ref cnt; pgrps in session. */
- struct proc *s_leader; /* Session leader. */
+ struct process *s_leader; /* Session leader. */
struct vnode *s_ttyvp; /* Vnode of controlling terminal. */
struct tty *s_ttyp; /* Controlling terminal. */
char s_login[MAXLOGNAME]; /* Setlogin() name. */
@@ -68,7 +69,7 @@ struct session {
*/
struct pgrp {
LIST_ENTRY(pgrp) pg_hash; /* Hash chain. */
- LIST_HEAD(, proc) pg_members; /* Pointer to pgrp members. */
+ LIST_HEAD(, process) pg_members;/* Pointer to pgrp members. */
struct session *pg_session; /* Pointer to session. */
pid_t pg_id; /* Pgrp id. */
int pg_jobc; /* # procs qualifying pgrp for job control */
@@ -78,6 +79,7 @@ struct pgrp {
* One structure allocated per emulation.
*/
struct exec_package;
+struct proc;
struct ps_strings;
struct uvm_object;
union sigval;
@@ -138,14 +140,20 @@ struct process {
* the pid of the process. This is gross, but considering the horrible
* pid semantics we have right now, it's unavoidable.
*/
- struct proc *ps_mainproc;
+ struct proc *ps_mainproc;
struct pcred *ps_cred; /* Process owner's identity. */
TAILQ_HEAD(,proc) ps_threads; /* Threads in this process. */
+ LIST_ENTRY(process) ps_pglist; /* List of processes in pgrp. */
+ struct process *ps_pptr; /* Pointer to parent process. */
+ LIST_ENTRY(process) ps_sibling; /* List of sibling processes. */
+ LIST_HEAD(, process) ps_children;/* Pointer to list of children. */
+
/* The following fields are all zeroed upon creation in process_new. */
#define ps_startzero ps_klist
struct klist ps_klist; /* knotes attached to this process */
+ int ps_flags; /* PS_* flags. */
/* End area that is zeroed on creation. */
#define ps_endzero ps_startcopy
@@ -154,6 +162,7 @@ struct process {
#define ps_startcopy ps_limit
struct plimit *ps_limit; /* Process limits. */
+ struct pgrp *ps_pgrp; /* Pointer to process group. */
u_int ps_rtableid; /* Process routing table/domain. */
/* End area that is copied on creation. */
@@ -161,9 +170,35 @@ struct process {
int ps_refcnt; /* Number of references. */
};
-#else
-struct process;
-#endif
+
+#define ps_pid ps_mainproc->p_pid
+#define ps_session ps_pgrp->pg_session
+#define ps_pgid ps_pgrp->pg_id
+
+/*
+ * These flags are kept in ps_flags, but they used to be in proc's p_flag
+ * and were exported to userspace via the KERN_PROC2 sysctl. We'll retain
+ * compat by using non-overlapping bits for PS_* and P_* flags and just
+ * OR them together for export.
+ */
+#define PS_CONTROLT _P_CONTROLT
+#define PS_NOCLDSTOP _P_NOCLDSTOP
+#define PS_PPWAIT _P_PPWAIT
+#define PS_PROFIL _P_PROFIL
+#define PS_SUGID _P_SUGID
+#define PS_SYSTEM _P_SYSTEM
+#define PS_TRACED _P_TRACED
+#define PS_WAITED _P_WAITED
+#define PS_EXEC _P_EXEC
+#define PS_SUGIDEXEC _P_SUGIDEXEC
+#define PS_NOCLDWAIT _P_NOCLDWAIT
+#define PS_NOZOMBIE _P_NOZOMBIE
+#define PS_INEXEC _P_INEXEC
+#define PS_SYSTRACE _P_SYSTRACE
+#define PS_CONTINUED _P_CONTINUED
+#define PS_STOPPED _P_STOPPED
+
+#endif /* __need_process */
struct proc {
TAILQ_ENTRY(proc) p_runq;
@@ -190,10 +225,6 @@ struct proc {
pid_t p_pid; /* Process identifier. */
LIST_ENTRY(proc) p_hash; /* Hash chain. */
- LIST_ENTRY(proc) p_pglist; /* List of processes in pgrp. */
- struct proc *p_pptr; /* Pointer to parent process. */
- LIST_ENTRY(proc) p_sibling; /* List of sibling processes. */
- LIST_HEAD(, proc) p_children; /* Pointer to list of children. */
/* The following fields are all zeroed upon creation in fork. */
#define p_startzero p_oppid
@@ -256,7 +287,6 @@ struct proc {
char p_comm[MAXCOMLEN+1];
struct emul *p_emul; /* Emulation information */
- struct pgrp *p_pgrp; /* Pointer to process group. */
vaddr_t p_sigcode; /* user pointer to the signal code. */
/* End area that is copied on creation. */
@@ -270,9 +300,6 @@ struct proc {
struct rusage *p_ru; /* Exit information. XXX */
};
-#define p_session p_pgrp->pg_session
-#define p_pgid p_pgrp->pg_id
-
/* Status values. */
#define SIDL 1 /* Process being created by fork. */
#define SRUN 2 /* Currently runnable. */
@@ -284,8 +311,11 @@ struct proc {
#define P_ZOMBIE(p) ((p)->p_stat == SZOMB || (p)->p_stat == SDEAD)
-/* These flags are kept in p_flag. */
-#define P_CONTROLT 0x000002 /* Has a controlling terminal. */
+/*
+ * These flags are kept in p_flag, except those with a leading underbar,
+ * which are in process's ps_flags
+ */
+#define _P_CONTROLT 0x000002 /* Has a controlling terminal. */
#define P_INMEM 0x000004 /* Loaded into memory. UNUSED */
#define P_NOCLDSTOP 0x000008 /* No SIGCHLD when children stop. */
#define P_PPWAIT 0x000010 /* Parent waits for child exec/exit. */
@@ -320,6 +350,10 @@ struct proc {
#define P_STOPPED 0x20000000 /* Just stopped. */
#define P_CPUPEG 0x40000000 /* Do not move to another cpu. */
+#ifndef _KERNEL
+#define P_CONTROLT _P_CONTROLT
+#endif
+
#define P_BITS \
("\20\02CONTROLT\03INMEM\04NOCLDSTOP\05PPWAIT\06PROFIL\07SELECT" \
"\010SINTR\011SUGID\012SYSTEM\013TIMEOUT\014TRACED\015WAITED\016WEXIT" \
@@ -366,7 +400,7 @@ struct uidinfo *uid_find(uid_t);
#define NO_PID (PID_MAX+1)
#define THREAD_PID_OFFSET 1000000
-#define SESS_LEADER(p) ((p)->p_session->s_leader == (p))
+#define SESS_LEADER(pr) ((pr)->ps_session->s_leader == (pr))
#define SESSHOLD(s) ((s)->s_count++)
#define SESSRELE(s) do { \
if (--(s)->s_count == 0) \
@@ -420,19 +454,19 @@ extern struct pool pcred_pool; /* memory pool for pcreds */
struct simplelock;
-struct proc *pfind(pid_t); /* Find process by id. */
+struct process *prfind(pid_t); /* Find process by id. */
+struct proc *pfind(pid_t); /* Find thread by id. */
struct pgrp *pgfind(pid_t); /* Find process group by id. */
void proc_printit(struct proc *p, const char *modif,
int (*pr)(const char *, ...));
int chgproccnt(uid_t uid, int diff);
-int enterpgrp(struct proc *p, pid_t pgid, struct pgrp *newpgrp,
- struct session *newsess);
-void fixjobc(struct proc *p, struct pgrp *pgrp, int entering);
-int inferior(struct proc *, struct proc *);
-int leavepgrp(struct proc *p);
+int enterpgrp(struct process *, pid_t, struct pgrp *, struct session *);
+void fixjobc(struct process *, struct pgrp *, int);
+int inferior(struct process *, struct process *);
+void leavepgrp(struct process *);
void preempt(struct proc *);
-void pgdelete(struct pgrp *pgrp);
+void pgdelete(struct pgrp *);
void procinit(void);
void resetpriority(struct proc *);
void setrunnable(struct proc *);
diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h
index 78599a2b56c..4baebcd3aca 100644
--- a/sys/sys/ptrace.h
+++ b/sys/sys/ptrace.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ptrace.h,v 1.11 2008/09/16 19:41:06 kettenis Exp $ */
+/* $OpenBSD: ptrace.h,v 1.12 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: ptrace.h,v 1.21 1996/02/09 18:25:26 christos Exp $ */
/*-
@@ -96,7 +96,7 @@ struct reg;
struct fpreg;
#endif
-void proc_reparent(struct proc *child, struct proc *newparent);
+void proc_reparent(struct process *child, struct process *newparent);
#ifdef PT_GETFPREGS
int process_read_fpregs(struct proc *p, struct fpreg *regs);
#endif
diff --git a/sys/sys/resource.h b/sys/sys/resource.h
index 46577eef8f2..0e112a87818 100644
--- a/sys/sys/resource.h
+++ b/sys/sys/resource.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: resource.h,v 1.7 2003/12/11 23:02:30 millert Exp $ */
+/* $OpenBSD: resource.h,v 1.8 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: resource.h,v 1.14 1996/02/09 18:25:27 christos Exp $ */
/*
@@ -51,6 +51,7 @@
#define RUSAGE_SELF 0
#define RUSAGE_CHILDREN -1
+#define RUSAGE_THREAD 1
struct rusage {
struct timeval ru_utime; /* user time used */
@@ -110,8 +111,9 @@ struct loadavg {
#ifdef _KERNEL
extern struct loadavg averunnable;
+struct process;
int dosetrlimit(struct proc *, u_int, struct rlimit *);
-int donice(struct proc *, struct proc *, int);
+int donice(struct proc *, struct process *, int);
#else
#include <sys/cdefs.h>
diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h
index 5fa4ef65704..27b2293694d 100644
--- a/sys/sys/signalvar.h
+++ b/sys/sys/signalvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: signalvar.h,v 1.18 2009/11/27 19:47:45 guenther Exp $ */
+/* $OpenBSD: signalvar.h,v 1.19 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: signalvar.h,v 1.17 1996/04/22 01:23:31 christos Exp $ */
/*
@@ -164,6 +164,7 @@ void pgsignal(struct pgrp *pgrp, int sig, int checkctty);
void postsig(int sig);
void psignal(struct proc *p, int sig);
void ptsignal(struct proc *p, int sig, enum signal_type type);
+#define prsignal(pr,sig) ptsignal((pr)->ps_mainproc, (sig), SPROCESS)
void siginit(struct proc *p);
void trapsignal(struct proc *p, int sig, u_long code, int type,
union sigval val);
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 14c23d18730..4eec998f10d 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.104 2010/06/29 00:28:14 tedu Exp $ */
+/* $OpenBSD: sysctl.h,v 1.105 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -499,7 +499,7 @@ struct kinfo_proc2 {
#define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
-#define FILL_KPROC2(kp, copy_str, p, pr, pc, uc, pg, paddr, sess, vm, lim, ps) \
+#define FILL_KPROC2(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, lim, ps) \
do { \
memset((kp), 0, sizeof(*(kp))); \
\
@@ -509,11 +509,11 @@ do { \
(kp)->p_limit = PTRTOINT64((pr)->ps_limit); \
(kp)->p_vmspace = PTRTOINT64((p)->p_vmspace); \
(kp)->p_sigacts = PTRTOINT64((p)->p_sigacts); \
- (kp)->p_sess = PTRTOINT64((p)->p_session); \
+ (kp)->p_sess = PTRTOINT64((pr)->ps_session); \
(kp)->p_ru = PTRTOINT64((p)->p_ru); \
\
(kp)->p_exitsig = (p)->p_exitsig; \
- (kp)->p_flag = (p)->p_flag | P_INMEM; \
+ (kp)->p_flag = (p)->p_flag | (pr)->ps_flags | P_INMEM; \
\
(kp)->p_pid = (p)->p_pid; \
(kp)->p__pgid = (pg)->pg_id; \
@@ -564,7 +564,7 @@ do { \
\
if ((sess)->s_ttyvp) \
(kp)->p_eflag |= EPROC_CTTY; \
- if ((sess)->s_leader == (paddr)) \
+ if ((sess)->s_leader == (praddr)) \
(kp)->p_eflag |= EPROC_SLEADER; \
\
if ((p)->p_stat != SIDL && !P_ZOMBIE(p)) { \
diff --git a/sys/sys/tty.h b/sys/sys/tty.h
index d288a688b36..4ddc153c007 100644
--- a/sys/sys/tty.h
+++ b/sys/sys/tty.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.h,v 1.28 2010/07/02 19:57:15 tedu Exp $ */
+/* $OpenBSD: tty.h,v 1.29 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: tty.h,v 1.30.4.1 1996/06/02 09:08:13 mrg Exp $ */
/*-
@@ -228,13 +228,13 @@ struct speedtab {
#define TTY_FE 0x01000000 /* Framing error or BREAK condition */
#define TTY_PE 0x02000000 /* Parity error */
-/* Is tp controlling terminal for p? */
-#define isctty(p, tp) \
- ((p)->p_session == (tp)->t_session && (p)->p_flag & P_CONTROLT)
+/* Is tp controlling terminal for pr? */
+#define isctty(pr, tp) \
+ ((pr)->ps_session == (tp)->t_session && (pr)->ps_flags & PS_CONTROLT)
-/* Is p in background of tp? */
-#define isbackground(p, tp) \
- (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp)
+/* Is pr in background of tp? */
+#define isbackground(pr, tp) \
+ (isctty((pr), (tp)) && (pr)->ps_pgrp != (tp)->t_pgrp)
/*
* ttylist_head is defined here so that user-land has access to it.
diff --git a/sys/sys/uio.h b/sys/sys/uio.h
index c05b348fd61..e6e2676e4c2 100644
--- a/sys/sys/uio.h
+++ b/sys/sys/uio.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: uio.h,v 1.14 2009/06/04 00:24:01 blambert Exp $ */
+/* $OpenBSD: uio.h,v 1.15 2010/07/26 01:56:27 guenther Exp $ */
/* $NetBSD: uio.h,v 1.12 1996/02/09 18:25:45 christos Exp $ */
/*
@@ -56,7 +56,7 @@ struct uio {
size_t uio_resid; /* residual i/o count */
enum uio_seg uio_segflg; /* see above */
enum uio_rw uio_rw; /* see above */
- struct proc *uio_procp;/* associated process or NULL */
+ struct proc *uio_procp;/* associated thread or NULL */
};
/*