diff options
author | jhb <jhb@FreeBSD.org> | 2005-03-31 22:49:31 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2005-03-31 22:49:31 +0000 |
commit | 31fedfa192ea7ed8909d31f6a4d1500343faf2ae (patch) | |
tree | 02ab30952ddc34b93627c6ac1ec859e3978a344f /sys/kern | |
parent | 0deac201a88aeb3c40ec379ee92a9c5759182499 (diff) | |
download | FreeBSD-src-31fedfa192ea7ed8909d31f6a4d1500343faf2ae.zip FreeBSD-src-31fedfa192ea7ed8909d31f6a4d1500343faf2ae.tar.gz |
- Denote a few places where kobj class references are manipulated without
holding the appropriate lock.
- Add a comment explaining why we bump a driver's kobj class reference
when loading a module.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_linker.c | 7 | ||||
-rw-r--r-- | sys/kern/subr_bus.c | 3 |
2 files changed, 6 insertions, 4 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 49ad88b..53479e1 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -141,13 +141,14 @@ linker_add_class(linker_class_t lc) { /* - * We disallow any class registration passt SI_ORDER_ANY - * of SI_SUB_KLD. + * We disallow any class registration past SI_ORDER_ANY + * of SI_SUB_KLD. We bump the reference count to keep the + * ops from being freed. */ if (linker_no_more_classes == 1) return (EPERM); kobj_class_compile((kobj_class_t) lc); - ((kobj_class_t)lc)->refs++; /* prevent ops being freed */ + ((kobj_class_t)lc)->refs++; /* XXX: kobj_mtx */ TAILQ_INSERT_TAIL(&classes, lc, link); return (0); } diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 9edcbae..306e0d3 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -850,7 +850,7 @@ devclass_add_driver(devclass_t dc, driver_t *driver) dl->driver = driver; TAILQ_INSERT_TAIL(&dc->drivers, dl, link); - driver->refs++; + driver->refs++; /* XXX: kobj_mtx */ /* * Call BUS_DRIVER_ADDED for any existing busses in this class. @@ -930,6 +930,7 @@ devclass_delete_driver(devclass_t busclass, driver_t *driver) TAILQ_REMOVE(&busclass->drivers, dl, link); free(dl, M_BUS); + /* XXX: kobj_mtx */ driver->refs--; if (driver->refs == 0) kobj_class_free((kobj_class_t) driver); |