Author: markj
Date: Wed Aug 12 16:08:44 2020
New Revision: 364168
URL: https://svnweb.freebsd.org/changeset/base/364168

Log:
  linprocfs: Fix some inaccuracies in meminfo.
  
  - Fill out MemFree correctly.  Delete an ancient comment suggesting that
    we don't want to advertise the true quantity of free memory.
  - Populate the Buffers field by reading vfs.bufspace.
  - The page cache consists of all pages in page queues, not just the
    inactive queue.
  
  PR:           248463
  Reported and tested by:       danfe
  MFC after:    1 week
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/compat/linprocfs/linprocfs.c

Modified: head/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- head/sys/compat/linprocfs/linprocfs.c       Wed Aug 12 15:49:10 2020        
(r364167)
+++ head/sys/compat/linprocfs/linprocfs.c       Wed Aug 12 16:08:44 2020        
(r364168)
@@ -145,41 +145,35 @@ static int
 linprocfs_domeminfo(PFS_FILL_ARGS)
 {
        unsigned long memtotal;         /* total memory in bytes */
-       unsigned long memused;          /* used memory in bytes */
        unsigned long memfree;          /* free memory in bytes */
-       unsigned long buffers, cached;  /* buffer / cache memory ??? */
+       unsigned long cached;           /* page cache */
+       unsigned long buffers;          /* buffer cache */
        unsigned long long swaptotal;   /* total swap space in bytes */
        unsigned long long swapused;    /* used swap space in bytes */
        unsigned long long swapfree;    /* free swap space in bytes */
-       int i, j;
+       size_t sz;
+       int error, i, j;
 
        memtotal = physmem * PAGE_SIZE;
-       /*
-        * The correct thing here would be:
-        *
-       memfree = vm_free_count() * PAGE_SIZE;
-       memused = memtotal - memfree;
-        *
-        * but it might mislead linux binaries into thinking there
-        * is very little memory left, so we cheat and tell them that
-        * all memory that isn't wired down is free.
-        */
-       memused = vm_wire_count() * PAGE_SIZE;
-       memfree = memtotal - memused;
+       memfree = (unsigned long)vm_free_count() * PAGE_SIZE;
        swap_pager_status(&i, &j);
        swaptotal = (unsigned long long)i * PAGE_SIZE;
        swapused = (unsigned long long)j * PAGE_SIZE;
        swapfree = swaptotal - swapused;
+
        /*
-        * We'd love to be able to write:
-        *
-       buffers = bufspace;
-        *
-        * but bufspace is internal to vfs_bio.c and we don't feel
-        * like unstaticizing it just for linprocfs's sake.
+        * This value may exclude wired pages, but we have no good way of
+        * accounting for that.
         */
-       buffers = 0;
-       cached = vm_inactive_count() * PAGE_SIZE;
+       cached =
+           (vm_active_count() + vm_inactive_count() + vm_laundry_count()) *
+           PAGE_SIZE;
+
+       sz = sizeof(buffers);
+       error = kernel_sysctlbyname(curthread, "vfs.bufspace", &buffers, &sz,
+           NULL, 0, 0, 0);
+       if (error != 0)
+               buffers = 0;
 
        sbuf_printf(sb,
            "MemTotal: %9lu kB\n"
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to