From bc44c7d780ef5f05741ec3a587e3ca32e9364352 Mon Sep 17 00:00:00 2001 From: christos Date: Fri, 24 Oct 2008 13:55:42 +0000 Subject: [PATCH] don't hold locks in ddb (call ksyms_getval_unlocked()), pointed out by ad. --- sys/ddb/db_sym.c | 14 +++++++------- sys/kern/kern_ksyms.c | 8 +++----- sys/sys/ksyms.h | 3 ++- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/sys/ddb/db_sym.c b/sys/ddb/db_sym.c index 0297f103019a..f336036d30ca 100644 --- a/sys/ddb/db_sym.c +++ b/sys/ddb/db_sym.c @@ -1,4 +1,4 @@ -/* $NetBSD: db_sym.c,v 1.56 2007/02/22 06:41:01 thorpej Exp $ */ +/* $NetBSD: db_sym.c,v 1.57 2008/10/24 13:55:42 christos Exp $ */ /* * Mach Operating System @@ -27,7 +27,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: db_sym.c,v 1.56 2007/02/22 06:41:01 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_sym.c,v 1.57 2008/10/24 13:55:42 christos Exp $"); #include "opt_ddbparam.h" @@ -111,12 +111,12 @@ db_value_of_name(const char *name, db_expr_t *valuep) #endif (void)strlcpy(symbol, name, sizeof(symbol)); db_symsplit(symbol, &mod, &sym); - if (ksyms_getval(mod, sym, &uval, KSYMS_EXTERN) == 0) { + if (ksyms_getval_unlocked(mod, sym, &uval, KSYMS_EXTERN) == 0) { val = (long) uval; *valuep = (db_expr_t)val; return true; } - if (ksyms_getval(mod, sym, &uval, KSYMS_ANY) == 0) { + if (ksyms_getval_unlocked(mod, sym, &uval, KSYMS_ANY) == 0) { val = (long) uval; *valuep = (db_expr_t)val; return true; @@ -230,7 +230,7 @@ db_search_symbol(db_addr_t val, db_strategy_t strategy, db_expr_t *offp) #endif if (ksyms_getname(&mod, &sym, (vaddr_t)val, strategy) == 0) { - (void)ksyms_getval(mod, sym, &naddr, KSYMS_ANY); + (void)ksyms_getval_unlocked(mod, sym, &naddr, KSYMS_ANY); diff = val - (db_addr_t)naddr; ret = (db_sym_t)naddr; } else @@ -338,7 +338,7 @@ db_symstr(char *buf, size_t buflen, db_expr_t off, db_strategy_t strategy) #endif if (ksyms_getname(&mod, &name, (vaddr_t)off, strategy|KSYMS_CLOSEST) == 0) { - (void)ksyms_getval(mod, name, &val, KSYMS_ANY); + (void)ksyms_getval_unlocked(mod, name, &val, KSYMS_ANY); if (((off - val) < db_maxoff) && val) { snprintf(buf, buflen, "%s:%s", mod, name); if (off - val) { @@ -409,7 +409,7 @@ db_printsym(db_expr_t off, db_strategy_t strategy, #endif if (ksyms_getname(&mod, &name, (vaddr_t)off, strategy|KSYMS_CLOSEST) == 0) { - (void)ksyms_getval(mod, name, &uval, KSYMS_ANY); + (void)ksyms_getval_unlocked(mod, name, &uval, KSYMS_ANY); val = (long) uval; if (((off - val) < db_maxoff) && val) { (*pr)("%s:%s", mod, name); diff --git a/sys/kern/kern_ksyms.c b/sys/kern/kern_ksyms.c index cec9cabbbe52..d3b1461ef28e 100644 --- a/sys/kern/kern_ksyms.c +++ b/sys/kern/kern_ksyms.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ksyms.c,v 1.40 2008/10/23 20:41:13 christos Exp $ */ +/* $NetBSD: kern_ksyms.c,v 1.41 2008/10/24 13:55:42 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -74,7 +74,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.40 2008/10/23 20:41:13 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.41 2008/10/24 13:55:42 christos Exp $"); #ifdef _KERNEL #include "opt_ddb.h" @@ -113,8 +113,6 @@ static kmutex_t ksyms_lock; void ksymsattach(int); static void ksyms_hdr_init(void *); static void ksyms_sizes_calc(void); -static int ksyms_getval_unlocked(const char *, const char *, unsigned long *, - int); #ifdef KSYMS_DEBUG #define FOLLOW_CALLS 1 @@ -507,7 +505,7 @@ ksyms_init_explicit(void *ehdr, void *symstart, size_t symsize, * * Call with ksyms_lock, unless known that the symbol table can't change. */ -static int +int ksyms_getval_unlocked(const char *mod, const char *sym, unsigned long *val, int type) { diff --git a/sys/sys/ksyms.h b/sys/sys/ksyms.h index 4e191640b977..10127b3d8541 100644 --- a/sys/sys/ksyms.h +++ b/sys/sys/ksyms.h @@ -1,4 +1,4 @@ -/* $NetBSD: ksyms.h,v 1.16 2008/10/23 20:41:13 christos Exp $ */ +/* $NetBSD: ksyms.h,v 1.17 2008/10/24 13:55:42 christos Exp $ */ /* * Copyright (c) 2001, 2003 Anders Magnusson (ragge@ludd.luth.se). @@ -102,6 +102,7 @@ struct ksyms_gsymbol { */ int ksyms_getname(const char **, const char **, vaddr_t, int); int ksyms_getval(const char *, const char *, unsigned long *, int); +int ksyms_getval_unlocked(const char *, const char *, unsigned long *, int); int ksyms_addsymtab(const char *, void *, vsize_t, char *, vsize_t); int ksyms_delsymtab(const char *); void ksyms_init(int, void *, void *);