Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/vmstat make this work with the per-cpu counters.
details: https://anonhg.NetBSD.org/src/rev/eb26059f32b8
branches: trunk
changeset: 759911:eb26059f32b8
user: christos <christos%NetBSD.org@localhost>
date: Mon Dec 20 04:25:03 2010 +0000
description:
make this work with the per-cpu counters.
diffstat:
usr.bin/vmstat/Makefile | 4 +-
usr.bin/vmstat/vmstat.c | 75 +++++++++++++++++++++++++++++++++++++++---------
2 files changed, 64 insertions(+), 15 deletions(-)
diffs (190 lines):
diff -r bb478af77e61 -r eb26059f32b8 usr.bin/vmstat/Makefile
--- a/usr.bin/vmstat/Makefile Mon Dec 20 01:12:44 2010 +0000
+++ b/usr.bin/vmstat/Makefile Mon Dec 20 04:25:03 2010 +0000
@@ -1,9 +1,11 @@
-# $NetBSD: Makefile,v 1.27 2009/04/14 22:15:28 lukem Exp $
+# $NetBSD: Makefile,v 1.28 2010/12/20 04:25:03 christos Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
+.include <bsd.own.mk>
USE_FORT?= yes # setgid
PROG= vmstat
+CPPFLAGS+=-D_KMEMUSER -I${NETBSDSRCDIR}/sys
SRCS= drvstats.c vmstat.c
MAN= vmstat.1
DPADD= ${LIBKVM}
diff -r bb478af77e61 -r eb26059f32b8 usr.bin/vmstat/vmstat.c
--- a/usr.bin/vmstat/vmstat.c Mon Dec 20 01:12:44 2010 +0000
+++ b/usr.bin/vmstat/vmstat.c Mon Dec 20 04:25:03 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vmstat.c,v 1.170 2010/10/18 19:39:32 christos Exp $ */
+/* $NetBSD: vmstat.c,v 1.171 2010/12/20 04:25:03 christos Exp $ */
/*-
* Copyright (c) 1998, 2000, 2001, 2007 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
#if 0
static char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 3/1/95";
#else
-__RCSID("$NetBSD: vmstat.c,v 1.170 2010/10/18 19:39:32 christos Exp $");
+__RCSID("$NetBSD: vmstat.c,v 1.171 2010/12/20 04:25:03 christos Exp $");
#endif
#endif /* not lint */
@@ -93,6 +93,8 @@
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/user.h>
+#include <sys/queue.h>
+#include <sys/cpu.h>
#include <uvm/uvm_extern.h>
#include <uvm/uvm_stat.h>
@@ -154,7 +156,9 @@
{ .n_name = "_time_second" },
#define X_TIME 10
{ .n_name = "_time" },
-#define X_NL_SIZE 11
+#define X_CPU_QUEUE 11
+ { .n_name = "_cpu_queue" },
+#define X_NL_SIZE 12
{ .n_name = NULL },
};
@@ -226,7 +230,17 @@
#define KILO 1024
+struct cpu_counter {
+ uint64_t nintr;
+ uint64_t nsyscall;
+ uint64_t nswtch;
+ uint64_t nfault;
+ uint64_t ntrap;
+ uint64_t nsoft;
+} cpucounter, ocpucounter;
+
struct uvmexp uvmexp, ouvmexp;
+struct cpuqueue cpu_queue;
int ndrives;
int winlines = 20;
@@ -263,6 +277,7 @@
} while (/* CONSTCOND */0)
void cpustats(int *);
+void cpucounters(struct cpu_counter *);
void deref_kptr(const void *, void *, size_t, const char *);
void drvstats(int *);
void doevcnt(int verbose);
@@ -664,6 +679,8 @@
if (!hz)
kread(namelist, X_HZ, &hz, sizeof(hz));
+ kread(namelist, X_CPU_QUEUE, &cpu_queue, sizeof(cpu_queue));
+
for (hdrcnt = 1;;) {
if (!--hdrcnt)
printhdr();
@@ -687,6 +704,7 @@
(void)memset(&total, 0, sizeof(total));
}
}
+ cpucounters(&cpucounter);
ovflw = 0;
PRWORD(ovflw, " %*d", 2, 1, total.t_rq - 1);
PRWORD(ovflw, " %*d", 2, 1, total.t_dw + total.t_pw);
@@ -695,7 +713,7 @@
PRWORD(ovflw, " %*ld", 9, 1, pgtok(total.t_avm));
PRWORD(ovflw, " %*ld", 7, 1, pgtok(total.t_free));
PRWORD(ovflw, " %*ld", 5, 1,
- rate(uvmexp.faults - ouvmexp.faults));
+ rate(cpucounter.nfault - ocpucounter.nfault));
PRWORD(ovflw, " %*ld", 4, 1,
rate(uvmexp.pdreact - ouvmexp.pdreact));
PRWORD(ovflw, " %*ld", 4, 1,
@@ -708,17 +726,17 @@
rate(uvmexp.pdscans - ouvmexp.pdscans));
drvstats(&ovflw);
PRWORD(ovflw, " %*ld", 5, 1,
- rate(uvmexp.intrs - ouvmexp.intrs));
+ rate(cpucounter.nintr - ocpucounter.nintr));
PRWORD(ovflw, " %*ld", 5, 1,
- rate(uvmexp.syscalls - ouvmexp.syscalls));
+ rate(cpucounter.nsyscall - ocpucounter.nsyscall));
PRWORD(ovflw, " %*ld", 4, 1,
- rate(uvmexp.swtch - ouvmexp.swtch));
+ rate(cpucounter.nswtch - ocpucounter.nswtch));
cpustats(&ovflw);
(void)putchar('\n');
(void)fflush(stdout);
if (reps >= 0 && --reps <= 0)
break;
- ouvmexp = uvmexp;
+ ocpucounter = cpucounter;
uptime = interval->tv_sec;
/*
* We round upward to avoid losing low-frequency events
@@ -784,6 +802,7 @@
struct uvmexp_sysctl uvmexp2;
size_t ssize;
int active_kernel;
+ struct cpu_counter cc;
/*
* The "active" and "inactive" variables
@@ -832,12 +851,14 @@
(void)printf("%9u swap pages in use\n", uvmexp.swpginuse);
(void)printf("%9u swap allocations\n", uvmexp.nswget);
- (void)printf("%9u total faults taken\n", uvmexp.faults);
- (void)printf("%9u traps\n", uvmexp.traps);
- (void)printf("%9u device interrupts\n", uvmexp.intrs);
- (void)printf("%9u CPU context switches\n", uvmexp.swtch);
- (void)printf("%9u software interrupts\n", uvmexp.softs);
- (void)printf("%9u system calls\n", uvmexp.syscalls);
+ kread(namelist, X_CPU_QUEUE, &cpu_queue, sizeof(cpu_queue));
+ cpucounters(&cc);
+ (void)printf("%9" PRIu64 " total faults taken\n", cc.nfault);
+ (void)printf("%9" PRIu64 " traps\n", cc.ntrap);
+ (void)printf("%9" PRIu64 " device interrupts\n", cc.nintr);
+ (void)printf("%9" PRIu64 " CPU context switches\n", cc.nswtch);
+ (void)printf("%9" PRIu64 " software interrupts\n", cc.nsoft);
+ (void)printf("%9" PRIu64 " system calls\n", cc.nsyscall);
(void)printf("%9u pagein requests\n", uvmexp.pageins);
(void)printf("%9u pageout requests\n", uvmexp.pdpageouts);
(void)printf("%9u pages swapped in\n", uvmexp.pgswapin);
@@ -951,6 +972,32 @@
}
void
+cpucounters(struct cpu_counter *cc)
+{
+ struct cpu_info *ci;
+ (void)memset(cc, 0, sizeof(*cc));
+ CIRCLEQ_FOREACH(ci, &cpu_queue, ci_data.cpu_qchain) {
+ struct cpu_info tci;
+ if ((size_t)kvm_read(kd, (u_long)ci, &tci, sizeof(tci))
+ != sizeof(tci)) {
+ warnx("Can't read cpu info from %p (%s)",
+ ci, kvm_geterr(kd));
+ continue;
+ }
+ /* Found the fake element, done */
+ if (tci.ci_data.cpu_qchain.cqe_prev == NULL)
+ break;
+ cc->nintr += tci.ci_data.cpu_nintr;
+ cc->nsyscall += tci.ci_data.cpu_nsyscall;
+ cc->nswtch = tci.ci_data.cpu_nswtch;
+ cc->nfault = tci.ci_data.cpu_nfault;
+ cc->ntrap = tci.ci_data.cpu_ntrap;
+ cc->nsoft = tci.ci_data.cpu_nsoft;
+ ci = &tci;
+ }
+}
+
+void
cpustats(int *ovflwp)
{
int state;
Home |
Main Index |
Thread Index |
Old Index