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(&copy, sym, sizeof(copy));
-			pserialize_read_exit(s);
+			mutex_exit(&ksyms_lock);
 			error = copyout(&copy, 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 (ra...@ludd.luth.se).
@@ -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
 };
 
 /*

Reply via email to