aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2018-08-23 21:03:45 +0000
committerMark Johnston <markj@FreeBSD.org>2018-08-23 21:03:45 +0000
commit899fe184c718ba810aaacc7fc3852149f409388f (patch)
treeab523cb3ec9a0603f3aef72942405b9e793f55f6
parent0568fefeea3645098d84cef3cfcb86c73ac04ff6 (diff)
Notes
-rw-r--r--sys/vm/vm_meter.c45
-rw-r--r--sys/vm/vm_page.c1
-rw-r--r--sys/vm/vm_pageout.c2
-rw-r--r--sys/vm/vm_pagequeue.h1
4 files changed, 42 insertions, 7 deletions
diff --git a/sys/vm/vm_meter.c b/sys/vm/vm_meter.c
index ea3ec747e714b..dfd500814d251 100644
--- a/sys/vm/vm_meter.c
+++ b/sys/vm/vm_meter.c
@@ -364,7 +364,6 @@ VM_STATS_VM(v_vnodepgsout, "Vnode pages paged out");
VM_STATS_VM(v_intrans, "In transit page faults");
VM_STATS_VM(v_reactivated, "Pages reactivated by pagedaemon");
VM_STATS_VM(v_pdwakeups, "Pagedaemon wakeups");
-VM_STATS_VM(v_pdpages, "Pages analyzed by pagedaemon");
VM_STATS_VM(v_pdshortfalls, "Page reclamation shortfalls");
VM_STATS_VM(v_dfree, "Pages freed by pagedaemon");
VM_STATS_VM(v_pfree, "Pages freed by exiting processes");
@@ -436,8 +435,7 @@ vm_free_count(void)
return (v);
}
-static
-u_int
+static u_int
vm_pagequeue_count(int pq)
{
u_int v;
@@ -454,22 +452,41 @@ u_int
vm_active_count(void)
{
- return vm_pagequeue_count(PQ_ACTIVE);
+ return (vm_pagequeue_count(PQ_ACTIVE));
}
u_int
vm_inactive_count(void)
{
- return vm_pagequeue_count(PQ_INACTIVE);
+ return (vm_pagequeue_count(PQ_INACTIVE));
}
u_int
vm_laundry_count(void)
{
- return vm_pagequeue_count(PQ_LAUNDRY);
+ return (vm_pagequeue_count(PQ_LAUNDRY));
+}
+
+static int
+sysctl_vm_pdpages(SYSCTL_HANDLER_ARGS)
+{
+ struct vm_pagequeue *pq;
+ uint64_t ret;
+ int dom, i;
+
+ ret = counter_u64_fetch(vm_cnt.v_pdpages);
+ for (dom = 0; dom < vm_ndomains; dom++)
+ for (i = 0; i < PQ_COUNT; i++) {
+ pq = &VM_DOMAIN(dom)->vmd_pagequeues[i];
+ ret += pq->pq_pdpages;
+ }
+ return (SYSCTL_OUT(req, &ret, sizeof(ret)));
}
+SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pdpages,
+ CTLTYPE_U64 | CTLFLAG_MPSAFE | CTLFLAG_RD, NULL, 0, sysctl_vm_pdpages, "QU",
+ "Pages analyzed by pagedaemon");
static void
vm_domain_stats_init(struct vm_domain *vmd, struct sysctl_oid *parent)
@@ -486,15 +503,31 @@ vm_domain_stats_init(struct vm_domain *vmd, struct sysctl_oid *parent)
SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
"active", CTLFLAG_RD, &vmd->vmd_pagequeues[PQ_ACTIVE].pq_cnt, 0,
"Active pages");
+ SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "actpdpgs", CTLFLAG_RD,
+ &vmd->vmd_pagequeues[PQ_ACTIVE].pq_pdpages, 0,
+ "Active pages scanned by the page daemon");
SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
"inactive", CTLFLAG_RD, &vmd->vmd_pagequeues[PQ_INACTIVE].pq_cnt, 0,
"Inactive pages");
+ SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "inactpdpgs", CTLFLAG_RD,
+ &vmd->vmd_pagequeues[PQ_INACTIVE].pq_pdpages, 0,
+ "Inactive pages scanned by the page daemon");
SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
"laundry", CTLFLAG_RD, &vmd->vmd_pagequeues[PQ_LAUNDRY].pq_cnt, 0,
"laundry pages");
+ SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "laundpdpgs", CTLFLAG_RD,
+ &vmd->vmd_pagequeues[PQ_LAUNDRY].pq_pdpages, 0,
+ "Laundry pages scanned by the page daemon");
SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, "unswappable",
CTLFLAG_RD, &vmd->vmd_pagequeues[PQ_UNSWAPPABLE].pq_cnt, 0,
"Unswappable pages");
+ SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "unswppdpgs", CTLFLAG_RD,
+ &vmd->vmd_pagequeues[PQ_UNSWAPPABLE].pq_pdpages, 0,
+ "Unswappable pages scanned by the page daemon");
SYSCTL_ADD_UINT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
"inactive_target", CTLFLAG_RD, &vmd->vmd_inactive_target, 0,
"Target inactive pages");
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index fd052d04ad8cc..8b25b86d0fcbc 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -481,6 +481,7 @@ vm_page_domain_init(int domain)
TAILQ_INIT(&pq->pq_pl);
mtx_init(&pq->pq_mutex, pq->pq_name, "vm pagequeue",
MTX_DEF | MTX_DUPOK);
+ pq->pq_pdpages = 0;
vm_page_init_marker(&vmd->vmd_markers[i], i, 0);
}
mtx_init(&vmd->vmd_free_mtx, "vm page free queue", NULL, MTX_DEF);
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 6881319e4d9d6..c084de7aca44f 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -246,7 +246,7 @@ vm_pageout_end_scan(struct scan_state *ss)
TAILQ_REMOVE(&pq->pq_pl, ss->marker, plinks.q);
vm_page_aflag_clear(ss->marker, PGA_ENQUEUED);
- VM_CNT_ADD(v_pdpages, ss->scanned);
+ pq->pq_pdpages += ss->scanned;
}
/*
diff --git a/sys/vm/vm_pagequeue.h b/sys/vm/vm_pagequeue.h
index fb56bdf2fdfc8..ac04f2b3ea616 100644
--- a/sys/vm/vm_pagequeue.h
+++ b/sys/vm/vm_pagequeue.h
@@ -71,6 +71,7 @@ struct vm_pagequeue {
struct pglist pq_pl;
int pq_cnt;
const char * const pq_name;
+ uint64_t pq_pdpages;
} __aligned(CACHE_LINE_SIZE);
#ifndef VM_BATCHQUEUE_SIZE