Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Dec 2007 22:32:49 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 129908 for review
Message-ID:  <200712012232.lB1MWndY084756@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=129908

Change 129908 by peter@peter_daintree on 2007/12/01 22:30:33

	IFC

Affected files ...

.. //depot/projects/bike_sched/sys/kern/kern_lock.c#4 integrate
.. //depot/projects/bike_sched/sys/kern/subr_stack.c#2 integrate
.. //depot/projects/bike_sched/sys/sys/stack.h#2 integrate
.. //depot/projects/bike_sched/sys/vm/redzone.c#2 integrate

Differences ...

==== //depot/projects/bike_sched/sys/kern/kern_lock.c#4 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_lock.c,v 1.113 2007/11/24 04:22:27 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_lock.c,v 1.114 2007/12/01 22:04:15 rwatson Exp $");
 
 #include "opt_ddb.h"
 #include "opt_global.h"
@@ -625,7 +625,7 @@
 	if (lkp->lk_waitcount > 0)
 		printf(" with %d pending", lkp->lk_waitcount);
 #ifdef DEBUG_LOCKS
-	stack_print(&lkp->lk_stack);
+	stack_print_ddb(&lkp->lk_stack);
 #endif
 }
 

==== //depot/projects/bike_sched/sys/kern/subr_stack.c#2 (text+ko) ====

@@ -24,8 +24,10 @@
  * SUCH DAMAGE.
  */
 
+#include "opt_ddb.h"
+
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_stack.c,v 1.3 2006/05/28 22:15:28 kris Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_stack.c,v 1.4 2007/12/01 22:04:15 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -40,7 +42,12 @@
 
 MALLOC_DEFINE(M_STACK, "stack", "Stack Traces");
 
-static void stack_symbol(vm_offset_t pc, const char **name, long *offset);
+static void stack_symbol(vm_offset_t pc, char *namebuf, u_int buflen,
+	    long *offset);
+#ifdef DDB
+static void stack_symbol_ddb(vm_offset_t pc, char *namebuf, u_int buflen,
+	    long *offset);
+#endif
 
 struct stack *
 stack_create(void)
@@ -86,30 +93,67 @@
 void
 stack_print(struct stack *st)
 {
-	const char *name;
+	char namebuf[64];
+	long offset;
+	int i;
+
+	KASSERT(st->depth <= STACK_MAX, ("bogus stack"));
+	for (i = 0; i < st->depth; i++) {
+		stack_symbol(st->pcs[i], namebuf, sizeof(namebuf), &offset);
+		printf("#%d %p at %s+%#lx\n", i, (void *)st->pcs[i],
+		    namebuf, offset);
+	}
+}
+
+void
+stack_print_ddb(struct stack *st)
+{
+	char namebuf[64];
 	long offset;
 	int i;
 
 	KASSERT(st->depth <= STACK_MAX, ("bogus stack"));
 	for (i = 0; i < st->depth; i++) {
-		stack_symbol(st->pcs[i], &name, &offset);
+		stack_symbol_ddb(st->pcs[i], namebuf, sizeof(namebuf),
+		    &offset);
 		printf("#%d %p at %s+%#lx\n", i, (void *)st->pcs[i],
-		    name, offset);
+		    namebuf, offset);
 	}
 }
 
+/*
+ * Two print routines -- one for use from DDB and DDB-like contexts, the
+ * other for use in the live kernel.
+ */
 void
 stack_sbuf_print(struct sbuf *sb, struct stack *st)
 {
-	const char *name;
+	char namebuf[64];
+	long offset;
+	int i;
+
+	KASSERT(st->depth <= STACK_MAX, ("bogus stack"));
+	for (i = 0; i < st->depth; i++) {
+		stack_symbol(st->pcs[i], namebuf, sizeof(namebuf), &offset);
+		sbuf_printf(sb, "#%d %p at %s+%#lx\n", i, (void *)st->pcs[i],
+		    namebuf, offset);
+	}
+}
+
+#ifdef DDB
+void
+stack_sbuf_print_ddb(struct sbuf *sb, struct stack *st)
+{
+	char namebuf[64];
 	long offset;
 	int i;
 
 	KASSERT(st->depth <= STACK_MAX, ("bogus stack"));
 	for (i = 0; i < st->depth; i++) {
-		stack_symbol(st->pcs[i], &name, &offset);
+		stack_symbol_ddb(st->pcs[i], namebuf, sizeof(namebuf),
+		    &offset);
 		sbuf_printf(sb, "#%d %p at %s+%#lx\n", i, (void *)st->pcs[i],
-		    name, offset);
+		    namebuf, offset);
 	}
 }
 
@@ -118,7 +162,7 @@
 stack_ktr(u_int mask, const char *file, int line, struct stack *st, u_int depth,
     int cheap)
 {
-	const char *name;
+	char namebuf[64];
 	long offset;
 	int i;
 
@@ -141,29 +185,40 @@
 		if (depth == 0 || st->depth < depth)
 			depth = st->depth;
 		for (i = 0; i < depth; i++) {
-			stack_symbol(st->pcs[i], &name, &offset);
+			stack_symbol_ddb(st->pcs[i], namebuf,
+			    sizeof(namebuf), &offset);
 			ktr_tracepoint(mask, file, line, "#%d %p at %s+%#lx",
-			    i, st->pcs[i], (u_long)name, offset, 0, 0);
+			    i, st->pcs[i], (u_long)namebuf, offset, 0, 0);
 		}
 	}
 }
 #endif
+#endif
 
+/*
+ * Two variants of stack symbol lookup -- one that uses the DDB interfaces
+ * and bypasses linker locking, and the other that doesn't.
+ */
 static void
-stack_symbol(vm_offset_t pc, const char **name, long *offset)
+stack_symbol(vm_offset_t pc, char *namebuf, u_int buflen, long *offset)
 {
-	linker_symval_t symval;
-	c_linker_sym_t sym;
 
-	if (linker_ddb_search_symbol((caddr_t)pc, &sym, offset) != 0)
-		goto out;
-	if (linker_ddb_symbol_values(sym, &symval) != 0)
-		goto out;
-	if (symval.name != NULL) {
-		*name = symval.name;
-		return;
+	if (linker_search_symbol_name((caddr_t)pc, namebuf, buflen,
+	    offset) != 0) {
+		*offset = 0;
+		strlcpy(namebuf, "Unknown func", buflen);
 	}
-out:
-	*offset = 0;
-	*name = "Unknown func";
+}
+
+#ifdef DDB
+static void
+stack_symbol_ddb(vm_offset_t pc, char *namebuf, u_int buflen, long *offset)
+{
+
+	if (linker_ddb_search_symbol_name((caddr_t)pc, namebuf, buflen,
+	    offset) != 0) {
+		*offset = 0;
+		strlcpy(namebuf, "Unknown func", buflen);
+	};
 }
+#endif

==== //depot/projects/bike_sched/sys/sys/stack.h#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/stack.h,v 1.2 2005/08/29 11:34:08 pjd Exp $
+ * $FreeBSD: src/sys/sys/stack.h,v 1.3 2007/12/01 22:04:15 rwatson Exp $
  */
 
 #ifndef _SYS_STACK_H_
@@ -45,7 +45,9 @@
 void		 stack_copy(struct stack *, struct stack *);
 void		 stack_zero(struct stack *);
 void		 stack_print(struct stack *);
+void		 stack_print_ddb(struct stack *);
 void		 stack_sbuf_print(struct sbuf *, struct stack *);
+void		 stack_sbuf_print_ddb(struct sbuf *, struct stack *);
 #ifdef KTR
 void		 stack_ktr(u_int, const char *, int, struct stack *, u_int, int);
 #define	CTRSTACK(m, st, depth, cheap) do {				\

==== //depot/projects/bike_sched/sys/vm/redzone.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/redzone.c,v 1.1 2006/01/31 11:09:20 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/redzone.c,v 1.2 2007/12/01 22:04:16 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -152,10 +152,10 @@
 		    "corrupted before %p (%lu bytes allocated).\n",
 		    ncorruptions, ncorruptions == 1 ? "" : "s", naddr, nsize);
 		printf("Allocation backtrace:\n");
-		stack_print(&ast);
+		stack_print_ddb(&ast);
 		printf("Free backtrace:\n");
 		stack_save(&fst);
-		stack_print(&fst);
+		stack_print_ddb(&fst);
 		if (redzone_panic)
 			panic("Stopping here.");
 	}
@@ -171,10 +171,10 @@
 		    "after %p (%lu bytes allocated).\n", ncorruptions,
 		    ncorruptions == 1 ? "" : "s", naddr + nsize, nsize);
 		printf("Allocation backtrace:\n");
-		stack_print(&ast);
+		stack_print_ddb(&ast);
 		printf("Free backtrace:\n");
 		stack_save(&fst);
-		stack_print(&fst);
+		stack_print_ddb(&fst);
 		if (redzone_panic)
 			panic("Stopping here.");
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712012232.lB1MWndY084756>