summaryrefslogtreecommitdiffstats
path: root/freebsd/usr.bin/vmstat/vmstat.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/usr.bin/vmstat/vmstat.c')
-rw-r--r--freebsd/usr.bin/vmstat/vmstat.c92
1 files changed, 43 insertions, 49 deletions
diff --git a/freebsd/usr.bin/vmstat/vmstat.c b/freebsd/usr.bin/vmstat/vmstat.c
index 19b1f7ef..fcdb6314 100644
--- a/freebsd/usr.bin/vmstat/vmstat.c
+++ b/freebsd/usr.bin/vmstat/vmstat.c
@@ -95,7 +95,7 @@ __FBSDID("$FreeBSD$");
static char da[] = "da";
enum x_stats { X_SUM, X_HZ, X_STATHZ, X_NCHSTATS, X_INTRNAMES, X_SINTRNAMES,
- X_INTRCNT, X_SINTRCNT, X_DEFICIT, X_REC, X_PGIN, X_XSTATS };
+ X_INTRCNT, X_SINTRCNT, X_NINTRCNT };
static struct nlist namelist[] = {
[X_SUM] = { .n_name = "_vm_cnt", },
@@ -106,12 +106,7 @@ static struct nlist namelist[] = {
[X_SINTRNAMES] = { .n_name = "_sintrnames", },
[X_INTRCNT] = { .n_name = "_intrcnt", },
[X_SINTRCNT] = { .n_name = "_sintrcnt", },
-#ifdef notyet
- [X_DEFICIT] = { .n_name = "_deficit", },
- [X_REC] = { .n_name = "_rectime", },
- [X_PGIN] = { .n_name = "_pgintime", },
- [X_XSTATS] = { .n_name = "_xstats", },
-#endif
+ [X_NINTRCNT] = { .n_name = "_nintrcnt", },
{ .n_name = NULL, },
};
@@ -217,6 +212,7 @@ static void domemstat_zone(void);
#ifndef __rtems__
static void kread(int, void *, size_t);
static void kreado(int, void *, size_t, size_t);
+static void kreadptr(uintptr_t, void *, size_t);
static void needhdr(int);
static void needresize(int);
static void doresize(void);
@@ -253,7 +249,8 @@ main(int argc, char *argv[])
#endif /* __rtems__ */
float f;
#ifndef __rtems__
- int bufsize, c, len, reps, todo;
+ int bufsize, c, reps, todo;
+ size_t len;
#else /* __rtems__ */
int c, reps, todo;
#endif /* __rtems__ */
@@ -284,7 +281,7 @@ main(int argc, char *argv[])
if (argc < 0)
return (argc);
- while ((c = getopt(argc, argv, "ac:fhHiM:mN:n:oPp:stw:z")) != -1) {
+ while ((c = getopt(argc, argv, "ac:fhHiM:mN:n:oPp:sw:z")) != -1) {
switch (c) {
#ifndef __rtems__
case 'a':
@@ -335,14 +332,6 @@ main(int argc, char *argv[])
case 's':
todo |= SUMSTAT;
break;
- case 't':
-#ifdef notyet
- todo |= TIMESTAT;
-#else
- xo_errx(EX_USAGE,
- "sorry, -t is not (re)implemented yet");
-#endif
- break;
case 'w':
/* Convert to milliseconds. */
f = atof(optarg);
@@ -374,7 +363,8 @@ main(int argc, char *argv[])
retry_nlist:
if (kd != NULL && (c = kvm_nlist(kd, namelist)) != 0) {
if (c > 0) {
- bufsize = 0, len = 0;
+ bufsize = 0;
+ len = 0;
/*
* 'cnt' was renamed to 'vm_cnt'. If 'vm_cnt' is not
@@ -386,6 +376,13 @@ retry_nlist:
goto retry_nlist;
}
+ /*
+ * 'nintrcnt' doesn't exist in older kernels, but
+ * that isn't fatal.
+ */
+ if (namelist[X_NINTRCNT].n_type == 0 && c == 1)
+ goto nlist_ok;
+
for (c = 0; c < (int)(nitems(namelist)); c++)
if (namelist[c].n_type == 0)
bufsize += strlen(namelist[c].n_name)
@@ -409,6 +406,7 @@ retry_nlist:
xo_finish();
exit(1);
}
+nlist_ok:
if (kd && Pflag)
xo_errx(1, "Cannot use -P with crash dumps");
@@ -452,10 +450,6 @@ retry_nlist:
dosum();
if (todo & OBJSTAT)
doobjstat();
-#ifdef notyet
- if (todo & TIMESTAT)
- dotimes();
-#endif
if (todo & INTRSTAT)
dointr(interval, reps);
if (todo & VMSTAT)
@@ -498,8 +492,11 @@ getdrivedata(char **argv)
if (isdigit(**argv))
break;
num_devices_specified++;
- specified_devices = realloc(specified_devices,
+ specified_devices = reallocf(specified_devices,
sizeof(char *) * num_devices_specified);
+ if (specified_devices == NULL) {
+ xo_errx(1, "%s", "reallocf (specified_devices)");
+ }
specified_devices[num_devices_specified - 1] = *argv;
}
dev_select = NULL;
@@ -1024,29 +1021,6 @@ doresize(void)
wresized = 0;
}
-#ifdef notyet
-static void
-dotimes(void)
-{
- unsigned int pgintime, rectime;
-
- kread(X_REC, &rectime, sizeof(rectime));
- kread(X_PGIN, &pgintime, sizeof(pgintime));
- kread(X_SUM, &sum, sizeof(sum));
- xo_emit("{:page-reclaims/%u} {N:reclaims}, "
- "{:reclaim-time/%u} {N:total time (usec)}\n",
- sum.v_pgrec, rectime);
- xo_emit("{L:average}: {:reclaim-average/%u} {N:usec \\/ reclaim}\n",
- rectime / sum.v_pgrec);
- xo_emit("\n");
- xo_emit("{:page-ins/%u} {N:page ins}, "
- "{:page-in-time/%u} {N:total time (msec)}\n",
- sum.v_pgin, pgintime / 10);
- xo_emit("{L:average}: {:average/%8.1f} {N:msec \\/ page in}\n",
- pgintime / (sum.v_pgin * 10.0));
-}
-#endif
-
static long
pct(long top, long bot)
{
@@ -1268,7 +1242,7 @@ cpustats(void)
total = 0;
for (state = 0; state < CPUSTATES; ++state)
total += cur.cp_time[state];
- if (total)
+ if (total > 0)
lpct = 100.0 / total;
else
lpct = 0.0;
@@ -1330,12 +1304,18 @@ static unsigned int
read_intrcnts(unsigned long **intrcnts)
{
size_t intrcntlen;
+ uintptr_t kaddr;
if (kd != NULL) {
kread(X_SINTRCNT, &intrcntlen, sizeof(intrcntlen));
if ((*intrcnts = malloc(intrcntlen)) == NULL)
err(1, "malloc()");
- kread(X_INTRCNT, *intrcnts, intrcntlen);
+ if (namelist[X_NINTRCNT].n_type == 0)
+ kread(X_INTRCNT, *intrcnts, intrcntlen);
+ else {
+ kread(X_INTRCNT, &kaddr, sizeof(kaddr));
+ kreadptr(kaddr, *intrcnts, intrcntlen);
+ }
} else {
for (*intrcnts = NULL, intrcntlen = 1024; ; intrcntlen *= 2) {
*intrcnts = reallocf(*intrcnts, intrcntlen);
@@ -1392,6 +1372,7 @@ dointr(unsigned int interval, int reps)
char *intrname, *intrnames;
long long period_ms, old_uptime, uptime;
size_t clen, inamlen, istrnamlen;
+ uintptr_t kaddr;
unsigned int nintr;
old_intrcnts = NULL;
@@ -1402,7 +1383,12 @@ dointr(unsigned int interval, int reps)
kread(X_SINTRNAMES, &inamlen, sizeof(inamlen));
if ((intrnames = malloc(inamlen)) == NULL)
xo_err(1, "malloc()");
- kread(X_INTRNAMES, intrnames, inamlen);
+ if (namelist[X_NINTRCNT].n_type == 0)
+ kread(X_INTRNAMES, intrnames, inamlen);
+ else {
+ kread(X_INTRNAMES, &kaddr, sizeof(kaddr));
+ kreadptr(kaddr, intrnames, inamlen);
+ }
} else {
for (intrnames = NULL, inamlen = 1024; ; inamlen *= 2) {
if ((intrnames = reallocf(intrnames, inamlen)) == NULL)
@@ -1755,6 +1741,14 @@ kread(int nlx, void *addr, size_t size)
#endif /* __rtems__ */
static void
+kreadptr(uintptr_t addr, void *buf, size_t size)
+{
+
+ if ((size_t)kvm_read(kd, addr, buf, size) != size)
+ xo_errx(1, "%s", kvm_geterr(kd));
+}
+
+static void __dead2
usage(void)
{
xo_error("%s%s",