summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2012-03-23 15:51:27 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2012-03-23 15:51:27 +0000
commit3a829b1c12609aae928c035b8f17ae238f6e809b (patch)
tree5ad109cbb6d1159db7d5a8d765f4995f015b7155
parentfe805d3568ba38f32e5785ef64ed5e07e2d1df00 (diff)
Make rusage totals, itimers, and profile settings per-process instead
of per-rthread. Handling of per-thread tick and runtime counters inspired by how FreeBSD does it. ok kettenis@
-rw-r--r--lib/libkvm/kvm_proc2.c10
-rw-r--r--sys/arch/alpha/alpha/clock.c6
-rw-r--r--sys/arch/i386/i386/machdep.c4
-rw-r--r--sys/arch/m88k/m88k/m88k_machdep.c4
-rw-r--r--sys/arch/solbourne/solbourne/machdep.c4
-rw-r--r--sys/arch/sparc/sparc/machdep.c4
-rw-r--r--sys/arch/sparc64/sparc64/db_interface.c6
-rw-r--r--sys/arch/sparc64/sparc64/machdep.c4
-rw-r--r--sys/compat/linux/linux_misc.c29
-rw-r--r--sys/kern/init_main.c12
-rw-r--r--sys/kern/kern_acct.c27
-rw-r--r--sys/kern/kern_clock.c29
-rw-r--r--sys/kern/kern_exec.c13
-rw-r--r--sys/kern/kern_exit.c54
-rw-r--r--sys/kern/kern_fork.c13
-rw-r--r--sys/kern/kern_resource.c91
-rw-r--r--sys/kern/kern_sched.c4
-rw-r--r--sys/kern/kern_sig.c6
-rw-r--r--sys/kern/kern_synch.c4
-rw-r--r--sys/kern/kern_sysctl.c6
-rw-r--r--sys/kern/kern_time.c48
-rw-r--r--sys/kern/sched_bsd.c18
-rw-r--r--sys/kern/subr_prof.c12
-rw-r--r--sys/kern/tty.c4
-rw-r--r--sys/kern/uipc_socket.c6
-rw-r--r--sys/kern/vfs_bio.c10
-rw-r--r--sys/miscfs/procfs/procfs_status.c6
-rw-r--r--sys/nfs/nfs_vnops.c6
-rw-r--r--sys/sys/proc.h47
-rw-r--r--sys/sys/resourcevar.h37
-rw-r--r--sys/sys/sysctl.h53
-rw-r--r--sys/sys/user.h4
-rw-r--r--sys/ufs/ext2fs/ext2fs_bmap.c4
-rw-r--r--sys/ufs/ext2fs/ext2fs_inode.c4
-rw-r--r--sys/ufs/ffs/ffs_inode.c4
-rw-r--r--sys/ufs/ufs/ufs_bmap.c4
-rw-r--r--sys/uvm/uvm_fault.c10
-rw-r--r--sys/uvm/uvm_glue.c18
38 files changed, 322 insertions, 303 deletions
diff --git a/lib/libkvm/kvm_proc2.c b/lib/libkvm/kvm_proc2.c
index f98c7db2ebc..f4306bf691b 100644
--- a/lib/libkvm/kvm_proc2.c
+++ b/lib/libkvm/kvm_proc2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc2.c,v 1.9 2012/01/07 05:38:12 guenther Exp $ */
+/* $OpenBSD: kvm_proc2.c,v 1.10 2012/03/23 15:51:25 guenther Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -117,7 +117,6 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
struct sigacts sa, *sap;
struct vmspace vm, *vmp;
struct plimit limits, *limp;
- struct pstats pstats, *ps;
pid_t process_pid, parent_pid, leader_pid;
int cnt = 0;
@@ -282,14 +281,9 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
KREAD(kd, (u_long)process.ps_limit, &limits))
limp = NULL;
- ps = &pstats;
- if (P_ZOMBIE(&proc) ||
- KREAD(kd, (u_long)proc.p_stats, &pstats))
- ps = NULL;
-
#define do_copy_str(_d, _s, _l) kvm_read(kd, (u_long)(_s), (_d), (_l)-1)
FILL_KPROC(&kp, do_copy_str, &proc, &process, &pcred, &ucred,
- &pgrp, p, proc.p_p, &sess, vmp, limp, ps, sap);
+ &pgrp, p, proc.p_p, &sess, vmp, limp, sap);
#undef do_copy_str
/* stuff that's too painful to generalize into the macros */
diff --git a/sys/arch/alpha/alpha/clock.c b/sys/arch/alpha/alpha/clock.c
index 9f4fbeb4fd7..e8c8db02f79 100644
--- a/sys/arch/alpha/alpha/clock.c
+++ b/sys/arch/alpha/alpha/clock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clock.c,v 1.20 2010/09/20 06:33:46 matthew Exp $ */
+/* $OpenBSD: clock.c,v 1.21 2012/03/23 15:51:25 guenther Exp $ */
/* $NetBSD: clock.c,v 1.29 2000/06/05 21:47:10 thorpej Exp $ */
/*
@@ -126,8 +126,8 @@ cpu_initclocks(void)
* PALcode save a clock interrupt, which would get delivered
* when we spl0() in autoconf.c. If established the clock
* interrupt handler earlier, that interrupt would go to
- * hardclock, which would then fall over because p->p_stats
- * isn't set at that time.
+ * hardclock, which would then fall over because the pointer
+ * to the virtual timers wasn't set at that time.
*/
platform.clockintr = hardclock;
schedhz = 16;
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index 1e07d7bc885..4dba2b20078 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.507 2012/03/19 00:49:08 jsg Exp $ */
+/* $OpenBSD: machdep.c,v 1.508 2012/03/23 15:51:25 guenther Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -2458,7 +2458,7 @@ boot(int howto)
if ((howto & RB_NOSYNC) == 0 && waittime < 0) {
extern struct proc proc0;
- /* protect against curproc->p_stats.foo refs in sync() XXX */
+ /* make sure there's a process to charge for I/O in sync() */
if (curproc == NULL)
curproc = &proc0;
diff --git a/sys/arch/m88k/m88k/m88k_machdep.c b/sys/arch/m88k/m88k/m88k_machdep.c
index 89ddb045343..8b94310e7dc 100644
--- a/sys/arch/m88k/m88k/m88k_machdep.c
+++ b/sys/arch/m88k/m88k/m88k_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: m88k_machdep.c,v 1.51 2010/12/23 20:05:08 miod Exp $ */
+/* $OpenBSD: m88k_machdep.c,v 1.52 2012/03/23 15:51:26 guenther Exp $ */
/*
* Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr.
* Copyright (c) 1996 Nivas Madhur
@@ -560,7 +560,7 @@ cpu_emergency_disable()
p->p_priority = p->p_usrpri;
p->p_stat = SRUN;
setrunqueue(p);
- p->p_stats->p_ru.ru_nvcsw++;
+ p->p_ru.ru_nvcsw++;
SCHED_UNLOCK(s);
}
diff --git a/sys/arch/solbourne/solbourne/machdep.c b/sys/arch/solbourne/solbourne/machdep.c
index d0a3ffe2d4a..ca9b8b7f812 100644
--- a/sys/arch/solbourne/solbourne/machdep.c
+++ b/sys/arch/solbourne/solbourne/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.21 2011/07/05 04:48:02 guenther Exp $ */
+/* $OpenBSD: machdep.c,v 1.22 2012/03/23 15:51:26 guenther Exp $ */
/* OpenBSD: machdep.c,v 1.105 2005/04/11 15:13:01 deraadt Exp */
/*
@@ -538,7 +538,7 @@ boot(howto)
if ((howto & RB_NOSYNC) == 0 && waittime < 0) {
extern struct proc proc0;
- /* XXX protect against curproc->p_stats.foo refs in sync() */
+ /* make sure there's a process to charge for I/O in sync() */
if (curproc == NULL)
curproc = &proc0;
waittime = 0;
diff --git a/sys/arch/sparc/sparc/machdep.c b/sys/arch/sparc/sparc/machdep.c
index 379b7d50c03..718ef15df43 100644
--- a/sys/arch/sparc/sparc/machdep.c
+++ b/sys/arch/sparc/sparc/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.137 2011/07/05 04:48:02 guenther Exp $ */
+/* $OpenBSD: machdep.c,v 1.138 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: machdep.c,v 1.85 1997/09/12 08:55:02 pk Exp $ */
/*
@@ -551,7 +551,7 @@ boot(howto)
if ((howto & RB_NOSYNC) == 0 && waittime < 0) {
extern struct proc proc0;
- /* XXX protect against curproc->p_stats.foo refs in sync() */
+ /* make sure there's a process to charge for I/O in sync() */
if (curproc == NULL)
curproc = &proc0;
waittime = 0;
diff --git a/sys/arch/sparc64/sparc64/db_interface.c b/sys/arch/sparc64/sparc64/db_interface.c
index a68f7aa52b3..96d351fe992 100644
--- a/sys/arch/sparc64/sparc64/db_interface.c
+++ b/sys/arch/sparc64/sparc64/db_interface.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_interface.c,v 1.31 2011/07/03 18:34:14 oga Exp $ */
+/* $OpenBSD: db_interface.c,v 1.32 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: db_interface.c,v 1.61 2001/07/31 06:55:47 eeh Exp $ */
/*
@@ -802,8 +802,8 @@ db_proc_cmd(addr, have_addr, count, modif)
p->p_vmspace->vm_maxsaddr, p->p_vmspace->vm_ssize,
(unsigned long long)ptoa(p->p_vmspace->vm_ssize));
db_printf("profile timer: %ld sec %ld usec\n",
- p->p_stats->p_timer[ITIMER_PROF].it_value.tv_sec,
- p->p_stats->p_timer[ITIMER_PROF].it_value.tv_usec);
+ p->p_p->ps_timer[ITIMER_PROF].it_value.tv_sec,
+ p->p_p->ps_timer[ITIMER_PROF].it_value.tv_usec);
db_printf("pcb: %p tf: %p fpstate: %p\n", &p->p_addr->u_pcb,
p->p_md.md_tf, p->p_md.md_fpstate);
return;
diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c
index 2130f5d4818..6b30d4b1b4f 100644
--- a/sys/arch/sparc64/sparc64/machdep.c
+++ b/sys/arch/sparc64/sparc64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.136 2011/07/05 04:48:02 guenther Exp $ */
+/* $OpenBSD: machdep.c,v 1.137 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */
/*-
@@ -639,7 +639,7 @@ boot(howto)
extern struct proc proc0;
extern int sparc_clock_time_is_ok;
- /* XXX protect against curproc->p_stats.foo refs in sync() */
+ /* make sure there's a process to charge for I/O in sync() */
if (curproc == NULL)
curproc = &proc0;
waittime = 0;
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index ffa718dc1be..9d300d33a1e 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.73 2011/12/14 08:33:18 robert Exp $ */
+/* $OpenBSD: linux_misc.c,v 1.74 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: linux_misc.c,v 1.27 1996/05/20 01:59:21 fvdl Exp $ */
/*-
@@ -744,17 +744,16 @@ linux_sys_times(p, v, retval)
struct linux_sys_times_args /* {
syscallarg(struct times *) tms;
} */ *uap = v;
- struct timeval t;
+ struct timeval t, ut, st;
struct linux_tms ltms;
- struct rusage ru;
int error;
- calcru(p, &ru.ru_utime, &ru.ru_stime, NULL);
- ltms.ltms_utime = CONVTCK(ru.ru_utime);
- ltms.ltms_stime = CONVTCK(ru.ru_stime);
+ calcru(&p->p_p->ps_tu, &ut, &st, NULL);
+ ltms.ltms_utime = CONVTCK(ut);
+ ltms.ltms_stime = CONVTCK(st);
- ltms.ltms_cutime = CONVTCK(p->p_stats->p_cru.ru_utime);
- ltms.ltms_cstime = CONVTCK(p->p_stats->p_cru.ru_stime);
+ ltms.ltms_cutime = CONVTCK(p->p_p->ps_cru.ru_utime);
+ ltms.ltms_cstime = CONVTCK(p->p_p->ps_cru.ru_stime);
if ((error = copyout(&ltms, SCARG(uap, tms), sizeof ltms)))
return error;
@@ -778,18 +777,20 @@ linux_sys_alarm(p, v, retval)
struct linux_sys_alarm_args /* {
syscallarg(unsigned int) secs;
} */ *uap = v;
- int s;
+ struct process *pr;
struct itimerval *itp, it;
struct timeval tv;
+ int s;
int timo;
- itp = &p->p_realtimer;
+ pr = p->p_p;
+ itp = &pr->ps_timer[ITIMER_REAL];
s = splclock();
/*
* Clear any pending timer alarms.
*/
getmicrouptime(&tv);
- timeout_del(&p->p_realit_to);
+ timeout_del(&pr->ps_realit_to);
timerclear(&itp->it_interval);
if (timerisset(&itp->it_value) &&
timercmp(&itp->it_value, &tv, >))
@@ -816,7 +817,7 @@ linux_sys_alarm(p, v, retval)
timerclear(&it.it_interval);
it.it_value.tv_sec = SCARG(uap, secs);
it.it_value.tv_usec = 0;
- if (itimerfix(&it.it_value) || itimerfix(&it.it_interval)) {
+ if (itimerfix(&it.it_value)) {
splx(s);
return (EINVAL);
}
@@ -824,9 +825,9 @@ linux_sys_alarm(p, v, retval)
if (timerisset(&it.it_value)) {
timo = tvtohz(&it.it_value);
timeradd(&it.it_value, &tv, &it.it_value);
- timeout_add(&p->p_realit_to, timo);
+ timeout_add(&pr->ps_realit_to, timo);
}
- p->p_realtimer = it;
+ pr->ps_timer[ITIMER_REAL] = it;
splx(s);
return 0;
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index a3b43e4ec28..341200012aa 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: init_main.c,v 1.181 2012/01/01 12:17:33 fgsch Exp $ */
+/* $OpenBSD: init_main.c,v 1.182 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */
/*
@@ -288,7 +288,7 @@ main(void *framep)
/* Init timeouts. */
timeout_set(&p->p_sleep_to, endtsleep, p);
- timeout_set(&p->p_realit_to, realitexpire, p);
+ timeout_set(&pr->ps_realit_to, realitexpire, pr);
/* Create credentials. */
p->p_cred = &cred0;
@@ -326,12 +326,6 @@ main(void *framep)
p->p_addr = proc0paddr; /* XXX */
/*
- * We continue to place resource usage info in the
- * user struct so they're pageable.
- */
- p->p_stats = &p->p_addr->u_stats;
-
- /*
* Charge root for one process.
*/
(void)chgproccnt(0, 1);
@@ -500,7 +494,7 @@ main(void *framep)
boottime = mono_time = time;
#endif
LIST_FOREACH(p, &allproc, p_list) {
- p->p_stats->p_start = boottime;
+ p->p_p->ps_start = boottime;
microuptime(&p->p_cpu->ci_schedstate.spc_runtime);
p->p_rtime.tv_sec = p->p_rtime.tv_usec = 0;
}
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 0051d4fe1c5..aa519740c5d 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_acct.c,v 1.23 2010/07/26 01:56:27 guenther Exp $ */
+/* $OpenBSD: kern_acct.c,v 1.24 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_acct.c,v 1.42 1996/02/04 02:15:12 christos Exp $ */
/*-
@@ -159,6 +159,7 @@ int
acct_process(struct proc *p)
{
struct acct acct;
+ struct process *pr = p->p_p;
struct rusage *r;
struct timeval ut, st, tmp;
int t;
@@ -175,9 +176,9 @@ acct_process(struct proc *p)
* Raise the file limit so that accounting can't be stopped by the
* user. (XXX - we should think about the cpu limit too).
*/
- if (p->p_p->ps_limit->p_refcnt > 1) {
- oplim = p->p_p->ps_limit;
- p->p_p->ps_limit = limcopy(p->p_p->ps_limit);
+ if (pr->ps_limit->p_refcnt > 1) {
+ oplim = pr->ps_limit;
+ pr->ps_limit = limcopy(pr->ps_limit);
}
p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
@@ -189,18 +190,18 @@ acct_process(struct proc *p)
bcopy(p->p_comm, acct.ac_comm, sizeof acct.ac_comm);
/* (2) The amount of user and system time that was used */
- calcru(p, &ut, &st, NULL);
+ calcru(&pr->ps_tu, &ut, &st, NULL);
acct.ac_utime = encode_comp_t(ut.tv_sec, ut.tv_usec);
acct.ac_stime = encode_comp_t(st.tv_sec, st.tv_usec);
/* (3) The elapsed time the command ran (and its starting time) */
- acct.ac_btime = p->p_stats->p_start.tv_sec;
+ acct.ac_btime = pr->ps_start.tv_sec;
getmicrotime(&tmp);
- timersub(&tmp, &p->p_stats->p_start, &tmp);
+ timersub(&tmp, &pr->ps_start, &tmp);
acct.ac_etime = encode_comp_t(tmp.tv_sec, tmp.tv_usec);
/* (4) The average amount of memory used */
- r = &p->p_stats->p_ru;
+ r = &p->p_ru;
timeradd(&ut, &st, &tmp);
t = tmp.tv_sec * hz + tmp.tv_usec / tick;
if (t)
@@ -216,9 +217,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_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;
+ if ((pr->ps_flags & PS_CONTROLT) &&
+ pr->ps_pgrp->pg_session->s_ttyp)
+ acct.ac_tty = pr->ps_pgrp->pg_session->s_ttyp->t_dev;
else
acct.ac_tty = NODEV;
@@ -232,8 +233,8 @@ acct_process(struct proc *p)
(off_t)0, UIO_SYSSPACE, IO_APPEND|IO_UNIT, p->p_ucred, NULL, p);
if (oplim) {
- limfree(p->p_p->ps_limit);
- p->p_p->ps_limit = oplim;
+ limfree(pr->ps_limit);
+ pr->ps_limit = oplim;
}
return error;
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c
index 7e85444d988..ab567332f37 100644
--- a/sys/kern/kern_clock.c
+++ b/sys/kern/kern_clock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_clock.c,v 1.72 2011/03/07 07:07:13 guenther Exp $ */
+/* $OpenBSD: kern_clock.c,v 1.73 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_clock.c,v 1.34 1996/06/09 04:51:03 briggs Exp $ */
/*-
@@ -170,10 +170,6 @@ initclocks(void)
*
* hardclock detects that the itimer has expired, and schedules a timeout
* to deliver the signal. This works because of the following reasons:
- * - The timeout structures can be in struct pstats because the timers
- * can be only activated on curproc (never swapped). Swapout can
- * only happen from a kernel thread and softclock runs before threads
- * are scheduled.
* - The timeout can be scheduled with a 1 tick time because we're
* doing it before the timeout processing in hardclock. So it will
* be scheduled to run as soon as possible.
@@ -189,17 +185,17 @@ initclocks(void)
void
virttimer_trampoline(void *v)
{
- struct proc *p = v;
+ struct process *pr = v;
- psignal(p, SIGVTALRM);
+ psignal(pr->ps_mainproc, SIGVTALRM);
}
void
proftimer_trampoline(void *v)
{
- struct proc *p = v;
+ struct process *pr = v;
- psignal(p, SIGPROF);
+ psignal(pr->ps_mainproc, SIGPROF);
}
/*
@@ -220,19 +216,18 @@ hardclock(struct clockframe *frame)
p = curproc;
if (p && ((p->p_flag & (P_SYSTEM | P_WEXIT)) == 0)) {
- struct pstats *pstats;
+ struct process *pr = p->p_p;
/*
* Run current process's virtual and profile time, as needed.
*/
- pstats = p->p_stats;
if (CLKF_USERMODE(frame) &&
- timerisset(&pstats->p_timer[ITIMER_VIRTUAL].it_value) &&
- itimerdecr(&pstats->p_timer[ITIMER_VIRTUAL], tick) == 0)
- timeout_add(&pstats->p_virt_to, 1);
- if (timerisset(&pstats->p_timer[ITIMER_PROF].it_value) &&
- itimerdecr(&pstats->p_timer[ITIMER_PROF], tick) == 0)
- timeout_add(&pstats->p_prof_to, 1);
+ timerisset(&pr->ps_timer[ITIMER_VIRTUAL].it_value) &&
+ itimerdecr(&pr->ps_timer[ITIMER_VIRTUAL], tick) == 0)
+ timeout_add(&pr->ps_virt_to, 1);
+ if (timerisset(&pr->ps_timer[ITIMER_PROF].it_value) &&
+ itimerdecr(&pr->ps_timer[ITIMER_PROF], tick) == 0)
+ timeout_add(&pr->ps_prof_to, 1);
}
/*
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 4fa96597e89..2cf05248187 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exec.c,v 1.125 2012/03/09 13:01:28 ariane Exp $ */
+/* $OpenBSD: kern_exec.c,v 1.126 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */
/*-
@@ -600,13 +600,10 @@ sys_execve(struct proc *p, void *v, register_t *retval)
if (pr->ps_flags & PS_SUGIDEXEC) {
int i, s = splclock();
- timeout_del(&p->p_realit_to);
- timerclear(&p->p_realtimer.it_interval);
- timerclear(&p->p_realtimer.it_value);
- for (i = 0; i < sizeof(p->p_stats->p_timer) /
- sizeof(p->p_stats->p_timer[0]); i++) {
- timerclear(&p->p_stats->p_timer[i].it_interval);
- timerclear(&p->p_stats->p_timer[i].it_value);
+ timeout_del(&pr->ps_realit_to);
+ for (i = 0; i < nitems(pr->ps_timer); i++) {
+ timerclear(&pr->ps_timer[i].it_interval);
+ timerclear(&pr->ps_timer[i].it_value);
}
splx(s);
}
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index c9a2a9c93f0..d3225d4e350 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exit.c,v 1.108 2012/03/10 05:54:28 guenther Exp $ */
+/* $OpenBSD: kern_exit.c,v 1.109 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */
/*
@@ -120,6 +120,7 @@ void
exit1(struct proc *p, int rv, int flags)
{
struct process *pr, *qr, *nqr;
+ struct rusage *rup;
if (p->p_pid == 1)
panic("init died (signal %d, exit %d)",
@@ -166,11 +167,18 @@ exit1(struct proc *p, int rv, int flags)
if (p->p_flag & P_PROFIL)
stopprofclock(p);
- p->p_ru = pool_get(&rusage_pool, PR_WAITOK);
+ rup = pr->ps_ru;
+ if (rup == NULL) {
+ rup = pool_get(&rusage_pool, PR_WAITOK | PR_ZERO);
+
+ if (pr->ps_ru == NULL)
+ pr->ps_ru = rup;
+ else {
+ pool_put(&rusage_pool, rup);
+ rup = pr->ps_ru;
+ }
+ }
p->p_siglist = 0;
- timeout_del(&p->p_realit_to);
- timeout_del(&p->p_stats->p_virt_to);
- timeout_del(&p->p_stats->p_prof_to);
/*
* Close open files and release open-file table.
@@ -178,6 +186,9 @@ exit1(struct proc *p, int rv, int flags)
fdfree(p);
if ((p->p_flag & P_THREAD) == 0) {
+ timeout_del(&pr->ps_realit_to);
+ timeout_del(&pr->ps_virt_to);
+ timeout_del(&pr->ps_prof_to);
#ifdef SYSVSEM
semexit(pr);
#endif
@@ -271,13 +282,8 @@ exit1(struct proc *p, int rv, int flags)
}
- /*
- * Save exit status and final rusage info, adding in child rusage
- * info and self times.
- */
- *p->p_ru = p->p_stats->p_ru;
- calcru(p, &p->p_ru->ru_utime, &p->p_ru->ru_stime, NULL);
- ruadd(p->p_ru, &p->p_stats->p_cru);
+ /* add thread's accumulated rusage into the process's total */
+ ruadd(rup, &p->p_ru);
/*
* clear %cpu usage during swap
@@ -285,6 +291,15 @@ exit1(struct proc *p, int rv, int flags)
p->p_pctcpu = 0;
if ((p->p_flag & P_THREAD) == 0) {
+ /*
+ * Final thread has died, so add on our children's rusage
+ * and calculate the total times
+ */
+ calcru(&pr->ps_tu, &rup->ru_utime, &rup->ru_stime, NULL);
+ ruadd(rup, &pr->ps_cru);
+ timeradd(&rup->ru_utime, &pr->ps_cru.ru_utime, &rup->ru_utime);
+ timeradd(&rup->ru_stime, &pr->ps_cru.ru_stime, &rup->ru_stime);
+
/* notify interested parties of our demise and clean up */
knote_processexit(pr);
@@ -468,7 +483,7 @@ loop:
return (error);
}
if (SCARG(uap, rusage) &&
- (error = copyout(p->p_ru,
+ (error = copyout(pr->ps_ru,
SCARG(uap, rusage), sizeof(struct rusage))))
return (error);
proc_finish_wait(q, p);
@@ -517,6 +532,7 @@ void
proc_finish_wait(struct proc *waiter, struct proc *p)
{
struct process *pr, *tr;
+ struct rusage *rup;
/*
* If we got the child via a ptrace 'attach',
@@ -534,7 +550,10 @@ proc_finish_wait(struct proc *waiter, struct proc *p)
} else {
scheduler_wait_hook(waiter, p);
p->p_xstat = 0;
- ruadd(&waiter->p_stats->p_cru, p->p_ru);
+ rup = &waiter->p_p->ps_cru;
+ ruadd(rup, pr->ps_ru);
+ timeradd(&rup->ru_utime, &pr->ps_ru->ru_utime, &rup->ru_utime);
+ timeradd(&rup->ru_stime, &pr->ps_ru->ru_stime, &rup->ru_stime);
proc_zap(p);
}
}
@@ -562,10 +581,6 @@ proc_zap(struct proc *p)
{
struct process *pr = p->p_p;
- pool_put(&rusage_pool, p->p_ru);
- if ((p->p_flag & P_THREAD) == 0 && pr->ps_ptstat)
- free(pr->ps_ptstat, M_SUBPROC);
-
/*
* Finally finished with old proc entry.
* Unlink it from its process group and free it.
@@ -592,6 +607,9 @@ proc_zap(struct proc *p)
* in the process (pun intended).
*/
if (--pr->ps_refcnt == 0) {
+ if (pr->ps_ptstat != NULL)
+ free(pr->ps_ptstat, M_SUBPROC);
+ pool_put(&rusage_pool, pr->ps_ru);
KASSERT(TAILQ_EMPTY(&pr->ps_threads));
limfree(pr->ps_limit);
crfree(pr->ps_cred->pc_ucred);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index bf667d3b901..f7225155e47 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.134 2012/02/20 22:23:39 guenther Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.135 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -219,6 +219,10 @@ process_new(struct proc *p, struct process *parent)
crhold(parent->ps_cred->pc_ucred);
pr->ps_limit->p_refcnt++;
+ timeout_set(&pr->ps_realit_to, realitexpire, pr);
+ timeout_set(&pr->ps_virt_to, virttimer_trampoline, pr);
+ timeout_set(&pr->ps_prof_to, proftimer_trampoline, pr);
+
pr->ps_flags = parent->ps_flags & (PS_SUGID | PS_SUGIDEXEC);
if (parent->ps_session->s_ttyvp != NULL &&
parent->ps_flags & PS_CONTROLT)
@@ -331,12 +335,10 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr,
* Initialize the timeouts.
*/
timeout_set(&p->p_sleep_to, endtsleep, p);
- timeout_set(&p->p_realit_to, realitexpire, p);
/*
* Duplicate sub-structures as needed.
* Increase reference counts on shared objects.
- * The p_stats and p_sigacts substructs are set in vm_fork.
*/
if (curp->p_flag & P_PROFIL)
startprofclock(p);
@@ -404,9 +406,6 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr,
uvm_fork(curp, p, ((flags & FORK_SHAREVM) ? TRUE : FALSE), stack,
0, func ? func : child_return, arg ? arg : p);
- timeout_set(&p->p_stats->p_virt_to, virttimer_trampoline, p);
- timeout_set(&p->p_stats->p_prof_to, proftimer_trampoline, p);
-
vm = p->p_vmspace;
if (flags & FORK_FORK) {
@@ -481,7 +480,7 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr,
* Make child runnable, set start time, and add to run queue.
*/
SCHED_LOCK(s);
- getmicrotime(&p->p_stats->p_start);
+ getmicrotime(&pr->ps_start);
p->p_acflag = AFORK;
p->p_stat = SRUN;
p->p_cpu = sched_choosecpu_fork(curp, flags);
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index ce3dfea9fdf..ab199d4401e 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_resource.c,v 1.38 2012/03/19 09:05:39 guenther Exp $ */
+/* $OpenBSD: kern_resource.c,v 1.39 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */
/*-
@@ -52,6 +52,9 @@
#include <uvm/uvm_extern.h>
+void tuagg_sub(struct tusage *, struct proc *);
+void tuagg(struct process *, struct proc *);
+
/*
* Patchable maximum data and stack limits.
*/
@@ -334,23 +337,54 @@ sys_getrlimit(struct proc *p, void *v, register_t *retval)
return (error);
}
+void
+tuagg_sub(struct tusage *tup, struct proc *p)
+{
+ timeradd(&tup->tu_runtime, &p->p_rtime, &tup->tu_runtime);
+ tup->tu_uticks += p->p_uticks;
+ tup->tu_sticks += p->p_sticks;
+ tup->tu_iticks += p->p_iticks;
+}
+
/*
- * Transform the running time and tick information in proc p into user,
- * system, and interrupt time usage.
+ * Aggregate a single thread's immediate time counts into the running
+ * totals for the thread and process
*/
void
-calcru(struct proc *p, struct timeval *up, struct timeval *sp,
+tuagg_unlocked(struct process *pr, struct proc *p)
+{
+ tuagg_sub(&pr->ps_tu, p);
+ tuagg_sub(&p->p_tu, p);
+ timerclear(&p->p_rtime);
+ p->p_uticks = 0;
+ p->p_sticks = 0;
+ p->p_iticks = 0;
+}
+
+void
+tuagg(struct process *pr, struct proc *p)
+{
+ int s;
+
+ SCHED_LOCK(s);
+ tuagg_unlocked(pr, p);
+ SCHED_UNLOCK(s);
+}
+
+/*
+ * Transform the running time and tick information in a struct tusage
+ * into user, system, and interrupt time usage.
+ */
+void
+calcru(struct tusage *tup, struct timeval *up, struct timeval *sp,
struct timeval *ip)
{
u_quad_t st, ut, it;
int freq;
- int s;
- s = splstatclock();
- st = p->p_sticks;
- ut = p->p_uticks;
- it = p->p_iticks;
- splx(s);
+ st = tup->tu_sticks;
+ ut = tup->tu_uticks;
+ it = tup->tu_iticks;
if (st + ut + it == 0) {
timerclear(up);
@@ -384,43 +418,36 @@ sys_getrusage(struct proc *p, void *v, register_t *retval)
syscallarg(struct rusage *) rusage;
} */ *uap = v;
struct process *pr = p->p_p;
+ struct proc *q;
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;
+ /* start with the sum of dead threads, if any */
+ if (pr->ps_ru != NULL)
+ ru = *pr->ps_ru;
+ else
+ bzero(&ru, sizeof(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);
- }
+ /* add on all living threads */
+ TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) {
+ ruadd(rup, &q->p_ru);
+ tuagg(pr, q);
}
+
+ calcru(&pr->ps_tu, &rup->ru_utime, &rup->ru_stime, NULL);
break;
case RUSAGE_THREAD:
- rup = &p->p_stats->p_ru;
- calcru(p, &rup->ru_utime, &rup->ru_stime, NULL);
- ru = *rup;
+ rup = &p->p_ru;
+ calcru(&p->p_tu, &rup->ru_utime, &rup->ru_stime, NULL);
break;
case RUSAGE_CHILDREN:
- rup = &p->p_stats->p_cru;
+ rup = &pr->ps_cru;
break;
default:
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c
index 1c2c30f924a..0ddfe498dbb 100644
--- a/sys/kern/kern_sched.c
+++ b/sys/kern/kern_sched.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sched.c,v 1.25 2012/03/10 22:02:32 haesbaert Exp $ */
+/* $OpenBSD: kern_sched.c,v 1.26 2012/03/23 15:51:26 guenther Exp $ */
/*
* Copyright (c) 2007, 2008 Artur Grabowski <art@openbsd.org>
*
@@ -556,7 +556,7 @@ sched_peg_curproc(struct cpu_info *ci)
p->p_cpu = ci;
atomic_setbits_int(&p->p_flag, P_CPUPEG);
setrunqueue(p);
- p->p_stats->p_ru.ru_nvcsw++;
+ p->p_ru.ru_nvcsw++;
mi_switch();
SCHED_UNLOCK(s);
}
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 5171bd7323e..936d04c8e70 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.137 2012/03/19 09:05:39 guenther Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.138 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -721,7 +721,7 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code,
p->p_sigmask, code, &si);
}
#endif
- p->p_stats->p_ru.ru_nsignals++;
+ p->p_ru.ru_nsignals++;
(*p->p_emul->e_sendsig)(ps->ps_sigact[signum], signum,
p->p_sigmask, trapno, code, sigval);
p->p_sigmask |= ps->ps_catchmask[signum];
@@ -1316,7 +1316,7 @@ postsig(int signum)
ps->ps_sigact[signum] = SIG_DFL;
}
splx(s);
- p->p_stats->p_ru.ru_nsignals++;
+ p->p_ru.ru_nsignals++;
if (p->p_sisig == signum) {
p->p_sisig = 0;
p->p_sitrapno = 0;
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 031a46dfaee..6b10a95e5b9 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_synch.c,v 1.100 2012/03/19 09:05:39 guenther Exp $ */
+/* $OpenBSD: kern_synch.c,v 1.101 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*
@@ -215,7 +215,7 @@ sleep_finish(struct sleep_state *sls, int do_sleep)
if (sls->sls_do_sleep && do_sleep) {
p->p_stat = SSLEEP;
- p->p_stats->p_ru.ru_nvcsw++;
+ p->p_ru.ru_nvcsw++;
SCHED_ASSERT_LOCKED();
mi_switch();
} else if (!do_sleep) {
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 6d0880d6033..3d34ce34fff 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.216 2012/03/13 17:28:32 tedu Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.217 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -1498,7 +1498,7 @@ fill_kproc(struct proc *p, struct kinfo_proc *ki)
struct timeval ut, st;
FILL_KPROC(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, p->p_sigacts);
+ p, pr, s, p->p_vmspace, pr->ps_limit, p->p_sigacts);
/* stuff that's too painful to generalize into the macros */
ki->p_pid = pr->ps_pid;
@@ -1521,7 +1521,7 @@ fill_kproc(struct proc *p, struct kinfo_proc *ki)
if (p->p_stat != SIDL)
ki->p_vm_rssize = vm_resident_count(p->p_vmspace);
- calcru(p, &ut, &st, NULL);
+ calcru(&p->p_tu, &ut, &st, NULL);
ki->p_uutime_sec = ut.tv_sec;
ki->p_uutime_usec = ut.tv_usec;
ki->p_ustime_sec = st.tv_sec;
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 180e76178fb..3ed6a7d53eb 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_time.c,v 1.73 2012/03/19 09:05:39 guenther Exp $ */
+/* $OpenBSD: kern_time.c,v 1.74 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */
/*
@@ -588,12 +588,10 @@ out:
/*
* Get value of an interval timer. The process virtual and
- * profiling virtual time timers are kept in the p_stats area, since
- * they can be swapped out. These are kept internally in the
+ * profiling virtual time timers are kept internally in the
* way they are specified externally: in time until they expire.
*
- * The real time interval timer is kept in the process table slot
- * for the process, and its value (it_value) is kept as an
+ * The real time interval timer's it_value, in contast, is kept as an
* absolute time rather than as a delta, so that it is easy to keep
* periodic real-time signals from drifting.
*
@@ -624,6 +622,8 @@ sys_getitimer(struct proc *p, void *v, register_t *retval)
if (which < ITIMER_REAL || which > ITIMER_PROF)
return (EINVAL);
s = splclock();
+ aitv = p->p_p->ps_timer[which];
+
if (which == ITIMER_REAL) {
struct timeval now;
@@ -634,7 +634,6 @@ sys_getitimer(struct proc *p, void *v, register_t *retval)
* has passed return 0, else return difference between
* current time and time for the timer to go off.
*/
- aitv = p->p_realtimer;
if (timerisset(&aitv.it_value)) {
if (timercmp(&aitv.it_value, &now, <))
timerclear(&aitv.it_value);
@@ -642,8 +641,7 @@ sys_getitimer(struct proc *p, void *v, register_t *retval)
timersub(&aitv.it_value, &now,
&aitv.it_value);
}
- } else
- aitv = p->p_stats->p_timer[which];
+ }
splx(s);
return (copyout(&aitv, SCARG(uap, itv), sizeof (struct itimerval)));
}
@@ -661,6 +659,7 @@ sys_setitimer(struct proc *p, void *v, register_t *retval)
struct itimerval aitv;
const struct itimerval *itvp;
struct itimerval *oitv;
+ struct process *pr = p->p_p;
int error;
int timo;
int which;
@@ -687,24 +686,24 @@ sys_setitimer(struct proc *p, void *v, register_t *retval)
if (which == ITIMER_REAL) {
struct timeval ctv;
- timeout_del(&p->p_realit_to);
+ timeout_del(&pr->ps_realit_to);
getmicrouptime(&ctv);
if (timerisset(&aitv.it_value)) {
timo = tvtohz(&aitv.it_value);
- timeout_add(&p->p_realit_to, timo);
+ timeout_add(&pr->ps_realit_to, timo);
timeradd(&aitv.it_value, &ctv, &aitv.it_value);
}
- p->p_realtimer = aitv;
+ pr->ps_timer[ITIMER_REAL] = aitv;
} else {
int s;
itimerround(&aitv.it_interval);
s = splclock();
- p->p_stats->p_timer[which] = aitv;
+ pr->ps_timer[which] = aitv;
if (which == ITIMER_VIRTUAL)
- timeout_del(&p->p_stats->p_virt_to);
+ timeout_del(&pr->ps_virt_to);
if (which == ITIMER_PROF)
- timeout_del(&p->p_stats->p_prof_to);
+ timeout_del(&pr->ps_prof_to);
splx(s);
}
@@ -722,29 +721,28 @@ sys_setitimer(struct proc *p, void *v, register_t *retval)
void
realitexpire(void *arg)
{
- struct proc *p;
+ struct process *pr = arg;
+ struct itimerval *tp = &pr->ps_timer[ITIMER_REAL];
- p = (struct proc *)arg;
- psignal(p, SIGALRM);
- if (!timerisset(&p->p_realtimer.it_interval)) {
- timerclear(&p->p_realtimer.it_value);
+ psignal(pr->ps_mainproc, SIGALRM);
+ if (!timerisset(&tp->it_interval)) {
+ timerclear(&tp->it_value);
return;
}
for (;;) {
struct timeval ctv, ntv;
int timo;
- timeradd(&p->p_realtimer.it_value,
- &p->p_realtimer.it_interval, &p->p_realtimer.it_value);
+ timeradd(&tp->it_value, &tp->it_interval, &tp->it_value);
getmicrouptime(&ctv);
- if (timercmp(&p->p_realtimer.it_value, &ctv, >)) {
- ntv = p->p_realtimer.it_value;
+ if (timercmp(&tp->it_value, &ctv, >)) {
+ ntv = tp->it_value;
timersub(&ntv, &ctv, &ntv);
timo = tvtohz(&ntv) - 1;
if (timo <= 0)
timo = 1;
- if ((p->p_p->ps_flags & PS_EXITING) == 0)
- timeout_add(&p->p_realit_to, timo);
+ if ((pr->ps_flags & PS_EXITING) == 0)
+ timeout_add(&pr->ps_realit_to, timo);
return;
}
}
diff --git a/sys/kern/sched_bsd.c b/sys/kern/sched_bsd.c
index 6fb2772e5ce..1bc1034ae22 100644
--- a/sys/kern/sched_bsd.c
+++ b/sys/kern/sched_bsd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sched_bsd.c,v 1.28 2012/02/20 22:23:39 guenther Exp $ */
+/* $OpenBSD: sched_bsd.c,v 1.29 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*-
@@ -305,7 +305,7 @@ yield(void)
p->p_priority = p->p_usrpri;
p->p_stat = SRUN;
setrunqueue(p);
- p->p_stats->p_ru.ru_nvcsw++;
+ p->p_ru.ru_nvcsw++;
mi_switch();
SCHED_UNLOCK(s);
}
@@ -333,7 +333,7 @@ preempt(struct proc *newp)
p->p_stat = SRUN;
p->p_cpu = sched_choosecpu(p);
setrunqueue(p);
- p->p_stats->p_ru.ru_nivcsw++;
+ p->p_ru.ru_nivcsw++;
mi_switch();
SCHED_UNLOCK(s);
}
@@ -344,7 +344,9 @@ mi_switch(void)
struct schedstate_percpu *spc = &curcpu()->ci_schedstate;
struct proc *p = curproc;
struct proc *nextproc;
+ struct process *pr = p->p_p;
struct rlimit *rlim;
+ rlim_t secs;
struct timeval tv;
#ifdef MULTIPROCESSOR
int hold_count;
@@ -384,13 +386,17 @@ mi_switch(void)
timeradd(&p->p_rtime, &tv, &p->p_rtime);
}
+ /* add the time counts for this thread to the process's total */
+ tuagg_unlocked(pr, p);
+
/*
* Check if the process exceeds its cpu resource allocation.
* If over max, kill it.
*/
- rlim = &p->p_rlimit[RLIMIT_CPU];
- if ((rlim_t)p->p_rtime.tv_sec >= rlim->rlim_cur) {
- if ((rlim_t)p->p_rtime.tv_sec >= rlim->rlim_max) {
+ rlim = &pr->ps_limit->pl_rlimit[RLIMIT_CPU];
+ secs = pr->ps_tu.tu_runtime.tv_sec;
+ if (secs >= rlim->rlim_cur) {
+ if (secs >= rlim->rlim_max) {
psignal(p, SIGKILL);
} else {
psignal(p, SIGXCPU);
diff --git a/sys/kern/subr_prof.c b/sys/kern/subr_prof.c
index f1475420df0..070c632bc1a 100644
--- a/sys/kern/subr_prof.c
+++ b/sys/kern/subr_prof.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_prof.c,v 1.19 2010/07/09 20:30:48 deraadt Exp $ */
+/* $OpenBSD: subr_prof.c,v 1.20 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: subr_prof.c,v 1.12 1996/04/22 01:38:50 christos Exp $ */
/*-
@@ -161,7 +161,7 @@ sys_profil(struct proc *p, void *v, register_t *retval)
stopprofclock(p);
return (0);
}
- upp = &p->p_stats->p_prof;
+ upp = &p->p_p->ps_prof;
/* Block profile interrupts while changing state. */
s = splstatclock();
@@ -196,12 +196,12 @@ addupc_intr(struct proc *p, u_long pc)
{
struct uprof *prof;
- prof = &p->p_stats->p_prof;
+ prof = &p->p_p->ps_prof;
if (pc < prof->pr_off || PC_TO_INDEX(pc, prof) >= prof->pr_size)
return; /* out of range; ignore */
- prof->pr_addr = pc;
- prof->pr_ticks++;
+ p->p_prof_addr = pc;
+ p->p_prof_ticks++;
atomic_setbits_int(&p->p_flag, P_OWEUPC);
need_proftick(p);
}
@@ -223,7 +223,7 @@ addupc_task(struct proc *p, u_long pc, u_int nticks)
if ((p->p_flag & P_PROFIL) == 0 || nticks == 0)
return;
- prof = &p->p_stats->p_prof;
+ prof = &p->p_p->ps_prof;
if (pc < prof->pr_off ||
(i = PC_TO_INDEX(pc, prof)) >= prof->pr_size)
return;
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 1a918c29714..df0c72e498c 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.93 2011/07/05 04:48:02 guenther Exp $ */
+/* $OpenBSD: tty.c,v 1.94 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */
/*-
@@ -2115,7 +2115,7 @@ ttyinfo(struct tty *tp)
rss = pick->p_stat == SIDL || P_ZOMBIE(pick) ? 0 :
vm_resident_count(pick->p_vmspace);
- calcru(pick, &utime, &stime, NULL);
+ calcru(&pick->p_p->ps_tu, &utime, &stime, NULL);
/* Round up and print user time. */
utime.tv_usec += 5000;
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 5375e11220d..6749f4c56c5 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_socket.c,v 1.97 2012/03/17 10:16:41 dlg Exp $ */
+/* $OpenBSD: uipc_socket.c,v 1.98 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
/*
@@ -406,7 +406,7 @@ sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct mbuf *top,
(flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
(so->so_proto->pr_flags & PR_ATOMIC);
if (uio && uio->uio_procp)
- uio->uio_procp->p_stats->p_ru.ru_msgsnd++;
+ uio->uio_procp->p_ru.ru_msgsnd++;
if (control)
clen = control->m_len;
#define snderr(errno) { error = errno; splx(s); goto release; }
@@ -725,7 +725,7 @@ dontblock:
* corruption.
*/
if (uio->uio_procp)
- uio->uio_procp->p_stats->p_ru.ru_msgrcv++;
+ uio->uio_procp->p_ru.ru_msgrcv++;
KASSERT(m == so->so_rcv.sb_mb);
SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 1b589974153..bd1cd91fc24 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_bio.c,v 1.134 2011/09/19 14:48:04 beck Exp $ */
+/* $OpenBSD: vfs_bio.c,v 1.135 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: vfs_bio.c,v 1.44 1996/06/11 11:15:36 pk Exp $ */
/*
@@ -375,7 +375,7 @@ bio_doread(struct vnode *vp, daddr64_t blkno, int size, int async)
bcstats.numreads++;
VOP_STRATEGY(bp);
/* Pay for the read. */
- curproc->p_stats->p_ru.ru_inblock++; /* XXX */
+ curproc->p_ru.ru_inblock++; /* XXX */
} else if (async) {
brelse(bp);
}
@@ -554,7 +554,7 @@ bread_cluster(struct vnode *vp, daddr64_t blkno, int size, struct buf **rbpp)
bcstats.pendingreads++;
bcstats.numreads++;
VOP_STRATEGY(bp);
- curproc->p_stats->p_ru.ru_inblock++;
+ curproc->p_ru.ru_inblock++;
out:
return (biowait(*rbpp));
@@ -617,7 +617,7 @@ bwrite(struct buf *bp)
if (wasdelayed) {
reassignbuf(bp);
} else
- curproc->p_stats->p_ru.ru_oublock++;
+ curproc->p_ru.ru_oublock++;
/* Initiate disk write. Make sure the appropriate party is charged. */
@@ -671,7 +671,7 @@ bdwrite(struct buf *bp)
s = splbio();
reassignbuf(bp);
splx(s);
- curproc->p_stats->p_ru.ru_oublock++; /* XXX */
+ curproc->p_ru.ru_oublock++; /* XXX */
}
/* If this is a tape block, write the block now. */
diff --git a/sys/miscfs/procfs/procfs_status.c b/sys/miscfs/procfs/procfs_status.c
index 0a629e92a04..c19175825ef 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.11 2010/07/26 01:56:27 guenther Exp $ */
+/* $OpenBSD: procfs_status.c,v 1.12 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: procfs_status.c,v 1.11 1996/03/16 23:52:50 christos Exp $ */
/*
@@ -118,10 +118,10 @@ procfs_stat_gen(struct proc *p, char *s, int l)
}
snprintf(ps, sizeof(ps), " %ld,%ld",
- p->p_stats->p_start.tv_sec, p->p_stats->p_start.tv_usec);
+ pr->ps_start.tv_sec, pr->ps_start.tv_usec);
COUNTORCAT(s, l, ps, n);
- calcru(p, &ut, &st, (void *) 0);
+ calcru(&pr->ps_tu, &ut, &st, (void *) 0);
snprintf(ps, sizeof(ps), " %ld,%ld %ld,%ld",
ut.tv_sec, ut.tv_usec, st.tv_sec, st.tv_usec);
COUNTORCAT(s, l, ps, n);
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index 3380669cbad..4a314a0368e 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vnops.c,v 1.138 2011/07/09 00:24:44 beck Exp $ */
+/* $OpenBSD: nfs_vnops.c,v 1.139 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */
/*
@@ -3020,7 +3020,7 @@ nfs_writebp(struct buf *bp, int force)
buf_undirty(bp);
if ((oldflags & B_ASYNC) && !(oldflags & B_DELWRI) && p)
- ++p->p_stats->p_ru.ru_oublock;
+ ++p->p_ru.ru_oublock;
bp->b_vp->v_numoutput++;
splx(s);
@@ -3095,7 +3095,7 @@ nfs_writebp(struct buf *bp, int force)
bp->b_flags |= B_RAW;
rtval = biowait(bp);
if (!(oldflags & B_DELWRI) && p) {
- ++p->p_stats->p_ru.ru_oublock;
+ ++p->p_ru.ru_oublock;
}
brelse(bp);
return (rtval);
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index ac06c6ae9b5..1af10a61667 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: proc.h,v 1.152 2012/03/10 05:54:28 guenther Exp $ */
+/* $OpenBSD: proc.h,v 1.153 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */
/*-
@@ -46,6 +46,7 @@
#include <sys/timeout.h> /* For struct timeout */
#include <sys/event.h> /* For struct klist */
#include <sys/mutex.h> /* For struct mutex */
+#include <sys/resource.h> /* For struct rusage */
#include <machine/atomic.h>
#ifdef _KERNEL
@@ -119,6 +120,18 @@ extern struct emul *emulsw[]; /* All emuls in system */
extern int nemuls; /* Number of emuls */
/*
+ * time usage: accumulated times in ticks
+ * One a second, each thread's immediate counts (p_[usi]ticks) are
+ * accumulated into these.
+ */
+struct tusage {
+ struct timeval tu_runtime; /* Realtime. */
+ uint64_t tu_uticks; /* Statclock hits in user mode. */
+ uint64_t tu_sticks; /* Statclock hits in system mode. */
+ uint64_t tu_iticks; /* Statclock hits processing intr. */
+};
+
+/*
* Description of a process.
*
* These structures contain the information needed to manage a thread of
@@ -166,6 +179,11 @@ struct process {
int ps_ptmask; /* Ptrace event mask */
struct ptrace_state *ps_ptstat;/* Ptrace state */
+ struct rusage *ps_ru; /* sum of stats for dead threads. */
+ struct tusage ps_tu; /* accumulated times. */
+ struct rusage ps_cru; /* sum of stats for reaped children */
+ struct itimerval ps_timer[3]; /* timers, indexed by ITIMER_* */
+
/* End area that is zeroed on creation. */
#define ps_endzero ps_startcopy
@@ -177,9 +195,21 @@ struct process {
u_int ps_rtableid; /* Process routing table/domain. */
char ps_nice; /* Process "nice" value. */
+ struct uprof { /* profile arguments */
+ caddr_t pr_base; /* buffer base */
+ size_t pr_size; /* buffer size */
+ u_long pr_off; /* pc offset */
+ u_int pr_scale; /* pc scaling */
+ } ps_prof;
+
/* End area that is copied on creation. */
#define ps_endcopy ps_refcnt
+ struct timeval ps_start; /* starting time. */
+ struct timeout ps_realit_to; /* real-time itimer trampoline. */
+ struct timeout ps_virt_to; /* virtual itimer trampoline. */
+ struct timeout ps_prof_to; /* prof itimer trampoline. */
+
int ps_refcnt; /* Number of references. */
};
@@ -223,7 +253,6 @@ struct proc {
/* substructures: */
struct filedesc *p_fd; /* Ptr to open files structure. */
- struct pstats *p_stats; /* Accounting/statistics */
struct vmspace *p_vmspace; /* Address space. */
struct sigacts *p_sigacts; /* Signal actions, state */
#define p_cred p_p->ps_cred
@@ -259,12 +288,12 @@ struct proc {
u_int p_slptime; /* Time since last blocked. */
struct cpu_info * __volatile p_cpu; /* CPU we're running on. */
- struct itimerval p_realtimer; /* Alarm timer. */
- struct timeout p_realit_to; /* Alarm timeout. */
+ struct rusage p_ru; /* Statistics */
+ struct tusage p_tu; /* accumulated times. */
struct timeval p_rtime; /* Real time. */
- u_quad_t p_uticks; /* Statclock hits in user mode. */
- u_quad_t p_sticks; /* Statclock hits in system mode. */
- u_quad_t p_iticks; /* Statclock hits processing intr. */
+ u_int p_uticks; /* Statclock hits in user mode. */
+ u_int p_sticks; /* Statclock hits in system mode. */
+ u_int p_iticks; /* Statclock hits processing intr. */
void *p_systrace; /* Back pointer to systrace */
@@ -311,9 +340,11 @@ struct proc {
int p_sicode; /* For core dump/debugger XXX */
long p_sitrapno; /* For core dump/debugger XXX */
+ u_long p_prof_addr; /* temp storage for profiling addr util AST */
+ u_long p_prof_ticks; /* temp storage for profiling ticks util AST */
+
u_short p_xstat; /* Exit status for wait; also stop signal. */
u_short p_acflag; /* Accounting flags. */
- struct rusage *p_ru; /* Exit information. XXX */
};
/* Status values. */
diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h
index 7fe5f6c8324..3dc7a2af309 100644
--- a/sys/sys/resourcevar.h
+++ b/sys/sys/resourcevar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: resourcevar.h,v 1.14 2011/07/11 15:40:47 guenther Exp $ */
+/* $OpenBSD: resourcevar.h,v 1.15 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */
/*
@@ -38,32 +38,6 @@
#include <sys/timeout.h>
/*
- * Kernel per-process accounting / statistics
- * (not necessarily resident except when running).
- */
-struct pstats {
-#define pstat_startzero p_ru
- struct rusage p_ru; /* stats for this proc */
- struct rusage p_cru; /* sum of stats for reaped children */
- struct itimerval p_timer[3]; /* virtual-time timers */
-#define pstat_endzero pstat_startcopy
-
-#define pstat_startcopy p_prof
- struct uprof { /* profile arguments */
- caddr_t pr_base; /* buffer base */
- size_t pr_size; /* buffer size */
- u_long pr_off; /* pc offset */
- u_int pr_scale; /* pc scaling */
- u_long pr_addr; /* temp storage for addr until AST */
- u_long pr_ticks; /* temp storage for ticks until AST */
- } p_prof;
-#define pstat_endcopy p_start
- struct timeval p_start; /* starting time */
- struct timeout p_virt_to; /* virtual itimer trampoline. */
- struct timeout p_prof_to; /* prof itimer trampoline. */
-};
-
-/*
* Kernel shareable process resource limits. Because this structure
* is moderately large but changes infrequently, it is shared
* copy-on-write after forks.
@@ -77,15 +51,16 @@ struct plimit {
#define ADDUPROF(p) \
do { \
atomic_clearbits_int(&(p)->p_flag, P_OWEUPC); \
- addupc_task((p), (p)->p_stats->p_prof.pr_addr, \
- (p)->p_stats->p_prof.pr_ticks); \
- (p)->p_stats->p_prof.pr_ticks = 0; \
+ addupc_task((p), (p)->p_prof_addr, (p)->p_prof_ticks); \
+ (p)->p_prof_ticks = 0; \
} while (0)
#ifdef _KERNEL
void addupc_intr(struct proc *p, u_long pc);
void addupc_task(struct proc *p, u_long pc, u_int ticks);
-void calcru(struct proc *p, struct timeval *up, struct timeval *sp,
+void tuagg_unlocked(struct process *, struct proc *);
+struct tusage;
+void calcru(struct tusage *, struct timeval *up, struct timeval *sp,
struct timeval *ip);
struct plimit *limcopy(struct plimit *lim);
void limfree(struct plimit *);
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 8c2d7a730bd..dcb12fedf16 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.120 2012/01/07 05:38:12 guenther Exp $ */
+/* $OpenBSD: sysctl.h,v 1.121 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -325,7 +325,7 @@ struct kinfo_proc {
u_int64_t p_addr; /* PTR: Kernel virtual addr of u-area */
u_int64_t p_fd; /* PTR: Ptr to open files structure. */
- u_int64_t p_stats; /* PTR: Accounting/statistics */
+ u_int64_t p_stats; /* unused, always zero. */
u_int64_t p_limit; /* PTR: Process limits. */
u_int64_t p_vmspace; /* PTR: Address space. */
u_int64_t p_sigacts; /* PTR: Signal actions, state */
@@ -458,7 +458,6 @@ struct kinfo_proc {
* sess - source struct session
* vm - source struct vmspace
* lim - source struct plimits
- * ps - source struct pstats
* sa - source struct sigacts
* There are some members that are not handled by these macros
* because they're too painful to generalize: p_pid, p_ppid, p_sid, p_tdev,
@@ -467,18 +466,18 @@ struct kinfo_proc {
#define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, lim, ps, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, lim, sa) \
do { \
memset((kp), 0, sizeof(*(kp))); \
\
(kp)->p_paddr = PTRTOINT64(paddr); \
(kp)->p_fd = PTRTOINT64((p)->p_fd); \
- (kp)->p_stats = PTRTOINT64((p)->p_stats); \
+ (kp)->p_stats = 0; \
(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((pg)->pg_session); \
- (kp)->p_ru = PTRTOINT64((p)->p_ru); \
+ (kp)->p_ru = PTRTOINT64((pr)->ps_ru); \
\
(kp)->p_exitsig = (p)->p_exitsig; \
(kp)->p_flag = (p)->p_flag | (pr)->ps_flags | P_INMEM; \
@@ -499,8 +498,8 @@ do { \
(kp)->p_jobc = (pg)->pg_jobc; \
\
(kp)->p_estcpu = (p)->p_estcpu; \
- (kp)->p_rtime_sec = (p)->p_rtime.tv_sec; \
- (kp)->p_rtime_usec = (p)->p_rtime.tv_usec; \
+ (kp)->p_rtime_sec = (pr)->ps_tu.tu_runtime.tv_sec; \
+ (kp)->p_rtime_usec = (pr)->ps_tu.tu_runtime.tv_usec; \
(kp)->p_cpticks = (p)->p_cpticks; \
(kp)->p_pctcpu = (p)->p_pctcpu; \
\
@@ -558,31 +557,31 @@ do { \
(kp)->p_rlim_rss_cur = \
(lim)->pl_rlimit[RLIMIT_RSS].rlim_cur; \
\
- if (!P_ZOMBIE(p) && (ps) != NULL) { \
+ if (!P_ZOMBIE(p)) { \
struct timeval tv; \
\
(kp)->p_uvalid = 1; \
\
- (kp)->p_ustart_sec = (ps)->p_start.tv_sec; \
- (kp)->p_ustart_usec = (ps)->p_start.tv_usec; \
+ (kp)->p_ustart_sec = (pr)->ps_start.tv_sec; \
+ (kp)->p_ustart_usec = (pr)->ps_start.tv_usec; \
\
- (kp)->p_uru_maxrss = (ps)->p_ru.ru_maxrss; \
- (kp)->p_uru_ixrss = (ps)->p_ru.ru_ixrss; \
- (kp)->p_uru_idrss = (ps)->p_ru.ru_idrss; \
- (kp)->p_uru_isrss = (ps)->p_ru.ru_isrss; \
- (kp)->p_uru_minflt = (ps)->p_ru.ru_minflt; \
- (kp)->p_uru_majflt = (ps)->p_ru.ru_majflt; \
- (kp)->p_uru_nswap = (ps)->p_ru.ru_nswap; \
- (kp)->p_uru_inblock = (ps)->p_ru.ru_inblock; \
- (kp)->p_uru_oublock = (ps)->p_ru.ru_oublock; \
- (kp)->p_uru_msgsnd = (ps)->p_ru.ru_msgsnd; \
- (kp)->p_uru_msgrcv = (ps)->p_ru.ru_msgrcv; \
- (kp)->p_uru_nsignals = (ps)->p_ru.ru_nsignals; \
- (kp)->p_uru_nvcsw = (ps)->p_ru.ru_nvcsw; \
- (kp)->p_uru_nivcsw = (ps)->p_ru.ru_nivcsw; \
+ (kp)->p_uru_maxrss = (p)->p_ru.ru_maxrss; \
+ (kp)->p_uru_ixrss = (p)->p_ru.ru_ixrss; \
+ (kp)->p_uru_idrss = (p)->p_ru.ru_idrss; \
+ (kp)->p_uru_isrss = (p)->p_ru.ru_isrss; \
+ (kp)->p_uru_minflt = (p)->p_ru.ru_minflt; \
+ (kp)->p_uru_majflt = (p)->p_ru.ru_majflt; \
+ (kp)->p_uru_nswap = (p)->p_ru.ru_nswap; \
+ (kp)->p_uru_inblock = (p)->p_ru.ru_inblock; \
+ (kp)->p_uru_oublock = (p)->p_ru.ru_oublock; \
+ (kp)->p_uru_msgsnd = (p)->p_ru.ru_msgsnd; \
+ (kp)->p_uru_msgrcv = (p)->p_ru.ru_msgrcv; \
+ (kp)->p_uru_nsignals = (p)->p_ru.ru_nsignals; \
+ (kp)->p_uru_nvcsw = (p)->p_ru.ru_nvcsw; \
+ (kp)->p_uru_nivcsw = (p)->p_ru.ru_nivcsw; \
\
- timeradd(&(ps)->p_cru.ru_utime, \
- &(ps)->p_cru.ru_stime, &tv); \
+ timeradd(&(pr)->ps_cru.ru_utime, \
+ &(pr)->ps_cru.ru_stime, &tv); \
(kp)->p_uctime_sec = tv.tv_sec; \
(kp)->p_uctime_usec = tv.tv_usec; \
} \
diff --git a/sys/sys/user.h b/sys/sys/user.h
index aebafb72943..b057508e5bf 100644
--- a/sys/sys/user.h
+++ b/sys/sys/user.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: user.h,v 1.7 2010/06/29 20:48:50 guenther Exp $ */
+/* $OpenBSD: user.h,v 1.8 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: user.h,v 1.10 1996/04/09 20:55:49 cgd Exp $ */
/*
@@ -55,6 +55,4 @@
struct user {
struct pcb u_pcb;
-
- struct pstats u_stats; /* p_stats points here (use it!) */
};
diff --git a/sys/ufs/ext2fs/ext2fs_bmap.c b/sys/ufs/ext2fs/ext2fs_bmap.c
index f685d496984..ec77ae33ec5 100644
--- a/sys/ufs/ext2fs/ext2fs_bmap.c
+++ b/sys/ufs/ext2fs/ext2fs_bmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ext2fs_bmap.c,v 1.19 2011/07/04 20:35:35 deraadt Exp $ */
+/* $OpenBSD: ext2fs_bmap.c,v 1.20 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: ext2fs_bmap.c,v 1.5 2000/03/30 12:41:11 augustss Exp $ */
/*
@@ -188,7 +188,7 @@ ext2fs_bmaparray(struct vnode *vp, int32_t bn, daddr64_t *bnp,
bp->b_blkno = blkptrtodb(ump, daddr);
bp->b_flags |= B_READ;
VOP_STRATEGY(bp);
- curproc->p_stats->p_ru.ru_inblock++; /* XXX */
+ curproc->p_ru.ru_inblock++; /* XXX */
bcstats.pendingreads++;
if ((error = biowait(bp)) != 0) {
brelse(bp);
diff --git a/sys/ufs/ext2fs/ext2fs_inode.c b/sys/ufs/ext2fs/ext2fs_inode.c
index a1e467fc038..3158a0a70ce 100644
--- a/sys/ufs/ext2fs/ext2fs_inode.c
+++ b/sys/ufs/ext2fs/ext2fs_inode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ext2fs_inode.c,v 1.44 2011/07/04 04:30:41 tedu Exp $ */
+/* $OpenBSD: ext2fs_inode.c,v 1.45 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: ext2fs_inode.c,v 1.24 2001/06/19 12:59:18 wiz Exp $ */
/*
@@ -465,7 +465,7 @@ ext2fs_indirtrunc(struct inode *ip, int32_t lbn, int32_t dbn, int32_t lastbn, in
vp = ITOV(ip);
bp = getblk(vp, lbn, (int)fs->e2fs_bsize, 0, 0);
if (!(bp->b_flags & (B_DONE | B_DELWRI))) {
- curproc->p_stats->p_ru.ru_inblock++; /* pay for read */
+ curproc->p_ru.ru_inblock++; /* pay for read */
bcstats.pendingreads++;
bcstats.numreads++;
bp->b_flags |= B_READ;
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 597bd4ecca4..3ecd74c2e0e 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ffs_inode.c,v 1.60 2011/08/16 14:36:39 thib Exp $ */
+/* $OpenBSD: ffs_inode.c,v 1.61 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: ffs_inode.c,v 1.10 1996/05/11 18:27:19 mycroft Exp $ */
/*
@@ -525,7 +525,7 @@ ffs_indirtrunc(struct inode *ip, daddr64_t lbn, daddr64_t dbn,
vp = ITOV(ip);
bp = getblk(vp, lbn, (int)fs->fs_bsize, 0, 0);
if (!(bp->b_flags & (B_DONE | B_DELWRI))) {
- curproc->p_stats->p_ru.ru_inblock++; /* pay for read */
+ curproc->p_ru.ru_inblock++; /* pay for read */
bcstats.pendingreads++;
bcstats.numreads++;
bp->b_flags |= B_READ;
diff --git a/sys/ufs/ufs/ufs_bmap.c b/sys/ufs/ufs/ufs_bmap.c
index ef72bd84c81..86a49ff93c5 100644
--- a/sys/ufs/ufs/ufs_bmap.c
+++ b/sys/ufs/ufs/ufs_bmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ufs_bmap.c,v 1.31 2011/09/18 11:18:28 miod Exp $ */
+/* $OpenBSD: ufs_bmap.c,v 1.32 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: ufs_bmap.c,v 1.3 1996/02/09 22:36:00 christos Exp $ */
/*
@@ -175,7 +175,7 @@ ufs_bmaparray(struct vnode *vp, daddr64_t bn, daddr64_t *bnp, struct indir *ap,
bcstats.pendingreads++;
bcstats.numreads++;
VOP_STRATEGY(bp);
- curproc->p_stats->p_ru.ru_inblock++; /* XXX */
+ curproc->p_ru.ru_inblock++; /* XXX */
if ((error = biowait(bp)) != 0) {
brelse(bp);
return (error);
diff --git a/sys/uvm/uvm_fault.c b/sys/uvm/uvm_fault.c
index 03a4418dac6..ba8ea7c5cc7 100644
--- a/sys/uvm/uvm_fault.c
+++ b/sys/uvm/uvm_fault.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_fault.c,v 1.63 2012/03/09 13:01:29 ariane Exp $ */
+/* $OpenBSD: uvm_fault.c,v 1.64 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: uvm_fault.c,v 1.51 2000/08/06 00:22:53 thorpej Exp $ */
/*
@@ -302,9 +302,9 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap,
uvmexp.fltanget++;
/* bump rusage counters */
if (anon->an_page)
- curproc->p_addr->u_stats.p_ru.ru_minflt++;
+ curproc->p_ru.ru_minflt++;
else
- curproc->p_addr->u_stats.p_ru.ru_majflt++;
+ curproc->p_ru.ru_majflt++;
/*
* loop until we get it, or fail.
@@ -1268,10 +1268,10 @@ Case2:
if (uobjpage) {
/* update rusage counters */
- curproc->p_addr->u_stats.p_ru.ru_minflt++;
+ curproc->p_ru.ru_minflt++;
} else {
/* update rusage counters */
- curproc->p_addr->u_stats.p_ru.ru_majflt++;
+ curproc->p_ru.ru_majflt++;
/* locked: maps(read), amap(if there), uobj */
uvmfault_unlockall(&ufi, amap, NULL, NULL);
diff --git a/sys/uvm/uvm_glue.c b/sys/uvm/uvm_glue.c
index aa55afbd07d..c2d205ce656 100644
--- a/sys/uvm/uvm_glue.c
+++ b/sys/uvm/uvm_glue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_glue.c,v 1.58 2011/04/15 21:47:24 oga Exp $ */
+/* $OpenBSD: uvm_glue.c,v 1.59 2012/03/23 15:51:26 guenther Exp $ */
/* $NetBSD: uvm_glue.c,v 1.44 2001/02/06 19:54:44 eeh Exp $ */
/*
@@ -315,8 +315,6 @@ void
uvm_fork(struct proc *p1, struct proc *p2, boolean_t shared, void *stack,
size_t stacksize, void (*func)(void *), void * arg)
{
- struct user *up = p2->p_addr;
-
if (shared == TRUE) {
p2->p_vmspace = NULL;
uvmspace_share(p1, p2); /* share vmspace */
@@ -325,22 +323,10 @@ uvm_fork(struct proc *p1, struct proc *p2, boolean_t shared, void *stack,
#ifdef PMAP_UAREA
/* Tell the pmap this is a u-area mapping */
- PMAP_UAREA((vaddr_t)up);
+ PMAP_UAREA((vaddr_t)p2->p_addr);
#endif
/*
- * p_stats currently points at a field in the user struct. Copy
- * parts of p_stats, and zero out the rest.
- */
- p2->p_stats = &up->u_stats;
- memset(&up->u_stats.pstat_startzero, 0,
- ((caddr_t)&up->u_stats.pstat_endzero -
- (caddr_t)&up->u_stats.pstat_startzero));
- memcpy(&up->u_stats.pstat_startcopy, &p1->p_stats->pstat_startcopy,
- ((caddr_t)&up->u_stats.pstat_endcopy -
- (caddr_t)&up->u_stats.pstat_startcopy));
-
- /*
* cpu_fork() copy and update the pcb, and make the child ready
* to run. If this is a normal user fork, the child will exit
* directly to user mode via child_return() on its first time