On Sat, Jul 09, 2011 at 12:56:12AM -0400, Ted Unangst wrote:
> Top said I didn't have much memory free. Where did it all go?
>
> Oh, here it is:
>
> Memory: Real: 391M/2730M act/tot Free: 178M Cache: 1711M Swap: 0K/4097M
I like the idea, but I think "Cache" is ot the ricght name. How about
BCache or Bufs?
-Otto
>
> Index: machine.c
> ===================================================================
> RCS file: /home/tedu/cvs/src/usr.bin/top/machine.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 machine.c
> --- machine.c 10 Apr 2011 03:20:59 -0000 1.68
> +++ machine.c 9 Jul 2011 04:53:31 -0000
> @@ -41,6 +41,7 @@
> #include <unistd.h>
> #include <sys/sysctl.h>
> #include <sys/dkstat.h>
> +#include <sys/mount.h>
> #include <sys/swap.h>
> #include <err.h>
> #include <errno.h>
> @@ -107,10 +108,11 @@ char *cpustatenames[] = {
> };
>
> /* these are for detailing the memory statistics */
> -int memory_stats[8];
> +int memory_stats[10];
> char *memorynames[] = {
> - "Real: ", "K/", "K act/tot ", "Free: ", "K ",
> - "Swap: ", "K/", "K used/tot",
> + "Real: ", "K/", "K act/tot ", "Free: ", "K ",
> + "Cache: ", "K ",
> + "Swap: ", "K/", "K",
> NULL
> };
>
> @@ -206,8 +208,10 @@ get_system_info(struct system_info *si)
> {
> static int sysload_mib[] = {CTL_VM, VM_LOADAVG};
> static int vmtotal_mib[] = {CTL_VM, VM_METER};
> + static int bcstats_mib[] = {CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT};
> struct loadavg sysload;
> struct vmtotal vmtotal;
> + struct bcachestats bcstats;
> double *infoloadp;
> size_t size;
> int i;
> @@ -254,6 +258,11 @@ get_system_info(struct system_info *si)
> warn("sysctl failed");
> bzero(&vmtotal, sizeof(vmtotal));
> }
> + size = sizeof(bcstats);
> + if (sysctl(bcstats_mib, 3, &bcstats, &size, NULL, 0) < 0) {
> + warn("sysctl failed");
> + bzero(&bcstats, sizeof(bcstats));
> + }
> /* convert memory stats to Kbytes */
> memory_stats[0] = -1;
> memory_stats[1] = pagetok(vmtotal.t_arm);
> @@ -261,10 +270,12 @@ get_system_info(struct system_info *si)
> memory_stats[3] = -1;
> memory_stats[4] = pagetok(vmtotal.t_free);
> memory_stats[5] = -1;
> + memory_stats[6] = pagetok(bcstats.numbufpages);
> + memory_stats[7] = -1;
>
> - if (!swapmode(&memory_stats[6], &memory_stats[7])) {
> - memory_stats[6] = 0;
> - memory_stats[7] = 0;
> + if (!swapmode(&memory_stats[8], &memory_stats[9])) {
> + memory_stats[8] = 0;
> + memory_stats[9] = 0;
> }
>
> /* set arrays and strings */