Module Name: src
Committed By: mrg
Date: Sat Dec 2 08:15:43 UTC 2017
Modified Files:
src/sys/kern: subr_pool.c
src/sys/sys: pool.h
src/sys/uvm: uvm_extern.h uvm_meter.c uvm_page.c uvm_stat.c
src/usr.bin/vmstat: vmstat.c
Log Message:
add two new members to uvmexp_sysctl{}: bootpages and poolpages.
bootpages is set to the pages allocated via uvm_pageboot_alloc().
poolpages is calculated from the list of pools nr_pages members.
this brings us closer to having a valid total of pages known by
the system, vs actual pages originally managed.
XXX: poolpages needs some handling for PR_RECURSIVE pools still.
To generate a diff of this commit:
cvs rdiff -u -r1.216 -r1.217 src/sys/kern/subr_pool.c
cvs rdiff -u -r1.80 -r1.81 src/sys/sys/pool.h
cvs rdiff -u -r1.206 -r1.207 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.66 -r1.67 src/sys/uvm/uvm_meter.c
cvs rdiff -u -r1.194 -r1.195 src/sys/uvm/uvm_page.c
cvs rdiff -u -r1.38 -r1.39 src/sys/uvm/uvm_stat.c
cvs rdiff -u -r1.220 -r1.221 src/usr.bin/vmstat/vmstat.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_pool.c
diff -u src/sys/kern/subr_pool.c:1.216 src/sys/kern/subr_pool.c:1.217
--- src/sys/kern/subr_pool.c:1.216 Tue Nov 14 15:02:06 2017
+++ src/sys/kern/subr_pool.c Sat Dec 2 08:15:42 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_pool.c,v 1.216 2017/11/14 15:02:06 christos Exp $ */
+/* $NetBSD: subr_pool.c,v 1.217 2017/12/02 08:15:42 mrg Exp $ */
/*-
* Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.216 2017/11/14 15:02:06 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.217 2017/12/02 08:15:42 mrg Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -1453,6 +1453,27 @@ pool_drain(struct pool **ppp)
}
/*
+ * Calculate the total number of pages consumed by pools.
+ */
+int
+pool_totalpages(void)
+{
+ struct pool *pp;
+ int total = 0;
+
+ mutex_enter(&pool_head_lock);
+ TAILQ_FOREACH(pp, &pool_head, pr_poollist)
+ /*
+ * XXXMRG
+ if ((pp->pr_roflags & PR_RECURSIVE) == 0)
+ */
+ total += pp->pr_npages;
+ mutex_exit(&pool_head_lock);
+
+ return total;
+}
+
+/*
* Diagnostic helpers.
*/
Index: src/sys/sys/pool.h
diff -u src/sys/sys/pool.h:1.80 src/sys/sys/pool.h:1.81
--- src/sys/sys/pool.h:1.80 Sat Oct 28 19:19:10 2017
+++ src/sys/sys/pool.h Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pool.h,v 1.80 2017/10/28 19:19:10 riastradh Exp $ */
+/* $NetBSD: pool.h,v 1.81 2017/12/02 08:15:43 mrg Exp $ */
/*-
* Copyright (c) 1997, 1998, 1999, 2000, 2007 The NetBSD Foundation, Inc.
@@ -307,6 +307,7 @@ void pool_setlowat(struct pool *, int);
void pool_sethiwat(struct pool *, int);
void pool_sethardlimit(struct pool *, int, const char *, int);
bool pool_drain(struct pool **);
+int pool_totalpages(void);
/*
* Debugging and diagnostic aides.
Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.206 src/sys/uvm/uvm_extern.h:1.207
--- src/sys/uvm/uvm_extern.h:1.206 Sat May 20 07:27:15 2017
+++ src/sys/uvm/uvm_extern.h Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_extern.h,v 1.206 2017/05/20 07:27:15 chs Exp $ */
+/* $NetBSD: uvm_extern.h,v 1.207 2017/12/02 08:15:43 mrg Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -408,6 +408,8 @@ struct uvmexp {
int pdreanon; /* anon pages reactivated due to thresholds */
int pdrefile; /* file pages reactivated due to thresholds */
int pdreexec; /* executable pages reactivated due to thresholds */
+
+ int bootpages; /* number of pages stolen at boot */
};
/*
@@ -493,6 +495,8 @@ struct uvmexp_sysctl {
int64_t colorhit;
int64_t colormiss;
int64_t ncolors;
+ int64_t bootpages;
+ int64_t poolpages;
};
#ifdef _KERNEL
Index: src/sys/uvm/uvm_meter.c
diff -u src/sys/uvm/uvm_meter.c:1.66 src/sys/uvm/uvm_meter.c:1.67
--- src/sys/uvm/uvm_meter.c:1.66 Sun Jul 2 16:41:33 2017
+++ src/sys/uvm/uvm_meter.c Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_meter.c,v 1.66 2017/07/02 16:41:33 joerg Exp $ */
+/* $NetBSD: uvm_meter.c,v 1.67 2017/12/02 08:15:43 mrg Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_meter.c,v 1.66 2017/07/02 16:41:33 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_meter.c,v 1.67 2017/12/02 08:15:43 mrg Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -177,6 +177,8 @@ sysctl_vm_uvmexp2(SYSCTLFN_ARGS)
u.colorhit = uvmexp.colorhit;
u.colormiss = uvmexp.colormiss;
u.ncolors = uvmexp.ncolors;
+ u.bootpages = uvmexp.bootpages;
+ u.poolpages = pool_totalpages();
node = *rnode;
node.sysctl_data = &u;
Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.194 src/sys/uvm/uvm_page.c:1.195
--- src/sys/uvm/uvm_page.c:1.194 Sat Oct 28 00:37:13 2017
+++ src/sys/uvm/uvm_page.c Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page.c,v 1.194 2017/10/28 00:37:13 pgoyette Exp $ */
+/* $NetBSD: uvm_page.c,v 1.195 2017/12/02 08:15:43 mrg Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.194 2017/10/28 00:37:13 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.195 2017/12/02 08:15:43 mrg Exp $");
#include "opt_ddb.h"
#include "opt_uvm.h"
@@ -538,6 +538,7 @@ uvm_pageboot_alloc(vsize_t size)
/* round to page size */
size = round_page(size);
+ uvmexp.bootpages += atop(size);
#if defined(PMAP_STEAL_MEMORY)
Index: src/sys/uvm/uvm_stat.c
diff -u src/sys/uvm/uvm_stat.c:1.38 src/sys/uvm/uvm_stat.c:1.39
--- src/sys/uvm/uvm_stat.c:1.38 Thu Dec 1 01:59:17 2016
+++ src/sys/uvm/uvm_stat.c Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $ */
+/* $NetBSD: uvm_stat.c,v 1.39 2017/12/02 08:15:43 mrg Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.39 2017/12/02 08:15:43 mrg Exp $");
#include "opt_readahead.h"
#include "opt_ddb.h"
@@ -46,6 +46,8 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v
#ifdef DDB
+#include <sys/pool.h>
+
/*
* uvmexp_print: ddb hook to print interesting uvm counters
*/
@@ -54,10 +56,12 @@ uvmexp_print(void (*pr)(const char *, ..
__attribute__((__format__(__printf__,1,2))))
{
int active, inactive;
+ int poolpages;
CPU_INFO_ITERATOR cii;
struct cpu_info *ci;
uvm_estimatepageable(&active, &inactive);
+ poolpages = pool_totalpages();
(*pr)("Current UVM status:\n");
(*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n",
@@ -72,6 +76,8 @@ uvmexp_print(void (*pr)(const char *, ..
uvmexp.freemin, uvmexp.freetarg, uvmexp.wiredmax);
(*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%d\n",
uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, uvmexp.zeropages);
+ (*pr)(" bootpages=%d, poolpages=%d\n",
+ uvmexp.bootpages, poolpages);
for (CPU_INFO_FOREACH(cii, ci)) {
(*pr)(" cpu%u:\n", cpu_index(ci));
Index: src/usr.bin/vmstat/vmstat.c
diff -u src/usr.bin/vmstat/vmstat.c:1.220 src/usr.bin/vmstat/vmstat.c:1.221
--- src/usr.bin/vmstat/vmstat.c:1.220 Fri Nov 3 22:45:14 2017
+++ src/usr.bin/vmstat/vmstat.c Sat Dec 2 08:15:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vmstat.c,v 1.220 2017/11/03 22:45:14 pgoyette Exp $ */
+/* $NetBSD: vmstat.c,v 1.221 2017/12/02 08:15:43 mrg Exp $ */
/*-
* Copyright (c) 1998, 2000, 2001, 2007 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
#if 0
static char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 3/1/95";
#else
-__RCSID("$NetBSD: vmstat.c,v 1.220 2017/11/03 22:45:14 pgoyette Exp $");
+__RCSID("$NetBSD: vmstat.c,v 1.221 2017/12/02 08:15:43 mrg Exp $");
#endif
#endif /* not lint */
@@ -892,6 +892,10 @@ dosum(void)
warn("sysctl vm.uvmexp2 failed");
} else {
struct uvmexp uvmexp_kernel;
+ struct pool pool, *pp = &pool;
+ TAILQ_HEAD(,pool) pool_head;
+ void *addr;
+
kread(namelist, X_UVMEXP, &uvmexp_kernel, sizeof(uvmexp_kernel));
#define COPY(field) uvmexp.field = uvmexp_kernel.field
COPY(pagesize);
@@ -955,7 +959,18 @@ dosum(void)
COPY(pdbusy);
COPY(pdpending);
COPY(pddeact);
+ COPY(bootpages);
#undef COPY
+ kread(namelist, X_POOLHEAD, &pool_head, sizeof(pool_head));
+ addr = TAILQ_FIRST(&pool_head);
+ for (; addr != NULL; addr = TAILQ_NEXT(pp, pr_poollist)) {
+ deref_kptr(addr, pp, sizeof(*pp), "pool chain trashed");
+ /*
+ * XXXMRG
+ if ((pp->pr_roflags & PR_RECURSIVE) == 0)
+ */
+ uvmexp.poolpages += pp->pr_npages;
+ }
}
@@ -976,6 +991,8 @@ dosum(void)
(void)printf("%9" PRIu64 " reserve pagedaemon pages\n",
uvmexp.reserve_pagedaemon);
(void)printf("%9" PRIu64 " reserve kernel pages\n", uvmexp.reserve_kernel);
+ (void)printf("%9" PRIu64 " boot kernel pages\n", uvmexp.bootpages);
+ (void)printf("%9" PRIu64 " kernel pool pages\n", uvmexp.poolpages);
(void)printf("%9" PRIu64 " anonymous pages\n", uvmexp.anonpages);
(void)printf("%9" PRIu64 " cached file pages\n", uvmexp.filepages);
(void)printf("%9" PRIu64 " cached executable pages\n", uvmexp.execpages);
@@ -2251,9 +2268,9 @@ hist_traverse_sysctl(int todo, const cha
/*
* Actually dump the history buffer at the specified KVA.
*/
- void
+void
hist_dodump_sysctl(int mib[], unsigned int miblen)
- {
+{
struct sysctl_history *hist;
struct timeval tv;
struct sysctl_history_event *e;