summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2016-02-21 22:34:09 +0000
committermarius <marius@FreeBSD.org>2016-02-21 22:34:09 +0000
commit5f93fbd79cb00f75444d81d9884c5f60a3c4ca1b (patch)
treed6dcbce85ca293d0cc1285b3d753c8095100b566 /sys/kern
parent26478850ece7c67c411c84bc991bd6957b4695bb (diff)
downloadFreeBSD-src-5f93fbd79cb00f75444d81d9884c5f60a3c4ca1b.zip
FreeBSD-src-5f93fbd79cb00f75444d81d9884c5f60a3c4ca1b.tar.gz
MFC: r264565
Do not set M_BESTFIT if a strategy has already been provided. This fixes problems when using M_FIRSTFIT. MFC: r280805 Add four new DDB commands to display vmem(9) statistics. In particular, such DDB commands were added: show vmem <addr> show all vmem show vmemdump <addr> show all vmemdump As possible usage, that allows to see KVA usage and fragmentation. Approved by: re (gjb)
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/subr_vmem.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/sys/kern/subr_vmem.c b/sys/kern/subr_vmem.c
index 389b7ee..80940be 100644
--- a/sys/kern/subr_vmem.c
+++ b/sys/kern/subr_vmem.c
@@ -502,7 +502,8 @@ qc_import(void *arg, void **store, int cnt, int flags)
int i;
qc = arg;
- flags |= M_BESTFIT;
+ if ((flags & VMEM_FITMASK) == 0)
+ flags |= M_BESTFIT;
for (i = 0; i < cnt; i++) {
if (vmem_xalloc(qc->qc_vmem, qc->qc_size, 0, 0, 0,
VMEM_ADDR_MIN, VMEM_ADDR_MAX, flags, &addr) != 0)
@@ -1407,6 +1408,8 @@ vmem_dump(const vmem_t *vm , int (*pr)(const char *, ...) __printflike(1, 2))
#endif /* defined(DDB) || defined(DIAGNOSTIC) */
#if defined(DDB)
+#include <ddb/ddb.h>
+
static bt_t *
vmem_whatis_lookup(vmem_t *vm, vmem_addr_t addr)
{
@@ -1460,6 +1463,78 @@ vmem_print(vmem_addr_t addr, const char *modif, int (*pr)(const char *, ...))
vmem_dump(vm, pr);
}
+
+DB_SHOW_COMMAND(vmemdump, vmemdump)
+{
+
+ if (!have_addr) {
+ db_printf("usage: show vmemdump <addr>\n");
+ return;
+ }
+
+ vmem_dump((const vmem_t *)addr, db_printf);
+}
+
+DB_SHOW_ALL_COMMAND(vmemdump, vmemdumpall)
+{
+ const vmem_t *vm;
+
+ LIST_FOREACH(vm, &vmem_list, vm_alllist)
+ vmem_dump(vm, db_printf);
+}
+
+DB_SHOW_COMMAND(vmem, vmem_summ)
+{
+ const vmem_t *vm = (const void *)addr;
+ const bt_t *bt;
+ size_t ft[VMEM_MAXORDER], ut[VMEM_MAXORDER];
+ size_t fs[VMEM_MAXORDER], us[VMEM_MAXORDER];
+ int ord;
+
+ if (!have_addr) {
+ db_printf("usage: show vmem <addr>\n");
+ return;
+ }
+
+ db_printf("vmem %p '%s'\n", vm, vm->vm_name);
+ db_printf("\tquantum:\t%zu\n", vm->vm_quantum_mask + 1);
+ db_printf("\tsize:\t%zu\n", vm->vm_size);
+ db_printf("\tinuse:\t%zu\n", vm->vm_inuse);
+ db_printf("\tfree:\t%zu\n", vm->vm_size - vm->vm_inuse);
+ db_printf("\tbusy tags:\t%d\n", vm->vm_nbusytag);
+ db_printf("\tfree tags:\t%d\n", vm->vm_nfreetags);
+
+ memset(&ft, 0, sizeof(ft));
+ memset(&ut, 0, sizeof(ut));
+ memset(&fs, 0, sizeof(fs));
+ memset(&us, 0, sizeof(us));
+ TAILQ_FOREACH(bt, &vm->vm_seglist, bt_seglist) {
+ ord = SIZE2ORDER(bt->bt_size >> vm->vm_quantum_shift);
+ if (bt->bt_type == BT_TYPE_BUSY) {
+ ut[ord]++;
+ us[ord] += bt->bt_size;
+ } else if (bt->bt_type == BT_TYPE_FREE) {
+ ft[ord]++;
+ fs[ord] += bt->bt_size;
+ }
+ }
+ db_printf("\t\t\tinuse\tsize\t\tfree\tsize\n");
+ for (ord = 0; ord < VMEM_MAXORDER; ord++) {
+ if (ut[ord] == 0 && ft[ord] == 0)
+ continue;
+ db_printf("\t%-15zu %zu\t%-15zu %zu\t%-16zu\n",
+ ORDER2SIZE(ord) << vm->vm_quantum_shift,
+ ut[ord], us[ord], ft[ord], fs[ord]);
+ }
+}
+
+DB_SHOW_ALL_COMMAND(vmem, vmem_summall)
+{
+ const vmem_t *vm;
+
+ LIST_FOREACH(vm, &vmem_list, vm_alllist)
+ vmem_summ((db_expr_t)vm, TRUE, count, modif);
+}
#endif /* defined(DDB) */
#define vmem_printf printf
OpenPOWER on IntegriCloud