From bb52f35f49b5851f96ce116101182b80dac05104 Mon Sep 17 00:00:00 2001 From: imp Date: Mon, 10 May 1999 00:33:32 +0000 Subject: Sometime since this file was written, the list of kernel malloc types changed from a simple list to a circular one. We compensate by only looping until we see the first address again. Before, things would terminate because it was limited to 200 iterations. This lead to bogus statistics and repeating stats for memory types. This should be merged into 3.2, as the same bug is there. --- usr.bin/vmstat/vmstat.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'usr.bin/vmstat') diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c index d5cec16..4a76397 100644 --- a/usr.bin/vmstat/vmstat.c +++ b/usr.bin/vmstat/vmstat.c @@ -42,7 +42,7 @@ static const char copyright[] = static char sccsid[] = "@(#)vmstat.c 8.1 (Berkeley) 6/6/93"; #endif static const char rcsid[] = - "$Id: vmstat.c,v 1.32 1999/02/13 09:59:24 dillon Exp $"; + "$Id: vmstat.c,v 1.33 1999/02/15 14:15:28 bde Exp $"; #endif /* not lint */ #include @@ -503,6 +503,9 @@ dovmstat(interval, reps) } (void)printf("%2d%2d%2d", total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw); +#ifdef pgtok +#undef pgtok +#endif #define pgtok(a) ((a) * sum.v_page_size >> 10) #define rate(x) (((x) + halfuptime) / uptime) /* round */ (void)printf("%8ld%6ld ", @@ -792,6 +795,8 @@ dointr() (void)printf("Total %8ld %8ld\n", inttotal, inttotal / uptime); } +#define MAX_KMSTATS 200 + void domem() { @@ -801,14 +806,15 @@ domem() int len, size, first, nkms; long totuse = 0, totfree = 0, totreq = 0; const char *name; - struct malloc_type kmemstats[200], *kmsp; - char *kmemnames[200]; + struct malloc_type kmemstats[MAX_KMSTATS], *kmsp, *first_kmsp; + char *kmemnames[MAX_KMSTATS]; char buf[1024]; struct kmembuckets buckets[MINBUCKET + 16]; kread(X_KMEMBUCKETS, buckets, sizeof(buckets)); kread(X_KMEMSTATISTICS, &kmsp, sizeof(kmsp)); - for (nkms = 0; nkms < 200 && kmsp != NULL; nkms++) { + first_kmsp = kmsp; + for (nkms = 0; nkms < MAX_KMSTATS && kmsp != NULL; nkms++) { if (sizeof(kmemstats[0]) != kvm_read(kd, (u_long)kmsp, &kmemstats[nkms], sizeof(kmemstats[0]))) err(1, "kvm_read(%p)", (void *)kmsp); @@ -816,9 +822,14 @@ domem() (u_long)kmemstats[nkms].ks_shortdesc, buf, sizeof(buf))) err(1, "kvm_read(%p)", (void *)kmemstats[nkms].ks_shortdesc); + buf[sizeof(buf) - 1] = '\0'; kmemstats[nkms].ks_shortdesc = strdup(buf); kmsp = kmemstats[nkms].ks_next; + if (kmsp == first_kmsp) + break; } + if (kmsp != NULL && nkms >= MAX_KMSTATS) + warnx("Truncated to the first %d types.", MAX_KMSTATS); (void)printf("Memory statistics by bucket size\n"); (void)printf( "Size In Use Free Requests HighWater Couldfree\n"); -- cgit v1.1