Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern autoconf(9): Take kernel lock on various entries in...
details: https://anonhg.NetBSD.org/src/rev/3b8d9f5c8a19
branches: trunk
changeset: 379609:3b8d9f5c8a19
user: riastradh <riastradh%NetBSD.org@localhost>
date: Sat Jun 12 12:11:49 2021 +0000
description:
autoconf(9): Take kernel lock on various entries into autoconf.
Most of autoconf still tacitly assumes the kernel lock is held.
diffstat:
sys/kern/subr_autoconf.c | 39 ++++++++++++++++++++++++++++-----------
1 files changed, 28 insertions(+), 11 deletions(-)
diffs (101 lines):
diff -r c7a6735f3ca8 -r 3b8d9f5c8a19 sys/kern/subr_autoconf.c
--- a/sys/kern/subr_autoconf.c Sat Jun 12 12:11:38 2021 +0000
+++ b/sys/kern/subr_autoconf.c Sat Jun 12 12:11:49 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_autoconf.c,v 1.280 2021/04/28 03:21:57 thorpej Exp $ */
+/* $NetBSD: subr_autoconf.c,v 1.281 2021/06/12 12:11:49 riastradh Exp $ */
/*
* Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -79,7 +79,7 @@
#define __SUBR_AUTOCONF_PRIVATE /* see <sys/device.h> */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.280 2021/04/28 03:21:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.281 2021/06/12 12:11:49 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -1285,11 +1285,15 @@ device_t
config_rootfound(const char *rootname, void *aux)
{
cfdata_t cf;
-
+ device_t dev = NULL;
+
+ KERNEL_LOCK(1, NULL);
if ((cf = config_rootsearch(NULL, rootname, aux)) != NULL)
- return config_attach(ROOT, cf, aux, NULL, CFARG_EOL);
- aprint_error("root device %s not configured\n", rootname);
- return NULL;
+ dev = config_attach(ROOT, cf, aux, NULL, CFARG_EOL);
+ else
+ aprint_error("root device %s not configured\n", rootname);
+ KERNEL_UNLOCK_ONE(NULL);
+ return dev;
}
/* just like sprintf(buf, "%d") except that it works from the end */
@@ -2046,8 +2050,10 @@ config_detach_all(int how)
bool progress = false;
int flags;
+ KERNEL_LOCK(1, NULL);
+
if ((how & (RB_NOSYNC|RB_DUMP)) != 0)
- return false;
+ goto out;
if ((how & RB_POWERDOWN) == RB_POWERDOWN)
flags = DETACH_SHUTDOWN | DETACH_POWEROFF;
@@ -2063,6 +2069,8 @@ config_detach_all(int how)
} else
aprint_debug("failed.");
}
+
+out: KERNEL_UNLOCK_ONE(NULL);
return progress;
}
@@ -2286,6 +2294,9 @@ int
config_finalize_register(device_t dev, int (*fn)(device_t))
{
struct finalize_hook *f;
+ int error = 0;
+
+ KERNEL_LOCK(1, NULL);
/*
* If finalization has already been done, invoke the
@@ -2294,13 +2305,15 @@ config_finalize_register(device_t dev, i
if (config_finalize_done) {
while ((*fn)(dev) != 0)
/* loop */ ;
- return 0;
+ goto out;
}
/* Ensure this isn't already on the list. */
TAILQ_FOREACH(f, &config_finalize_list, f_list) {
- if (f->f_func == fn && f->f_dev == dev)
- return EEXIST;
+ if (f->f_func == fn && f->f_dev == dev) {
+ error = EEXIST;
+ goto out;
+ }
}
f = kmem_alloc(sizeof(*f), KM_SLEEP);
@@ -2308,7 +2321,11 @@ config_finalize_register(device_t dev, i
f->f_dev = dev;
TAILQ_INSERT_TAIL(&config_finalize_list, f, f_list);
- return 0;
+ /* Success! */
+ error = 0;
+
+out: KERNEL_UNLOCK_ONE(NULL);
+ return error;
}
void
Home |
Main Index |
Thread Index |
Old Index