version 1.202, 2014/04/26 16:30:05 |
version 1.203, 2014/06/13 19:09:07 |
|
|
/* $NetBSD$ */ |
/* $NetBSD$ */ |
|
|
/*- |
/*- |
* Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010 |
* Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014 |
* The NetBSD Foundation, Inc. |
* The NetBSD Foundation, Inc. |
* All rights reserved. |
* All rights reserved. |
* |
* |
Line 39 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 39 __KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/systm.h> |
#include <sys/systm.h> |
|
#include <sys/sysctl.h> |
#include <sys/bitops.h> |
#include <sys/bitops.h> |
#include <sys/proc.h> |
#include <sys/proc.h> |
#include <sys/errno.h> |
#include <sys/errno.h> |
|
|
} |
} |
} |
} |
#endif /* defined(DDB) */ |
#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); |
|
} |