Date: Wed, 28 Feb 2001 00:06:33 -0500 (EST) From: Peter Philipp <pjp@legolas.groupofnine.net> To: FreeBSD-gnats-submit@freebsd.org Cc: code-warriors@groupofnine.net Subject: kern/25445: /usr/src/usr.bin/vmstat/vmstat.c & /usr/src/sys/sys/malloc.h type differences Message-ID: <200102280506.f1S56X199280@legolas.groupofnine.net>
next in thread | raw e-mail | index | archive | help
>Number: 25445 >Category: kern >Synopsis: kernel statistics are displayed in wrong types and wrap into negative >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Feb 27 21:10:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: Peter Philipp >Release: FreeBSD 5.0-CURRENT i386 >Organization: Daemonium >Environment: System: FreeBSD legolas.groupofnine.net 5.0-CURRENT FreeBSD 5.0-CURRENT #4: Sun Feb 25 21:48:35 EST 2001 pjp@legolas.groupofnine.net:/usr/obj/usr/src/sys/LEGOLAS i386 >Description: vmstat -m reports wrong kernel statistics due to a type mismatch in printing vmstat.c's totreq in domem(). Fix includes a bit more fixing of unsigned types. >How-To-Repeat: let a busy web server run for a few days. >Fix: This really has bigger problems that are much more complex (and needs some smart advice) in regards to the type definitions of the members in struct malloc_type and also kmembuckets (sys/malloc.h). I'm of the opinion for example that ks_calls in malloc_type should be unsigned as it's a total count from 0 and should never be negative. I'm unsure of the some others as I've looked for any dependencies in the /usr/src tree but it seems to be only vmstat for ks_inuse, ks_calls and ks_maxused. I've changed those to unsigned and also declared the type of integer they are. This could perhaps make the people with the alpha port happy. Much of those structs remain to be just 'long' and should perhaps be changed to their respective posix integer type. /usr/src/sys/sys/malloc.h patch --- malloc.h.orig Tue Feb 27 22:49:28 2001 +++ malloc.h Tue Feb 27 23:32:55 2001 @@ -55,9 +55,9 @@ long ks_memuse; /* total memory held in bytes */ long ks_limit; /* most that are allowed to exist */ long ks_size; /* sizes of this thing that are allocated */ - long ks_inuse; /* # of packets of this type currently in use */ - int64_t ks_calls; /* total packets of this type ever allocated */ - long ks_maxused; /* maximum number ever used */ + u_int32_t ks_inuse; /* # of packets of this type currently in use */ + u_int64_t ks_calls; /* total packets of this type ever allocated */ + u_int32_t ks_maxused; /* maximum number ever used */ u_long ks_magic; /* if it's not magic, don't touch it */ const char *ks_shortdesc; /* short description */ u_short ks_limblocks; /* number of times blocked for hitting limit */ @@ -102,7 +102,7 @@ struct kmembuckets { caddr_t kb_next; /* list of free blocks */ caddr_t kb_last; /* last free block */ - int64_t kb_calls; /* total calls to allocate this size */ + u_int64_t kb_calls; /* total calls to allocate this size */ long kb_total; /* total number of blocks allocated */ long kb_elmpercl; /* # of elements in this sized allocation */ long kb_totalfree; /* # of free elements in this bucket */ ==== /usr/src/usr.bin/vmstat/vmstat.c patch --- vmstat.c.orig Tue Feb 27 23:33:53 2001 +++ vmstat.c Tue Feb 27 23:44:41 2001 @@ -761,7 +761,8 @@ register struct malloc_type *ks; register int i, j; int len, size, first, nkms; - long totuse = 0, totfree = 0, totreq = 0; + long totuse = 0, totfree = 0; + u_int64_t totreq = 0; const char *name; struct malloc_type kmemstats[MAX_KMSTATS], *kmsp; char *kmemnames[MAX_KMSTATS]; @@ -841,7 +842,7 @@ for (i = 0, ks = &kmemstats[0]; i < nkms; i++, ks++) { if (ks->ks_calls == 0) continue; - (void)printf("%13s%6ld%6ldK%7ldK%6ldK%9ld%5u%6u", + (void)printf("%13s%6lu%6ldK%7luK%6ldK%9qu%5u%6u", ks->ks_shortdesc, ks->ks_inuse, (ks->ks_memuse + 1023) / 1024, (ks->ks_maxused + 1023) / 1024, @@ -866,7 +867,7 @@ totreq += ks->ks_calls; } (void)printf("\nMemory Totals: In Use Free Requests\n"); - (void)printf(" %7ldK %6ldK %8ld\n", + (void)printf(" %7ldK %6ldK %8qu\n", (totuse + 1023) / 1024, (totfree + 1023) / 1024, totreq); } >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102280506.f1S56X199280>