Module Name:    src
Committed By:   joerg
Date:           Fri Jun 13 19:09:07 UTC 2014

Modified Files:
        src/share/man/man7: sysctl.7
        src/sys/kern: subr_pool.c
        src/sys/sys: pool.h

Log Message:
Add kern.pool for memory pool stats.


To generate a diff of this commit:
cvs rdiff -u -r1.81 -r1.82 src/share/man/man7/sysctl.7
cvs rdiff -u -r1.202 -r1.203 src/sys/kern/subr_pool.c
cvs rdiff -u -r1.75 -r1.76 src/sys/sys/pool.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man7/sysctl.7
diff -u src/share/man/man7/sysctl.7:1.81 src/share/man/man7/sysctl.7:1.82
--- src/share/man/man7/sysctl.7:1.81	Fri May 30 01:43:20 2014
+++ src/share/man/man7/sysctl.7	Fri Jun 13 19:09:07 2014
@@ -1,4 +1,4 @@
-.\"	$NetBSD: sysctl.7,v 1.81 2014/05/30 01:43:20 christos Exp $
+.\"	$NetBSD: sysctl.7,v 1.82 2014/06/13 19:09:07 joerg Exp $
 .\"
 .\" Copyright (c) 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	@(#)sysctl.3	8.4 (Berkeley) 5/9/95
 .\"
-.Dd May 29, 2014
+.Dd June 13, 2014
 .Dt SYSCTL 7
 .Os
 .Sh NAME
@@ -329,6 +329,7 @@ privilege may change the value.
 .It kern.ostype	string	no
 .\".It kern.panic_now	integer	yes
 .It kern.pipe	node	not applicable
+.It kern.pool	struct pool_sysctl	no
 .\" .It kern.posix	node	not applicable
 .It kern.posix1version	integer	no
 .It kern.posix_aio	integer	no
@@ -849,6 +850,12 @@ Number of
 .Dq big
 pipes.
 .El
+.It Li kern.pool
+Provides statistics about the
+.Xr pool 9 
+and
+.Xr pool_cache 9
+subsystems.
 .\" XXX: Undocumented .It Li kern.posix ( ? )
 .\"	 This is a node in which the only variable is semmax.
 .It Li kern.posix1version ( KERN_POSIX1 )

Index: src/sys/kern/subr_pool.c
diff -u src/sys/kern/subr_pool.c:1.202 src/sys/kern/subr_pool.c:1.203
--- src/sys/kern/subr_pool.c:1.202	Sat Apr 26 16:30:05 2014
+++ src/sys/kern/subr_pool.c	Fri Jun 13 19:09:07 2014
@@ -1,7 +1,7 @@
-/*	$NetBSD: subr_pool.c,v 1.202 2014/04/26 16:30:05 abs Exp $	*/
+/*	$NetBSD: subr_pool.c,v 1.203 2014/06/13 19:09:07 joerg Exp $	*/
 
 /*-
- * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010
+ * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014
  *     The NetBSD Foundation, Inc.
  * All rights reserved.
  *
@@ -32,13 +32,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.202 2014/04/26 16:30:05 abs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.203 2014/06/13 19:09:07 joerg Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/sysctl.h>
 #include <sys/bitops.h>
 #include <sys/proc.h>
 #include <sys/errno.h>
@@ -2751,3 +2752,100 @@ print:
 	}
 }
 #endif /* defined(DDB) */
+
+static int
+pool_sysctl(SYSCTLFN_ARGS)
+{
+	struct pool_sysctl data;
+	struct pool *pp;
+	struct pool_cache *pc;
+	pool_cache_cpu_t *cc;
+	int error;
+	size_t i, written;
+
+	if (oldp == NULL) {
+		*oldlenp = 0;
+		TAILQ_FOREACH(pp, &pool_head, pr_poollist)
+			*oldlenp += sizeof(data);
+		return 0;
+	}
+
+	memset(&data, 0, sizeof(data));
+	error = 0;
+	written = 0;
+	TAILQ_FOREACH(pp, &pool_head, pr_poollist) {
+		if (written + sizeof(data) > *oldlenp)
+			break;
+		strlcpy(data.pr_wchan, pp->pr_wchan, sizeof(data.pr_wchan));
+		data.pr_pagesize = pp->pr_alloc->pa_pagesz;
+		data.pr_flags = pp->pr_roflags | pp->pr_flags;
+#define COPY(field) data.field = pp->field
+		COPY(pr_size);
+
+		COPY(pr_itemsperpage);
+		COPY(pr_nitems);
+		COPY(pr_nout);
+		COPY(pr_hardlimit);
+		COPY(pr_npages);
+		COPY(pr_minpages);
+		COPY(pr_maxpages);
+
+		COPY(pr_nget);
+		COPY(pr_nfail);
+		COPY(pr_nput);
+		COPY(pr_npagealloc);
+		COPY(pr_npagefree);
+		COPY(pr_hiwat);
+		COPY(pr_nidle);
+#undef COPY
+
+		data.pr_cache_nmiss_pcpu = 0;
+		data.pr_cache_nhit_pcpu = 0;
+		if (pp->pr_cache) {
+			pc = pp->pr_cache;
+			data.pr_cache_meta_size = pc->pc_pcgsize;
+			data.pr_cache_nfull = pc->pc_nfull;
+			data.pr_cache_npartial = pc->pc_npart;
+			data.pr_cache_nempty = pc->pc_nempty;
+			data.pr_cache_ncontended = pc->pc_contended;
+			data.pr_cache_nmiss_global = pc->pc_misses;
+			data.pr_cache_nhit_global = pc->pc_hits;
+			for (i = 0; i < pc->pc_ncpu; ++i) {
+				cc = pc->pc_cpus[i];
+				if (cc == NULL)
+					continue;
+				data.pr_cache_nmiss_pcpu = cc->cc_misses;
+				data.pr_cache_nhit_pcpu = cc->cc_hits;
+			}
+		} else {
+			data.pr_cache_meta_size = 0;
+			data.pr_cache_nfull = 0;
+			data.pr_cache_npartial = 0;
+			data.pr_cache_nempty = 0;
+			data.pr_cache_ncontended = 0;
+			data.pr_cache_nmiss_global = 0;
+			data.pr_cache_nhit_global = 0;
+		}
+
+		error = sysctl_copyout(l, &data, oldp, sizeof(data));
+		if (error)
+			break;
+		written += sizeof(data);
+		oldp = (char *)oldp + sizeof(data);
+	}
+
+	*oldlenp = written;
+	return error;
+}
+
+SYSCTL_SETUP(sysctl_pool_setup, "sysctl kern.pool setup")
+{
+	const struct sysctlnode *rnode = NULL;
+
+	sysctl_createv(clog, 0, NULL, &rnode,
+		       CTLFLAG_PERMANENT,
+		       CTLTYPE_STRUCT, "pool",
+		       SYSCTL_DESCR("Get pool statistics"),
+		       pool_sysctl, 0, NULL, 0,
+		       CTL_KERN, CTL_CREATE, CTL_EOL);
+}

Index: src/sys/sys/pool.h
diff -u src/sys/sys/pool.h:1.75 src/sys/sys/pool.h:1.76
--- src/sys/sys/pool.h:1.75	Tue Jun  5 22:51:47 2012
+++ src/sys/sys/pool.h	Fri Jun 13 19:09:07 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pool.h,v 1.75 2012/06/05 22:51:47 jym Exp $	*/
+/*	$NetBSD: pool.h,v 1.76 2014/06/13 19:09:07 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 1999, 2000, 2007 The NetBSD Foundation, Inc.
@@ -32,6 +32,39 @@
 
 #ifndef _SYS_POOL_H_
 #define _SYS_POOL_H_
+#include <sys/stdint.h>
+
+struct pool_sysctl {
+	char pr_wchan[16];
+	uint64_t pr_flags;
+	uint64_t pr_size;
+	uint64_t pr_pagesize;
+	uint64_t pr_itemsperpage;
+	uint64_t pr_nitems;
+	uint64_t pr_nout;
+	uint64_t pr_hardlimit;
+	uint64_t pr_npages;
+	uint64_t pr_minpages;
+	uint64_t pr_maxpages;
+
+	uint64_t pr_nget;
+	uint64_t pr_nfail;
+	uint64_t pr_nput;
+	uint64_t pr_npagealloc;
+	uint64_t pr_npagefree;
+	uint64_t pr_hiwat;
+	uint64_t pr_nidle;
+
+	uint64_t pr_cache_meta_size;
+	uint64_t pr_cache_nfull;
+	uint64_t pr_cache_npartial;
+	uint64_t pr_cache_nempty;
+	uint64_t pr_cache_ncontended;
+	uint64_t pr_cache_nmiss_global;
+	uint64_t pr_cache_nhit_global;
+	uint64_t pr_cache_nmiss_pcpu;
+	uint64_t pr_cache_nhit_pcpu;
+};
 
 #ifdef _KERNEL
 #define	__POOL_EXPOSE

Reply via email to