PERFORCE change 129908 for review
Peter Wemm
peter at FreeBSD.org
Sat Dec 1 14:32:50 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=129908
Change 129908 by peter at 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.");
}
More information about the p4-projects
mailing list