From dad305a03a36aae739241fec3fb67e5ba121e5dc Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Tue, 1 Feb 2022 11:46:20 +0000 Subject: [PATCH 03/13] squash! driver(9): Fix synchronization of devsw_attach/lookup/detach. - Omit needless boolean indirection. --- sys/kern/subr_devsw.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/sys/kern/subr_devsw.c b/sys/kern/subr_devsw.c index 3e8ed1b17dbf..9d8c29d19fb2 100644 --- a/sys/kern/subr_devsw.c +++ b/sys/kern/subr_devsw.c @@ -104,7 +104,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.38 2017/11/07 18:35:57 christos Exp struct devswref { struct localcount *dr_lc; - bool dr_dynamic; }; /* XXX bdevsw, cdevsw, max_bdevsws, and max_cdevsws should be volatile */ @@ -300,7 +299,6 @@ bdevsw_attach(const struct bdevsw *devsw, devmajor_t *devmajor) lc = kmem_zalloc(sizeof(*lc), KM_SLEEP); localcount_init(lc); bdevswref[*devmajor].dr_lc = lc; - bdevswref[*devmajor].dr_dynamic = true; atomic_store_release(&bdevsw[*devmajor], devsw); @@ -364,7 +362,6 @@ cdevsw_attach(const struct cdevsw *devsw, devmajor_t *devmajor) lc = kmem_zalloc(sizeof(*lc), KM_SLEEP); localcount_init(lc); cdevswref[*devmajor].dr_lc = lc; - cdevswref[*devmajor].dr_dynamic = true; atomic_store_release(&cdevsw[*devmajor], devsw); @@ -424,7 +421,6 @@ devsw_detach_locked(const struct bdevsw *bdev, const struct cdevsw *cdev) localcount_fini(bdevswref[bi].dr_lc); kmem_free(bdevswref[bi].dr_lc, sizeof(*bdevswref[bi].dr_lc)); bdevswref[bi].dr_lc = NULL; - bdevswref[bi].dr_dynamic = false; } if (cdev != NULL) { localcount_drain(cdevswref[ci].dr_lc, @@ -432,7 +428,6 @@ devsw_detach_locked(const struct bdevsw *bdev, const struct cdevsw *cdev) localcount_fini(cdevswref[ci].dr_lc); kmem_free(cdevswref[ci].dr_lc, sizeof(*cdevswref[ci].dr_lc)); cdevswref[ci].dr_lc = NULL; - cdevswref[ci].dr_dynamic = false; } } @@ -494,10 +489,9 @@ bdevsw_lookup_acquire(dev_t dev, struct localcount **lcp) goto out; curbdevswref = atomic_load_consume(&bdevswref); - if (curbdevswref == NULL || !curbdevswref[bmajor].dr_dynamic) { + if (curbdevswref == NULL) { *lcp = NULL; - } else { - *lcp = curbdevswref[bmajor].dr_lc; + } else if ((*lcp = curbdevswref[bmajor].dr_lc) != NULL) { localcount_acquire(*lcp); } @@ -563,10 +557,9 @@ cdevsw_lookup_acquire(dev_t dev, struct localcount **lcp) goto out; curcdevswref = atomic_load_consume(&cdevswref); - if (curcdevswref == NULL || !curcdevswref[cmajor].dr_dynamic) { + if (curcdevswref == NULL) { *lcp = NULL; - } else { - *lcp = curcdevswref[cmajor].dr_lc; + } else if ((*lcp = curcdevswref[cmajor].dr_lc) != NULL) { localcount_acquire(*lcp); }