Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/vmstat Counter tweaks:



details:   https://anonhg.NetBSD.org/src/rev/c0b06d4c1cbe
branches:  trunk
changeset: 972859:c0b06d4c1cbe
user:      ad <ad%NetBSD.org@localhost>
date:      Thu Jun 11 22:21:05 2020 +0000

description:
Counter tweaks:

- Don't need to count anonpages+filepages any more; clean+unknown+dirty for
  each kind of page can be summed to get the totals.

- Track the number of free pages with a counter so that it's one less thing
  for the allocator to do, which opens up further options there.

- Remove cpu_count_sync_one().  It has no users and doesn't save a whole lot.
  For the cheap option, give cpu_count_sync() a boolean parameter indicating
  that a cached value is okay, and rate limit the updates for cached values
  to hz.

diffstat:

 sys/compat/linux/common/linux_misc.c        |  12 ++-
 sys/compat/linux32/common/linux32_sysinfo.c |  12 ++-
 sys/kern/subr_cpu.c                         |  99 ++++++++++++----------------
 sys/kern/vfs_vnode.c                        |   6 +-
 sys/kern/vfs_vnops.c                        |   6 +-
 sys/miscfs/procfs/procfs_linux.c            |  17 +++-
 sys/sys/cpu_data.h                          |  30 ++++----
 sys/uvm/uvm_loan.c                          |   8 +-
 sys/uvm/uvm_meter.c                         |  28 ++++---
 sys/uvm/uvm_page.c                          |  63 ++++++++----------
 sys/uvm/uvm_pdaemon.c                       |  12 ++-
 sys/uvm/uvm_pdpolicy_clock.c                |  15 ++-
 sys/uvm/uvm_stat.c                          |  26 +++++--
 usr.bin/vmstat/vmstat.c                     |   7 +-
 14 files changed, 174 insertions(+), 167 deletions(-)

diffs (truncated from 831 to 300 lines):

diff -r de405e63023e -r c0b06d4c1cbe sys/compat/linux/common/linux_misc.c
--- a/sys/compat/linux/common/linux_misc.c      Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/compat/linux/common/linux_misc.c      Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_misc.c,v 1.250 2020/06/11 19:20:46 ad Exp $      */
+/*     $NetBSD: linux_misc.c,v 1.251 2020/06/11 22:21:05 ad Exp $      */
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.250 2020/06/11 19:20:46 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.251 2020/06/11 22:21:05 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1347,6 +1347,7 @@
        } */
        struct linux_sysinfo si;
        struct loadavg *la;
+       int64_t filepg;
 
        memset(&si, 0, sizeof(si));
        si.uptime = time_uptime;
@@ -1355,9 +1356,14 @@
        si.loads[1] = la->ldavg[1] * LINUX_SYSINFO_LOADS_SCALE / la->fscale;
        si.loads[2] = la->ldavg[2] * LINUX_SYSINFO_LOADS_SCALE / la->fscale;
        si.totalram = ctob((u_long)physmem);
+       /* uvm_availmem() may sync the counters. */
        si.freeram = (u_long)uvm_availmem(true) * uvmexp.pagesize;
+       filepg = cpu_count_get(CPU_COUNT_FILECLEAN) +
+           cpu_count_get(CPU_COUNT_FILEDIRTY) +
+           cpu_count_get(CPU_COUNT_FILEUNKNOWN) -
+           cpu_count_get(CPU_COUNT_EXECPAGES);
        si.sharedram = 0;       /* XXX */
-       si.bufferram = (u_long)uvmexp.filepages * uvmexp.pagesize;
+       si.bufferram = (u_long)(filepg * uvmexp.pagesize);
        si.totalswap = (u_long)uvmexp.swpages * uvmexp.pagesize;
        si.freeswap = 
            (u_long)(uvmexp.swpages - uvmexp.swpginuse) * uvmexp.pagesize;
diff -r de405e63023e -r c0b06d4c1cbe sys/compat/linux32/common/linux32_sysinfo.c
--- a/sys/compat/linux32/common/linux32_sysinfo.c       Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/compat/linux32/common/linux32_sysinfo.c       Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux32_sysinfo.c,v 1.12 2020/06/11 19:20:46 ad Exp $ */
+/*     $NetBSD: linux32_sysinfo.c,v 1.13 2020/06/11 22:21:05 ad Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.12 2020/06/11 19:20:46 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.13 2020/06/11 22:21:05 ad Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -69,6 +69,7 @@
        } */
        struct linux32_sysinfo si;
        struct loadavg *la;
+       int64_t filepg;
 
        memset(&si, 0, sizeof(si));
        si.uptime = time_uptime;
@@ -77,9 +78,14 @@
        si.loads[1] = la->ldavg[1] * LINUX_SYSINFO_LOADS_SCALE / la->fscale;
        si.loads[2] = la->ldavg[2] * LINUX_SYSINFO_LOADS_SCALE / la->fscale;
        si.totalram = ctob((u_long)physmem);
+       /* uvm_availmem() may sync the counters. */
        si.freeram = (u_long)uvm_availmem(true) * uvmexp.pagesize;
+       filepg = cpu_count_get(CPU_COUNT_FILECLEAN) +
+           cpu_count_get(CPU_COUNT_FILEDIRTY) +
+           cpu_count_get(CPU_COUNT_FILEUNKNOWN) -
+           cpu_count_get(CPU_COUNT_EXECPAGES);
        si.sharedram = 0;       /* XXX */
-       si.bufferram = (u_long)uvmexp.filepages * uvmexp.pagesize;
+       si.bufferram = (u_long)(filepg * uvmexp.pagesize);
        si.totalswap = (u_long)uvmexp.swpages * uvmexp.pagesize;
        si.freeswap = 
            (u_long)(uvmexp.swpages - uvmexp.swpginuse) * uvmexp.pagesize;
diff -r de405e63023e -r c0b06d4c1cbe sys/kern/subr_cpu.c
--- a/sys/kern/subr_cpu.c       Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/kern/subr_cpu.c       Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: subr_cpu.c,v 1.14 2020/03/26 19:23:18 ad Exp $ */
+/*     $NetBSD: subr_cpu.c,v 1.15 2020/06/11 22:21:05 ad Exp $ */
 
 /*-
  * Copyright (c) 2007, 2008, 2009, 2010, 2012, 2019, 2020
@@ -61,9 +61,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_cpu.c,v 1.14 2020/03/26 19:23:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_cpu.c,v 1.15 2020/06/11 22:21:05 ad Exp $");
 
 #include <sys/param.h>
+#include <sys/atomic.h>
 #include <sys/systm.h>
 #include <sys/sched.h>
 #include <sys/conf.h>
@@ -445,70 +446,56 @@
 
 /*
  * Fetch fresh sum total for all counts.  Expensive - don't call often.
+ *
+ * If poll is true, the the caller is okay with with less recent values (but
+ * no more than 1/hz seconds old).  Where this is called very often that
+ * should be the case.
+ *
+ * This should be reasonably quick so that any value collected get isn't
+ * totally out of whack, and it can also be called from interrupt context,
+ * so go to splvm() while summing the counters.  It's tempting to use a spin
+ * mutex here but this routine is called from DDB.
  */
 void
-cpu_count_sync_all(void)
+cpu_count_sync(bool poll)
 {
        CPU_INFO_ITERATOR cii;
        struct cpu_info *ci;
        int64_t sum[CPU_COUNT_MAX], *ptr;
+       static int lasttick;
+       int curtick, s;
        enum cpu_count i;
-       int s;
 
        KASSERT(sizeof(ci->ci_counts) == sizeof(cpu_counts));
 
-       if (__predict_true(mp_online)) {
-               memset(sum, 0, sizeof(sum));
-               /*
-                * We want this to be reasonably quick, so any value we get
-                * isn't totally out of whack, so don't let the current LWP
-                * get preempted.
-                */
-               s = splvm();
-               curcpu()->ci_counts[CPU_COUNT_SYNC_ALL]++;
-               for (CPU_INFO_FOREACH(cii, ci)) {
-                       ptr = ci->ci_counts;
-                       for (i = 0; i < CPU_COUNT_MAX; i += 8) {
-                               sum[i+0] += ptr[i+0];
-                               sum[i+1] += ptr[i+1];
-                               sum[i+2] += ptr[i+2];
-                               sum[i+3] += ptr[i+3];
-                               sum[i+4] += ptr[i+4];
-                               sum[i+5] += ptr[i+5];
-                               sum[i+6] += ptr[i+6];
-                               sum[i+7] += ptr[i+7];
-                       }
-                       KASSERT(i == CPU_COUNT_MAX);
-               }
-               memcpy(cpu_counts, sum, sizeof(cpu_counts));
+       if (__predict_false(!mp_online)) {
+               memcpy(cpu_counts, curcpu()->ci_counts, sizeof(cpu_counts));
+               return;
+       }
+
+       s = splvm();
+       curtick = getticks();
+       if (poll && atomic_load_acquire(&lasttick) == curtick) {
                splx(s);
-       } else {
-               memcpy(cpu_counts, curcpu()->ci_counts, sizeof(cpu_counts));
+               return;
        }
+       memset(sum, 0, sizeof(sum));
+       curcpu()->ci_counts[CPU_COUNT_SYNC]++;
+       for (CPU_INFO_FOREACH(cii, ci)) {
+               ptr = ci->ci_counts;
+               for (i = 0; i < CPU_COUNT_MAX; i += 8) {
+                       sum[i+0] += ptr[i+0];
+                       sum[i+1] += ptr[i+1];
+                       sum[i+2] += ptr[i+2];
+                       sum[i+3] += ptr[i+3];
+                       sum[i+4] += ptr[i+4];
+                       sum[i+5] += ptr[i+5];
+                       sum[i+6] += ptr[i+6];
+                       sum[i+7] += ptr[i+7];
+               }
+               KASSERT(i == CPU_COUNT_MAX);
+       }
+       memcpy(cpu_counts, sum, sizeof(cpu_counts));
+       atomic_store_release(&lasttick, curtick);
+       splx(s);
 }
-
-/*
- * Fetch a fresh sum total for one single count.  Expensive - don't call often.
- */
-int64_t
-cpu_count_sync(enum cpu_count count)
-{
-       CPU_INFO_ITERATOR cii;
-       struct cpu_info *ci;
-       int64_t sum;
-       int s;
-
-       if (__predict_true(mp_online)) {
-               s = splvm();
-               curcpu()->ci_counts[CPU_COUNT_SYNC_ONE]++;
-               sum = 0;
-               for (CPU_INFO_FOREACH(cii, ci)) {
-                       sum += ci->ci_counts[count];
-               }
-               splx(s);
-       } else {
-               /* XXX Early boot, iterator might not be available. */
-               sum = curcpu()->ci_counts[count];
-       }
-       return cpu_counts[count] = sum;
-}
diff -r de405e63023e -r c0b06d4c1cbe sys/kern/vfs_vnode.c
--- a/sys/kern/vfs_vnode.c      Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/kern/vfs_vnode.c      Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_vnode.c,v 1.123 2020/05/26 18:38:37 ad Exp $       */
+/*     $NetBSD: vfs_vnode.c,v 1.124 2020/06/11 22:21:05 ad Exp $       */
 
 /*-
  * Copyright (c) 1997-2011, 2019, 2020 The NetBSD Foundation, Inc.
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.123 2020/05/26 18:38:37 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.124 2020/06/11 22:21:05 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pax.h"
@@ -900,7 +900,6 @@
                if ((vp->v_iflag & VI_EXECMAP) != 0 &&
                    vp->v_uobj.uo_npages != 0) {
                        cpu_count(CPU_COUNT_EXECPAGES, -vp->v_uobj.uo_npages);
-                       cpu_count(CPU_COUNT_FILEPAGES, vp->v_uobj.uo_npages);
                }
                vp->v_iflag &= ~(VI_TEXT|VI_EXECMAP|VI_WRMAP);
                vp->v_vflag &= ~VV_MAPPED;
@@ -1710,7 +1709,6 @@
        mutex_enter(vp->v_interlock);
        if ((vp->v_iflag & VI_EXECMAP) != 0 && vp->v_uobj.uo_npages != 0) {
                cpu_count(CPU_COUNT_EXECPAGES, -vp->v_uobj.uo_npages);
-               cpu_count(CPU_COUNT_FILEPAGES, vp->v_uobj.uo_npages);
        }
        vp->v_iflag &= ~(VI_TEXT|VI_EXECMAP);
        vp->v_iflag |= VI_DEADCHECK; /* for genfs_getpages() */
diff -r de405e63023e -r c0b06d4c1cbe sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c      Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/kern/vfs_vnops.c      Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_vnops.c,v 1.212 2020/05/23 23:42:43 ad Exp $       */
+/*     $NetBSD: vfs_vnops.c,v 1.213 2020/06/11 22:21:05 ad Exp $       */
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.212 2020/05/23 23:42:43 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.213 2020/06/11 22:21:05 ad Exp $");
 
 #include "veriexec.h"
 
@@ -342,7 +342,6 @@
        rw_enter(vp->v_uobj.vmobjlock, RW_WRITER);
        mutex_enter(vp->v_interlock);
        if ((vp->v_iflag & VI_EXECMAP) == 0) {
-               cpu_count(CPU_COUNT_FILEPAGES, -vp->v_uobj.uo_npages);
                cpu_count(CPU_COUNT_EXECPAGES, vp->v_uobj.uo_npages);
                vp->v_iflag |= VI_EXECMAP;
        }
@@ -372,7 +371,6 @@
                return (ETXTBSY);
        }
        if ((vp->v_iflag & VI_EXECMAP) == 0) {
-               cpu_count(CPU_COUNT_FILEPAGES, -vp->v_uobj.uo_npages);
                cpu_count(CPU_COUNT_EXECPAGES, vp->v_uobj.uo_npages);
        }
        vp->v_iflag |= (VI_TEXT | VI_EXECMAP);
diff -r de405e63023e -r c0b06d4c1cbe sys/miscfs/procfs/procfs_linux.c
--- a/sys/miscfs/procfs/procfs_linux.c  Thu Jun 11 19:20:42 2020 +0000
+++ b/sys/miscfs/procfs/procfs_linux.c  Thu Jun 11 22:21:05 2020 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: procfs_linux.c,v 1.85 2020/06/11 19:20:46 ad Exp $      */
+/*      $NetBSD: procfs_linux.c,v 1.86 2020/06/11 22:21:05 ad Exp $      */
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.85 2020/06/11 19:20:46 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.86 2020/06/11 22:21:05 ad Exp $");
 



Home | Main Index | Thread Index | Old Index