summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_exit.c7
-rw-r--r--sys/kern/kern_resource.c10
-rw-r--r--sys/sys/ktrace.h4
-rw-r--r--sys/sys/resourcevar.h3
-rw-r--r--usr.bin/kdump/ktrstruct.c36
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;