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>