Module Name: src
Committed By: riastradh
Date: Tue Sep 7 16:56:13 UTC 2021
Modified Files:
src/sys/arch/sparc64/sparc64: machdep.c
src/sys/kern: kern_ksyms.c subr_csan.c subr_msan.c
src/sys/sys: ksyms.h
Log Message:
Revert "ksyms: Use pserialize(9) for kernel access to ksyms."
To generate a diff of this commit:
cvs rdiff -u -r1.301 -r1.302 src/sys/arch/sparc64/sparc64/machdep.c
cvs rdiff -u -r1.100 -r1.101 src/sys/kern/kern_ksyms.c
cvs rdiff -u -r1.11 -r1.12 src/sys/kern/subr_csan.c
cvs rdiff -u -r1.15 -r1.16 src/sys/kern/subr_msan.c
cvs rdiff -u -r1.40 -r1.41 src/sys/sys/ksyms.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/sparc64/machdep.c
diff -u src/sys/arch/sparc64/sparc64/machdep.c:1.301 src/sys/arch/sparc64/sparc64/machdep.c:1.302
--- src/sys/arch/sparc64/sparc64/machdep.c:1.301 Tue Sep 7 11:00:02 2021
+++ src/sys/arch/sparc64/sparc64/machdep.c Tue Sep 7 16:56:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.301 2021/09/07 11:00:02 riastradh Exp $ */
+/* $NetBSD: machdep.c,v 1.302 2021/09/07 16:56:13 riastradh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2019 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.301 2021/09/07 11:00:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.302 2021/09/07 16:56:13 riastradh Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -102,7 +102,6 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v
#include <sys/cpu.h>
#include <sys/module.h>
#include <sys/ksyms.h>
-#include <sys/pserialize.h>
#include <sys/exec_aout.h>
@@ -837,22 +836,17 @@ get_symbol_and_offset(const char **mod,
{
static char symbuf[256];
unsigned long symaddr;
- int s, error;
#if NKSYMS || defined(DDB) || defined(MODULAR)
- s = pserialize_read_enter();
if (ksyms_getname(mod, sym, pc,
KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY) == 0) {
- error = ksyms_getval(*mod, *sym, &symaddr,
- KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY);
- pserialize_read_exit(s);
- if (error)
+ if (ksyms_getval(*mod, *sym, &symaddr,
+ KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY) != 0)
goto failed;
*offset = (vaddr_t)(pc - symaddr);
return;
}
- pserialize_read_exit(s);
#endif
failed:
snprintf(symbuf, sizeof symbuf, "%llx", (unsigned long long)pc);
Index: src/sys/kern/kern_ksyms.c
diff -u src/sys/kern/kern_ksyms.c:1.100 src/sys/kern/kern_ksyms.c:1.101
--- src/sys/kern/kern_ksyms.c:1.100 Tue Sep 7 11:00:02 2021
+++ src/sys/kern/kern_ksyms.c Tue Sep 7 16:56:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_ksyms.c,v 1.100 2021/09/07 11:00:02 riastradh Exp $ */
+/* $NetBSD: kern_ksyms.c,v 1.101 2021/09/07 16:56:13 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.100 2021/09/07 11:00:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.101 2021/09/07 16:56:13 riastradh Exp $");
#if defined(_KERNEL) && defined(_KERNEL_OPT)
#include "opt_copy_symtab.h"
@@ -94,7 +94,6 @@ __KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c
#include <sys/ksyms.h>
#include <sys/kernel.h>
#include <sys/intr.h>
-#include <sys/pserialize.h>
#ifdef DDB
#include <ddb/db_output.h>
@@ -119,7 +118,6 @@ static bool ksyms_initted;
static bool ksyms_loaded;
static kmutex_t ksyms_lock __cacheline_aligned;
static kcondvar_t ksyms_cv;
-static pserialize_t ksyms_psz __read_mostly;
static struct ksyms_symtab kernel_symtab;
static void ksyms_hdr_init(const void *);
@@ -148,7 +146,6 @@ int ksyms_strsz;
int ksyms_ctfsz; /* this is not currently used by savecore(8) */
TAILQ_HEAD(ksyms_symtab_queue, ksyms_symtab) ksyms_symtabs =
TAILQ_HEAD_INITIALIZER(ksyms_symtabs);
-static struct pslist_head ksyms_symtabs_psz = PSLIST_INITIALIZER;
static int
ksyms_verify(const void *symstart, const void *strstart)
@@ -250,7 +247,6 @@ ksyms_init(void)
if (!ksyms_initted) {
mutex_init(&ksyms_lock, MUTEX_DEFAULT, IPL_NONE);
cv_init(&ksyms_cv, "ksyms");
- ksyms_psz = pserialize_create();
ksyms_initted = true;
}
}
@@ -453,19 +449,9 @@ addsymtab(const char *name, void *symsta
/*
* Publish the symtab. Do this at splhigh to ensure ddb never
* witnesses an inconsistent state of the queue, unless memory
- * is so corrupt that we crash in PSLIST_WRITER_INSERT_AFTER or
- * TAILQ_INSERT_TAIL.
+ * is so corrupt that we crash in TAILQ_INSERT_TAIL.
*/
- PSLIST_ENTRY_INIT(tab, sd_pslist);
s = splhigh();
- if (TAILQ_EMPTY(&ksyms_symtabs)) {
- PSLIST_WRITER_INSERT_HEAD(&ksyms_symtabs_psz, tab, sd_pslist);
- } else {
- struct ksyms_symtab *last;
-
- last = TAILQ_LAST(&ksyms_symtabs, ksyms_symtab_queue);
- PSLIST_WRITER_INSERT_AFTER(last, tab, sd_pslist);
- }
TAILQ_INSERT_TAIL(&ksyms_symtabs, tab, sd_queue);
splx(s);
@@ -601,9 +587,7 @@ ksyms_addsyms_explicit(void *ehdr, void
* "val" is a pointer to the corresponding value, if call succeeded.
* Returns 0 if success or ENOENT if no such entry.
*
- * If symp is nonnull, caller must hold ksyms_lock or module_lock, have
- * ksyms_opencnt nonzero, be in a pserialize read section, be in ddb
- * with all other CPUs quiescent.
+ * Call with ksyms_lock, unless known that the symbol table can't change.
*/
int
ksyms_getval_unlocked(const char *mod, const char *sym, Elf_Sym **symp,
@@ -611,61 +595,51 @@ ksyms_getval_unlocked(const char *mod, c
{
struct ksyms_symtab *st;
Elf_Sym *es;
- int s, error = ENOENT;
#ifdef KSYMS_DEBUG
if (ksyms_debug & FOLLOW_CALLS)
printf("%s: mod %s sym %s valp %p\n", __func__, mod, sym, val);
#endif
- s = pserialize_read_enter();
- PSLIST_READER_FOREACH(st, &ksyms_symtabs_psz, struct ksyms_symtab,
- sd_pslist) {
+ TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) {
if (mod != NULL && strcmp(st->sd_name, mod))
continue;
if ((es = findsym(sym, st, type)) != NULL) {
*val = es->st_value;
if (symp)
*symp = es;
- error = 0;
- break;
+ return 0;
}
}
- pserialize_read_exit(s);
- return error;
+ return ENOENT;
}
int
ksyms_getval(const char *mod, const char *sym, unsigned long *val, int type)
{
+ int rc;
if (!ksyms_loaded)
return ENOENT;
- /* No locking needed -- we read the table pserialized. */
- return ksyms_getval_unlocked(mod, sym, NULL, val, type);
+ mutex_enter(&ksyms_lock);
+ rc = ksyms_getval_unlocked(mod, sym, NULL, val, type);
+ mutex_exit(&ksyms_lock);
+ return rc;
}
-/*
- * ksyms_get_mod(mod)
- *
- * Return the symtab for the given module name. Caller must ensure
- * that the module cannot be unloaded until after this returns.
- */
struct ksyms_symtab *
ksyms_get_mod(const char *mod)
{
struct ksyms_symtab *st;
- int s;
- s = pserialize_read_enter();
- PSLIST_READER_FOREACH(st, &ksyms_symtabs_psz, struct ksyms_symtab,
- sd_pslist) {
+ mutex_enter(&ksyms_lock);
+ TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) {
if (mod != NULL && strcmp(st->sd_name, mod))
continue;
break;
}
- pserialize_read_exit(s);
+ mutex_exit(&ksyms_lock);
return st;
}
@@ -721,9 +695,7 @@ ksyms_mod_foreach(const char *mod, ksyms
* Get "mod" and "symbol" associated with an address.
* Returns 0 if success or ENOENT if no such entry.
*
- * Caller must hold ksyms_lock or module_lock, have ksyms_opencnt
- * nonzero, be in a pserialize read section, or be in ddb with all
- * other CPUs quiescent.
+ * Call with ksyms_lock, unless known that the symbol table can't change.
*/
int
ksyms_getname(const char **mod, const char **sym, vaddr_t v, int f)
@@ -738,8 +710,7 @@ ksyms_getname(const char **mod, const ch
if (!ksyms_loaded)
return ENOENT;
- PSLIST_READER_FOREACH(st, &ksyms_symtabs_psz, struct ksyms_symtab,
- sd_pslist) {
+ TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) {
if (v < st->sd_minsym || v > st->sd_maxsym)
continue;
sz = st->sd_symsize/sizeof(Elf_Sym);
@@ -824,21 +795,12 @@ ksyms_modunload(const char *name)
/*
* Remove the symtab. Do this at splhigh to ensure ddb never
* witnesses an inconsistent state of the queue, unless memory
- * is so corrupt that we crash in TAILQ_REMOVE or
- * PSLIST_WRITER_REMOVE.
+ * is so corrupt that we crash in TAILQ_REMOVE.
*/
s = splhigh();
TAILQ_REMOVE(&ksyms_symtabs, st, sd_queue);
- PSLIST_WRITER_REMOVE(st, sd_pslist);
splx(s);
- /*
- * And wait a grace period, in case there are any pserialized
- * readers in flight.
- */
- pserialize_perform(ksyms_psz);
- PSLIST_ENTRY_DESTROY(st, sd_pslist);
-
/* Recompute the ksyms sizes now that we've removed st. */
ksyms_sizes_calc();
mutex_exit(&ksyms_lock);
@@ -1180,7 +1142,7 @@ ksymsioctl(dev_t dev, u_long cmd, void *
unsigned long val;
int error = 0;
char *str = NULL;
- int len, s;
+ int len;
/* Read ksyms_maxlen only once while not holding the lock. */
len = ksyms_maxlen;
@@ -1211,9 +1173,8 @@ ksymsioctl(dev_t dev, u_long cmd, void *
* Use the in-kernel symbol lookup code for fast
* retreival of a symbol.
*/
- s = pserialize_read_enter();
- PSLIST_READER_FOREACH(st, &ksyms_symtabs_psz,
- struct ksyms_symtab, sd_pslist) {
+ mutex_enter(&ksyms_lock);
+ TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) {
if ((sym = findsym(str, st, KSYMS_ANY)) == NULL)
continue;
#ifdef notdef
@@ -1227,10 +1188,10 @@ ksymsioctl(dev_t dev, u_long cmd, void *
}
if (sym != NULL) {
memcpy(©, sym, sizeof(copy));
- pserialize_read_exit(s);
+ mutex_exit(&ksyms_lock);
error = copyout(©, okg->kg_sym, sizeof(Elf_Sym));
} else {
- pserialize_read_exit(s);
+ mutex_exit(&ksyms_lock);
error = ENOENT;
}
kmem_free(str, len);
@@ -1252,9 +1213,8 @@ ksymsioctl(dev_t dev, u_long cmd, void *
* Use the in-kernel symbol lookup code for fast
* retreival of a symbol.
*/
- s = pserialize_read_enter();
- PSLIST_READER_FOREACH(st, &ksyms_symtabs_psz,
- struct ksyms_symtab, sd_pslist) {
+ mutex_enter(&ksyms_lock);
+ TAILQ_FOREACH(st, &ksyms_symtabs, sd_queue) {
if ((sym = findsym(str, st, KSYMS_ANY)) == NULL)
continue;
#ifdef notdef
@@ -1271,7 +1231,7 @@ ksymsioctl(dev_t dev, u_long cmd, void *
} else {
error = ENOENT;
}
- pserialize_read_exit(s);
+ mutex_exit(&ksyms_lock);
kmem_free(str, len);
break;
Index: src/sys/kern/subr_csan.c
diff -u src/sys/kern/subr_csan.c:1.11 src/sys/kern/subr_csan.c:1.12
--- src/sys/kern/subr_csan.c:1.11 Tue Sep 7 11:00:02 2021
+++ src/sys/kern/subr_csan.c Tue Sep 7 16:56:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_csan.c,v 1.11 2021/09/07 11:00:02 riastradh Exp $ */
+/* $NetBSD: subr_csan.c,v 1.12 2021/09/07 16:56:13 riastradh Exp $ */
/*
* Copyright (c) 2019-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_csan.c,v 1.11 2021/09/07 11:00:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_csan.c,v 1.12 2021/09/07 16:56:13 riastradh Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -40,7 +40,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_csan.c,
#include <sys/types.h>
#include <sys/csan.h>
#include <sys/cpu.h>
-#include <sys/pserialize.h>
#ifdef KCSAN_PANIC
#define REPORT panic
@@ -95,9 +94,7 @@ static inline void
kcsan_report(csan_cell_t *new, cpuid_t newcpu, csan_cell_t *old, cpuid_t oldcpu)
{
const char *newsym, *oldsym;
- int s;
- s = pserialize_read_enter();
if (ksyms_getname(NULL, &newsym, (vaddr_t)new->pc, KSYMS_PROC) != 0) {
newsym = "Unknown";
}
@@ -113,7 +110,6 @@ kcsan_report(csan_cell_t *new, cpuid_t n
oldcpu,
(old->atomic ? "Atomic " : ""), (old->write ? "Write" : "Read"),
(void *)old->addr, old->size, (void *)old->pc, oldsym);
- pserialize_read_exit(s);
kcsan_md_unwind();
}
Index: src/sys/kern/subr_msan.c
diff -u src/sys/kern/subr_msan.c:1.15 src/sys/kern/subr_msan.c:1.16
--- src/sys/kern/subr_msan.c:1.15 Tue Sep 7 11:00:02 2021
+++ src/sys/kern/subr_msan.c Tue Sep 7 16:56:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_msan.c,v 1.15 2021/09/07 11:00:02 riastradh Exp $ */
+/* $NetBSD: subr_msan.c,v 1.16 2021/09/07 16:56:13 riastradh Exp $ */
/*
* Copyright (c) 2019-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.15 2021/09/07 11:00:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.16 2021/09/07 16:56:13 riastradh Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -152,7 +152,6 @@ kmsan_report_hook(const void *addr, size
uintptr_t ptr;
char buf[128];
int type;
- int s;
if (__predict_false(panicstr != NULL || db_active || kmsan_reporting))
return;
@@ -173,7 +172,6 @@ kmsan_report_hook(const void *addr, size
typename = kmsan_orig_name(type);
if (kmsan_md_is_pc(ptr)) {
- s = pserialize_read_enter();
if (ksyms_getname(&mod, &sym, (vaddr_t)ptr, KSYMS_PROC)) {
REPORT("MSan: Uninitialized %s Memory In %s "
"At Offset %zu/%zu, IP %p\n", typename, hook, off,
@@ -183,7 +181,6 @@ kmsan_report_hook(const void *addr, size
"At Offset %zu/%zu, From %s()\n", typename, hook,
off, size, sym);
}
- pserialize_read_exit(s);
} else {
var = (char *)ptr + 4;
strlcpy(buf, var, sizeof(buf));
@@ -211,7 +208,6 @@ kmsan_report_inline(msan_orig_t orig, un
uintptr_t ptr;
char buf[128];
int type;
- int s;
if (__predict_false(panicstr != NULL || db_active || kmsan_reporting))
return;
@@ -229,7 +225,6 @@ kmsan_report_inline(msan_orig_t orig, un
typename = kmsan_orig_name(type);
if (kmsan_md_is_pc(ptr)) {
- s = pserialize_read_enter();
if (ksyms_getname(&mod, &sym, (vaddr_t)ptr, KSYMS_PROC)) {
REPORT("MSan: Uninitialized %s Memory, "
"Origin %x\n", typename, orig);
@@ -237,7 +232,6 @@ kmsan_report_inline(msan_orig_t orig, un
REPORT("MSan: Uninitialized %s Memory "
"From %s()\n", typename, sym);
}
- pserialize_read_exit(s);
} else {
var = (char *)ptr + 4;
strlcpy(buf, var, sizeof(buf));
Index: src/sys/sys/ksyms.h
diff -u src/sys/sys/ksyms.h:1.40 src/sys/sys/ksyms.h:1.41
--- src/sys/sys/ksyms.h:1.40 Tue Sep 7 11:00:02 2021
+++ src/sys/sys/ksyms.h Tue Sep 7 16:56:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ksyms.h,v 1.40 2021/09/07 11:00:02 riastradh Exp $ */
+/* $NetBSD: ksyms.h,v 1.41 2021/09/07 16:56:13 riastradh Exp $ */
/*
* Copyright (c) 2001, 2003 Anders Magnusson ([email protected]).
@@ -39,10 +39,6 @@
#include <sys/ioccom.h>
#include <sys/queue.h>
-#ifdef _KERNEL
-#include <sys/pslist.h>
-#endif
-
struct ksyms_symtab {
TAILQ_ENTRY(ksyms_symtab) sd_queue; /* All active tables */
const char *sd_name; /* Name of this table */
@@ -59,10 +55,6 @@ struct ksyms_symtab {
int sd_ctfsize; /* Size in bytes of CTF contents */
uint32_t *sd_nmap; /* Name map for sorted symbols */
int sd_nmapsize; /* Total span of map */
-
-#ifdef _KERNEL
- struct pslist_entry sd_pslist;
-#endif
};
/*