changeset 14009:09f0146de94b

3650 mdb global symbol tab completion should find all symbols 3651 mdb_readsym() and friends should find all symbols 3652 convert ::spa and ::spa_vdevs to use mdb_ctf_vread() 3653 userland ::whatis always complains about "umem_internal_arena" symbol Reviewed by: Henrik Mattson <henrik.mattson@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Dan McDonald <danmcd@nexenta.com>
author Matthew Ahrens <mahrens@delphix.com>
date Mon, 08 Apr 2013 13:11:12 -0800
parents 55fc53126003
children f59d28091999
files usr/src/cmd/mdb/common/mdb/mdb_ctf.c usr/src/cmd/mdb/common/mdb/mdb_modapi.c usr/src/cmd/mdb/common/mdb/mdb_tab.c usr/src/cmd/mdb/common/modules/libumem/umem.c usr/src/cmd/mdb/common/modules/zfs/zfs.c
diffstat 5 files changed, 38 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/mdb/common/mdb/mdb_ctf.c	Sun Apr 07 18:40:39 2013 -0800
+++ b/usr/src/cmd/mdb/common/mdb/mdb_ctf.c	Mon Apr 08 13:11:12 2013 -0800
@@ -1513,7 +1513,7 @@
 {
 	GElf_Sym sym;
 
-	if (mdb_lookup_by_name(name, &sym) != 0) {
+	if (mdb_lookup_by_obj(MDB_TGT_OBJ_EVERY, name, &sym) != 0) {
 		mdb_ctf_warn(flags, "couldn't find symbol %s\n", name);
 		return (-1); /* errno is set for us */
 	}
--- a/usr/src/cmd/mdb/common/mdb/mdb_modapi.c	Sun Apr 07 18:40:39 2013 -0800
+++ b/usr/src/cmd/mdb/common/mdb/mdb_modapi.c	Mon Apr 08 13:11:12 2013 -0800
@@ -21,6 +21,7 @@
 
 /*
  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 #include <mdb/mdb_modapi.h>
@@ -120,7 +121,7 @@
 mdb_readsym(void *buf, size_t nbytes, const char *name)
 {
 	ssize_t rbytes = mdb_tgt_readsym(mdb.m_target, MDB_TGT_AS_VIRT,
-	    buf, nbytes, MDB_TGT_OBJ_EXEC, name);
+	    buf, nbytes, MDB_TGT_OBJ_EVERY, name);
 
 	if (rbytes > 0 && rbytes < nbytes)
 		return (set_errbytes(rbytes, nbytes));
@@ -132,7 +133,7 @@
 mdb_writesym(const void *buf, size_t nbytes, const char *name)
 {
 	return (mdb_tgt_writesym(mdb.m_target, MDB_TGT_AS_VIRT,
-	    buf, nbytes, MDB_TGT_OBJ_EXEC, name));
+	    buf, nbytes, MDB_TGT_OBJ_EVERY, name));
 }
 
 ssize_t
@@ -140,7 +141,7 @@
 {
 	GElf_Sym sym;
 
-	if (mdb_tgt_lookup_by_name(mdb.m_target, MDB_TGT_OBJ_EXEC,
+	if (mdb_tgt_lookup_by_name(mdb.m_target, MDB_TGT_OBJ_EVERY,
 	    name, &sym, NULL))
 		return (-1);
 
@@ -156,7 +157,7 @@
 {
 	GElf_Sym sym;
 
-	if (mdb_tgt_lookup_by_name(mdb.m_target, MDB_TGT_OBJ_EXEC,
+	if (mdb_tgt_lookup_by_name(mdb.m_target, MDB_TGT_OBJ_EVERY,
 	    name, &sym, NULL))
 		return (-1);
 
@@ -170,7 +171,7 @@
 int
 mdb_lookup_by_name(const char *name, GElf_Sym *sym)
 {
-	return (mdb_lookup_by_obj(MDB_TGT_OBJ_EXEC, name, sym));
+	return (mdb_lookup_by_obj(MDB_TGT_OBJ_EVERY, name, sym));
 }
 
 int
--- a/usr/src/cmd/mdb/common/mdb/mdb_tab.c	Sun Apr 07 18:40:39 2013 -0800
+++ b/usr/src/cmd/mdb/common/mdb/mdb_tab.c	Mon Apr 08 13:11:12 2013 -0800
@@ -506,7 +506,7 @@
 {
 	mdb_tab_setmbase(mcp, name);
 	(void) mdb_tgt_symbol_iter(mdb.m_target, MDB_TGT_OBJ_EVERY,
-	    MDB_TGT_SYMTAB, MDB_TGT_BIND_GLOBAL | MDB_TGT_TYPE_OBJECT |
+	    MDB_TGT_SYMTAB, MDB_TGT_BIND_ANY | MDB_TGT_TYPE_OBJECT |
 	    MDB_TGT_TYPE_FUNC, tab_complete_global, mcp);
 	return (0);
 }
--- a/usr/src/cmd/mdb/common/modules/libumem/umem.c	Sun Apr 07 18:40:39 2013 -0800
+++ b/usr/src/cmd/mdb/common/modules/libumem/umem.c	Mon Apr 08 13:11:12 2013 -0800
@@ -25,6 +25,7 @@
 
 /*
  * Copyright 2011 Joyent, Inc.  All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 #include "umem.h"
@@ -2102,7 +2103,7 @@
 	wi.wi_w = w;
 
 	/* umem's metadata is allocated from the umem_internal_arena */
-	if (mdb_readvar(&wi.wi_msb_arena, "umem_internal_arena") == -1)
+	if (umem_readvar(&wi.wi_msb_arena, "umem_internal_arena") == -1)
 		mdb_warn("unable to readvar \"umem_internal_arena\"");
 
 	/*
--- a/usr/src/cmd/mdb/common/modules/zfs/zfs.c	Sun Apr 07 18:40:39 2013 -0800
+++ b/usr/src/cmd/mdb/common/modules/zfs/zfs.c	Mon Apr 08 13:11:12 2013 -0800
@@ -36,7 +36,6 @@
 #include <sys/metaslab_impl.h>
 #include <sys/space_map.h>
 #include <sys/list.h>
-#include <sys/spa_impl.h>
 #include <sys/vdev_impl.h>
 #include <sys/zap_leaf.h>
 #include <sys/zap_impl.h>
@@ -778,7 +777,7 @@
 	}
 
 	for (i = 0; i < sizeof (syms) / sizeof (syms[0]); i++) {
-		if (mdb_lookup_by_name(syms[i], &sym)) {
+		if (mdb_lookup_by_obj(ZFS_OBJ_NAME, syms[i], &sym)) {
 			mdb_warn("can't find symbol %s", syms[i]);
 			return (DCMD_ERR);
 		}
@@ -896,7 +895,7 @@
 		NULL
 	};
 
-	if (mdb_lookup_by_name("arc_stats", &sym) == -1) {
+	if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "arc_stats", &sym) == -1) {
 		mdb_warn("failed to find 'arc_stats'");
 		return (DCMD_ERR);
 	}
@@ -963,7 +962,7 @@
 	for (i = 0; extras[i]; i++) {
 		uint64_t buf;
 
-		if (mdb_lookup_by_name(extras[i], &sym) == -1) {
+		if (mdb_lookup_by_obj(ZFS_OBJ_NAME, extras[i], &sym) == -1) {
 			mdb_warn("failed to find '%s'", extras[i]);
 			return (DCMD_ERR);
 		}
@@ -992,12 +991,17 @@
 	return (DCMD_OK);
 }
 
+typedef struct mdb_spa_print {
+	pool_state_t spa_state;
+	char spa_name[MAXNAMELEN];
+} mdb_spa_print_t;
+
 /*
  * ::spa
  *
- * 	-c	Print configuration information as well
- * 	-v	Print vdev state
- * 	-e	Print vdev error stats
+ *	-c	Print configuration information as well
+ *	-v	Print vdev state
+ *	-e	Print vdev error stats
  *
  * Print a summarized spa_t.  When given no arguments, prints out a table of all
  * active pools on the system.
@@ -1006,7 +1010,6 @@
 static int
 spa_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 {
-	spa_t spa;
 	const char *statetab[] = { "ACTIVE", "EXPORTED", "DESTROYED",
 		"SPARE", "L2CACHE", "UNINIT", "UNAVAIL", "POTENTIAL" };
 	const char *state;
@@ -1039,10 +1042,9 @@
 		mdb_printf("%<u>%-?s %9s %-*s%</u>\n", "ADDR", "STATE",
 		    sizeof (uintptr_t) == 4 ? 60 : 52, "NAME");
 
-	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
-		mdb_warn("failed to read spa_t at %p", addr);
+	mdb_spa_print_t spa;
+	if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_print_t", addr, 0) == -1)
 		return (DCMD_ERR);
-	}
 
 	if (spa.spa_state < 0 || spa.spa_state > POOL_STATE_UNAVAIL)
 		state = "UNKNOWN";
@@ -1577,36 +1579,19 @@
 	return (DCMD_OK);
 }
 
-/*
- * ::spa_verify
- *
- * Given a spa_t, verify that that the pool is self-consistent.
- * Currently, it only checks to make sure that the vdev tree exists.
- */
-/* ARGSUSED */
-static int
-spa_verify(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
-{
-	spa_t spa;
-
-	if (argc != 0 || !(flags & DCMD_ADDRSPEC))
-		return (DCMD_USAGE);
-
-	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
-		mdb_warn("failed to read spa_t at %p", addr);
-		return (DCMD_ERR);
-	}
-
-	if (spa.spa_root_vdev == NULL) {
-		mdb_printf("no vdev tree present\n");
-		return (DCMD_OK);
-	}
-
-	return (DCMD_OK);
-}
+typedef struct mdb_spa_aux_vdev {
+	int sav_count;
+	uintptr_t sav_vdevs;
+} mdb_spa_aux_vdev_t;
+
+typedef struct mdb_spa_vdevs {
+	uintptr_t spa_root_vdev;
+	mdb_spa_aux_vdev_t spa_l2cache;
+	mdb_spa_aux_vdev_t spa_spares;
+} mdb_spa_vdevs_t;
 
 static int
-spa_print_aux(spa_aux_vdev_t *sav, uint_t flags, mdb_arg_t *v,
+spa_print_aux(mdb_spa_aux_vdev_t *sav, uint_t flags, mdb_arg_t *v,
     const char *name)
 {
 	uintptr_t *aux;
@@ -1627,8 +1612,7 @@
 
 		len = sav->sav_count * sizeof (uintptr_t);
 		aux = mdb_alloc(len, UM_SLEEP);
-		if (mdb_vread(aux, len,
-		    (uintptr_t)sav->sav_vdevs) == -1) {
+		if (mdb_vread(aux, len, sav->sav_vdevs) == -1) {
 			mdb_free(aux, len);
 			mdb_warn("failed to read l2cache vdevs at %p",
 			    sav->sav_vdevs);
@@ -1664,7 +1648,6 @@
 static int
 spa_vdevs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 {
-	spa_t spa;
 	mdb_arg_t v[3];
 	int errors = FALSE;
 	int ret;
@@ -1677,10 +1660,9 @@
 	if (!(flags & DCMD_ADDRSPEC))
 		return (DCMD_USAGE);
 
-	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
-		mdb_warn("failed to read spa_t at %p", addr);
+	mdb_spa_vdevs_t spa;
+	if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_vdevs_t", addr, 0) == -1)
 		return (DCMD_ERR);
-	}
 
 	/*
 	 * Unitialized spa_t structures can have a NULL root vdev.
@@ -2045,14 +2027,7 @@
 static int
 spa_walk_step(mdb_walk_state_t *wsp)
 {
-	spa_t	spa;
-
-	if (mdb_vread(&spa, sizeof (spa), wsp->walk_addr) == -1) {
-		mdb_warn("failed to read spa_t at %p", wsp->walk_addr);
-		return (WALK_ERR);
-	}
-
-	return (wsp->walk_callback(wsp->walk_addr, &spa, wsp->walk_cbdata));
+	return (wsp->walk_callback(wsp->walk_addr, NULL, wsp->walk_cbdata));
 }
 
 /*
@@ -3077,7 +3052,6 @@
 	    abuf_find },
 	{ "spa", "?[-cv]", "spa_t summary", spa_print },
 	{ "spa_config", ":", "print spa_t configuration", spa_print_config },
-	{ "spa_verify", ":", "verify spa_t consistency", spa_verify },
 	{ "spa_space", ":[-b]", "print spa_t on-disk space usage", spa_space },
 	{ "spa_vdevs", ":", "given a spa_t, print vdev summary", spa_vdevs },
 	{ "vdev", ":[-re]\n"