Page MenuHomeFreeBSD

D36628.id110963.diff
No OneTemporary

D36628.id110963.diff

diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c
--- a/usr.bin/vmstat/vmstat.c
+++ b/usr.bin/vmstat/vmstat.c
@@ -604,18 +604,17 @@
}
/* Determine how many cpu columns, and what index they are in kern.cp_times */
-static int
+static void
getcpuinfo(u_long *maskp, int *maxidp)
{
long *times;
u_long mask;
size_t size;
- int empty, i, j, maxcpu, maxid, ncpus;
+ int empty, i, j, maxcpu, maxid;
if (kd != NULL)
xo_errx(1, "not implemented");
mask = 0;
- ncpus = 0;
size = sizeof(maxcpu);
mysysctl("kern.smp.maxcpus", &maxcpu, &size);
if (size != sizeof(maxcpu))
@@ -632,16 +631,13 @@
if (times[i * CPUSTATES + j] != 0)
empty = 0;
}
- if (!empty) {
+ if (!empty)
mask |= (1ul << i);
- ncpus++;
- }
}
if (maskp)
*maskp = mask;
if (maxidp)
*maxidp = maxid;
- return (ncpus);
}
@@ -670,12 +666,11 @@
u_long cpumask;
size_t size;
time_t uptime, halfuptime;
- int ncpus, maxid, rate_adj, retval;
+ int maxid, rate_adj, retval;
uptime = getuptime() / 1000000000LL;
halfuptime = uptime / 2;
rate_adj = 1;
- ncpus = 1;
maxid = 0;
cpumask = 0;
@@ -714,7 +709,7 @@
}
if (Pflag) {
- ncpus = getcpuinfo(&cpumask, &maxid);
+ getcpuinfo(&cpumask, &maxid);
size_cp_times = sizeof(long) * (maxid + 1) * CPUSTATES;
cur_cp_times = calloc(1, size_cp_times);
last_cp_times = calloc(1, size_cp_times);
@@ -1262,10 +1257,19 @@
size_t intrcntlen;
uintptr_t kaddr;
- if (kd != NULL) {
+ if (kd != NULL)
kread(X_SINTRCNT, &intrcntlen, sizeof(intrcntlen));
- if ((*intrcnts = malloc(intrcntlen)) == NULL)
- err(1, "malloc()");
+ else
+ if (mysysctl("hw.intrcnt", NULL, &intrcntlen) != 0)
+ err(1, "mysysctl()");
+
+ if (intrcnts == NULL)
+ return (intrcntlen / sizeof(unsigned long));
+
+ if ((*intrcnts = malloc(intrcntlen)) == NULL)
+ err(1, "malloc()");
+
+ if (kd != NULL) {
if (namelist[X_NINTRCNT].n_type == 0)
kread(X_INTRCNT, *intrcnts, intrcntlen);
else {
@@ -1273,13 +1277,8 @@
kreadptr(kaddr, *intrcnts, intrcntlen);
}
} else {
- for (*intrcnts = NULL, intrcntlen = 1024; ; intrcntlen *= 2) {
- *intrcnts = reallocf(*intrcnts, intrcntlen);
- if (*intrcnts == NULL)
- err(1, "reallocf()");
- if (mysysctl("hw.intrcnt", *intrcnts, &intrcntlen) == 0)
- break;
- }
+ if (mysysctl("hw.intrcnt", *intrcnts, &intrcntlen) != 0)
+ err(1, "mysysctl()");
}
return (intrcntlen / sizeof(unsigned long));
@@ -1287,31 +1286,30 @@
static void
print_intrcnts(unsigned long *intrcnts, unsigned long *old_intrcnts,
- char *intrnames, unsigned int nintr, size_t istrnamlen, long long period_ms)
+ unsigned short namesz, char *intrnames, unsigned int nintr,
+ size_t istrnamlen, long long period_ms)
{
- unsigned long *intrcnt, *old_intrcnt;
- char *intrname;
uint64_t inttotal, old_inttotal, total_count, total_rate;
unsigned long count, rate;
unsigned int i;
inttotal = 0;
old_inttotal = 0;
- intrname = intrnames;
xo_open_list("interrupt");
- for (i = 0, intrcnt=intrcnts, old_intrcnt=old_intrcnts; i < nintr; i++) {
- if (intrname[0] != '\0' && (*intrcnt != 0 || aflag)) {
- count = *intrcnt - *old_intrcnt;
+ for (i = 0; i < nintr; i++) {
+ if (*intrcnts != 0 || (aflag >= 1 && intrnames[0] != '\0') ||
+ aflag >= 2) {
+ count = *intrcnts - *old_intrcnts;
rate = ((uint64_t)count * 1000 + period_ms / 2) / period_ms;
xo_open_instance("interrupt");
xo_emit("{d:name/%-*s}{ket:name/%s} "
"{:total/%20lu} {:rate/%10lu}\n",
- (int)istrnamlen, intrname, intrname, count, rate);
+ (int)istrnamlen, intrnames, intrnames, count, rate);
xo_close_instance("interrupt");
}
- intrname += strlen(intrname) + 1;
- inttotal += *intrcnt++;
- old_inttotal += *old_intrcnt++;
+ intrnames += namesz;
+ inttotal += *intrcnts++;
+ old_inttotal += *old_intrcnts++;
}
total_count = inttotal - old_inttotal;
total_rate = (total_count * 1000 + period_ms / 2) / period_ms;
@@ -1328,6 +1326,7 @@
char *intrname, *intrnames;
long long period_ms, old_uptime, uptime;
size_t clen, inamlen, istrnamlen;
+ unsigned short namesz;
uintptr_t kaddr;
unsigned int nintr;
@@ -1346,22 +1345,24 @@
kreadptr(kaddr, intrnames, inamlen);
}
} else {
- for (intrnames = NULL, inamlen = 1024; ; inamlen *= 2) {
- if ((intrnames = reallocf(intrnames, inamlen)) == NULL)
- xo_err(1, "reallocf()");
- if (mysysctl("hw.intrnames", intrnames, &inamlen) == 0)
- break;
- }
+ if (mysysctl("hw.intrnames", NULL, &inamlen) != 0)
+ xo_err(1, "sysctl()");
+ if ((intrnames = malloc(inamlen)) == NULL)
+ xo_err(1, "malloc()");
+ if (mysysctl("hw.intrnames", intrnames, &inamlen) != 0)
+ xo_err(1, "sysctl()");
}
+ /* Identify the interrupt name length */
+ namesz = inamlen / read_intrcnts(NULL);
+
/* Determine the length of the longest interrupt name */
- intrname = intrnames;
istrnamlen = strlen("interrupt");
- while(*intrname != '\0') {
+ for(intrname = intrnames; intrname < intrnames + inamlen;
+ intrname += namesz) {
clen = strlen(intrname);
if (clen > istrnamlen)
istrnamlen = clen;
- intrname += strlen(intrname) + 1;
}
xo_emit("{T:/%-*s} {T:/%20s} {T:/%10s}\n",
(int)istrnamlen, "interrupt", "total", "rate");
@@ -1385,7 +1386,7 @@
xo_err(1, "calloc()");
}
- print_intrcnts(intrcnts, old_intrcnts, intrnames, nintr,
+ print_intrcnts(intrcnts, old_intrcnts, namesz, intrnames, nintr,
istrnamlen, period_ms);
xo_flush();

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 12, 4:41 PM (15 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38804393
Default Alt Text
D36628.id110963.diff (5 KB)

Event Timeline