Module Name: src Committed By: matt Date: Thu Jan 17 14:36:36 UTC 2013
Modified Files: src/sys/kern: kern_ksyms.c Log Message: Add a separate bool to indicate a symbol table has been loaded. ksym_initted indicates whether the kmutex has been initted or not. Add __cacheline_aligned to the kmutex. To generate a diff of this commit: cvs rdiff -u -r1.68 -r1.69 src/sys/kern/kern_ksyms.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_ksyms.c diff -u src/sys/kern/kern_ksyms.c:1.68 src/sys/kern/kern_ksyms.c:1.69 --- src/sys/kern/kern_ksyms.c:1.68 Sun Nov 18 00:06:57 2012 +++ src/sys/kern/kern_ksyms.c Thu Jan 17 14:36:36 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ksyms.c,v 1.68 2012/11/18 00:06:57 chs Exp $ */ +/* $NetBSD: kern_ksyms.c,v 1.69 2013/01/17 14:36:36 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.68 2012/11/18 00:06:57 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.69 2013/01/17 14:36:36 matt Exp $"); #if defined(_KERNEL) && defined(_KERNEL_OPT) #include "opt_ddb.h" @@ -107,7 +107,8 @@ static uint32_t *ksyms_nmap = NULL; static int ksyms_maxlen; static bool ksyms_isopen; static bool ksyms_initted; -static kmutex_t ksyms_lock; +static bool ksyms_loaded; +static kmutex_t ksyms_lock __cacheline_aligned; static struct ksyms_symtab kernel_symtab; void ksymsattach(int); @@ -220,14 +221,17 @@ ksyms_init(void) { #ifdef SYMTAB_SPACE - if (!ksyms_initted && + if (!ksyms_loaded && strncmp(db_symtab, SYMTAB_FILLER, sizeof(SYMTAB_FILLER))) { ksyms_addsyms_elf(db_symtabsize, db_symtab, db_symtab + db_symtabsize); } #endif - mutex_init(&ksyms_lock, MUTEX_DEFAULT, IPL_NONE); + if (!ksyms_initted) { + mutex_init(&ksyms_lock, MUTEX_DEFAULT, IPL_NONE); + ksyms_initted = true; + } } /* @@ -409,7 +413,7 @@ addsymtab(const char *name, void *symsta membar_producer(); TAILQ_INSERT_TAIL(&ksyms_symtabs, tab, sd_queue); ksyms_sizes_calc(); - ksyms_initted = true; + ksyms_loaded = true; } /* @@ -574,7 +578,7 @@ ksyms_getval(const char *mod, const char { int rc; - if (!ksyms_initted) + if (!ksyms_loaded) return ENOENT; mutex_enter(&ksyms_lock); @@ -618,7 +622,7 @@ ksyms_mod_foreach(const char *mod, ksyms char *str; int symindx; - if (!ksyms_initted) + if (!ksyms_loaded) return ENOENT; mutex_enter(&ksyms_lock); @@ -666,7 +670,7 @@ ksyms_getname(const char **mod, const ch char *stable = NULL; int type, i, sz; - if (!ksyms_initted) + if (!ksyms_loaded) return ENOENT; TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) { @@ -763,7 +767,7 @@ ksyms_sift(char *mod, char *sym, int mod char *sb; int i, sz; - if (!ksyms_initted) + if (!ksyms_loaded) return ENOENT; TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) { @@ -919,7 +923,7 @@ static int ksymsopen(dev_t dev, int oflags, int devtype, struct lwp *l) { - if (minor(dev) != 0 || !ksyms_initted) + if (minor(dev) != 0 || !ksyms_loaded) return ENXIO; /*