diff options
-rw-r--r-- | sys/kern/kern_exit.c | 7 | ||||
-rw-r--r-- | sys/kern/kern_resource.c | 10 | ||||
-rw-r--r-- | sys/sys/ktrace.h | 4 | ||||
-rw-r--r-- | sys/sys/resourcevar.h | 3 | ||||
-rw-r--r-- | usr.bin/kdump/ktrstruct.c | 36 |
5 files changed, 51 insertions, 9 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 8898850f9aa..113561cc64d 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exit.c,v 1.132 2014/01/21 06:22:37 guenther Exp $ */ +/* $OpenBSD: kern_exit.c,v 1.133 2014/01/24 04:26:51 guenther Exp $ */ /* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */ /* @@ -318,6 +318,7 @@ exit1(struct proc *p, int rv, int flags) /* add thread's accumulated rusage into the process's total */ ruadd(rup, &p->p_ru); + tuagg(pr, p); /* * clear %cpu usage during swap @@ -493,6 +494,10 @@ sys_wait4(struct proc *q, void *v, register_t *retval) } if (error == 0 && SCARG(uap, rusage)) { error = copyout(&ru, SCARG(uap, rusage), sizeof(ru)); +#ifdef KTRACE + if (error == 0 && KTRPOINT(q, KTR_STRUCT)) + ktrrusage(q, &ru); +#endif } return (error); } diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index ef26fa57864..bec11baaf07 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_resource.c,v 1.48 2014/01/21 01:48:44 tedu Exp $ */ +/* $OpenBSD: kern_resource.c,v 1.49 2014/01/24 04:26:51 guenther Exp $ */ /* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */ /*- @@ -53,7 +53,6 @@ #include <uvm/uvm_extern.h> void tuagg_sub(struct tusage *, struct proc *); -void tuagg(struct process *, struct proc *); /* * Patchable maximum data and stack limits. @@ -428,8 +427,13 @@ sys_getrusage(struct proc *p, void *v, register_t *retval) int error; error = dogetrusage(p, SCARG(uap, who), &ru); - if (error == 0) + if (error == 0) { error = copyout(&ru, SCARG(uap, rusage), sizeof(ru)); +#ifdef KTRACE + if (error == 0 && KTRPOINT(p, KTR_STRUCT)) + ktrrusage(p, &ru); +#endif + } return (error); } diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h index 4f4b3c6055c..6ca27fecea2 100644 --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ktrace.h,v 1.17 2013/09/14 02:28:02 guenther Exp $ */ +/* $OpenBSD: ktrace.h,v 1.18 2014/01/24 04:26:51 guenther Exp $ */ /* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */ /* @@ -224,6 +224,8 @@ void ktrstruct(struct proc *, const char *, const void *, size_t); ktrstruct((p), "sigaction", (s), sizeof(struct sigaction)) #define ktrrlimit(p, s) \ ktrstruct((p), "rlimit", (s), sizeof(struct rlimit)) +#define ktrrusage(p, s) \ + ktrstruct((p), "rusage", (s), sizeof(struct rusage)) #define ktrfdset(p, s, l) \ ktrstruct((p), "fdset", (s), l) diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index 3b6b0871b88..83449e1d738 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: resourcevar.h,v 1.17 2013/10/08 03:50:07 guenther Exp $ */ +/* $OpenBSD: resourcevar.h,v 1.18 2014/01/24 04:26:51 guenther Exp $ */ /* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */ /* @@ -59,6 +59,7 @@ do { \ void addupc_intr(struct proc *, u_long); void addupc_task(struct proc *, u_long, u_int); void tuagg_unlocked(struct process *, struct proc *); +void tuagg(struct process *, struct proc *); struct tusage; void calctsru(struct tusage *, struct timespec *, struct timespec *, struct timespec *); diff --git a/usr.bin/kdump/ktrstruct.c b/usr.bin/kdump/ktrstruct.c index 36fc2642053..4acdb5e016c 100644 --- a/usr.bin/kdump/ktrstruct.c +++ b/usr.bin/kdump/ktrstruct.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ktrstruct.c,v 1.2 2013/09/09 05:10:32 guenther Exp $ */ +/* $OpenBSD: ktrstruct.c,v 1.3 2014/01/24 04:26:51 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -208,12 +208,18 @@ ktrtimespec(const struct timespec *tsp, int relative) } static void -ktrtimeval(const struct timeval *tvp, int relative) +print_timeval(const struct timeval *tvp, int relative) { - printf("struct timeval { "); print_time(tvp->tv_sec, relative); if (tvp->tv_usec != 0) printf(".%06ld", tvp->tv_usec); +} + +static void +ktrtimeval(const struct timeval *tvp, int relative) +{ + printf("struct timeval { "); + print_timeval(tvp, relative); printf(" }\n"); } @@ -294,6 +300,23 @@ ktrfdset(const struct fd_set *fds, int len) printf(" }\n"); } +static void +ktrrusage(const struct rusage *rup) +{ + printf("struct rusage { utime="); + print_timeval(&rup->ru_utime, 1); + printf(", stime="); + print_timeval(&rup->ru_stime, 1); + printf(", maxrss=%ld, ixrss=%ld, idrss=%ld, isrss=%ld," + " minflt=%ld, majflt=%ld, nswap=%ld, inblock=%ld," + " oublock=%ld, msgsnd=%ld, msgrcv=%ld, nsignals=%ld," + " nvcsw=%ld, nivcsw=%ld }\n", + rup->ru_maxrss, rup->ru_ixrss, rup->ru_idrss, rup->ru_isrss, + rup->ru_minflt, rup->ru_majflt, rup->ru_nswap, rup->ru_inblock, + rup->ru_oublock, rup->ru_msgsnd, rup->ru_msgrcv, rup->ru_nsignals, + rup->ru_nvcsw, rup->ru_nivcsw); +} + void ktrstruct(char *buf, size_t buflen) { @@ -363,6 +386,13 @@ ktrstruct(char *buf, size_t buflen) goto invalid; memcpy(&lim, data, datalen); ktrrlimit(&lim); + } else if (strcmp(name, "rusage") == 0) { + struct rusage ru; + + if (datalen != sizeof(ru)) + goto invalid; + memcpy(&ru, data, datalen); + ktrrusage(&ru); } else if (strcmp(name, "tfork") == 0) { struct __tfork tf; |