Module Name: src Committed By: mlelstv Date: Sun Aug 16 14:02:52 UTC 2015
Modified Files: src/sys/dev: ld.c ldvar.h Log Message: replace spl and tsleep with mutex and condvar. To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/dev/ld.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/ldvar.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/dev/ld.c diff -u src/sys/dev/ld.c:1.84 src/sys/dev/ld.c:1.85 --- src/sys/dev/ld.c:1.84 Wed Jul 22 10:32:16 2015 +++ src/sys/dev/ld.c Sun Aug 16 14:02:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ld.c,v 1.84 2015/07/22 10:32:16 skrll Exp $ */ +/* $NetBSD: ld.c,v 1.85 2015/08/16 14:02:52 mlelstv Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.84 2015/07/22 10:32:16 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.85 2015/08/16 14:02:52 mlelstv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -126,6 +126,7 @@ ldattach(struct ld_softc *sc) struct dk_softc *dksc = &sc->sc_dksc; mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); + cv_init(&sc->sc_drain, "lddrain"); if ((sc->sc_flags & LDF_ENABLED) == 0) { return; @@ -168,11 +169,10 @@ ldattach(struct ld_softc *sc) int ldadjqparam(struct ld_softc *sc, int xmax) { - int s; - s = splbio(); + mutex_enter(&sc->sc_mutex); sc->sc_maxqueuecnt = xmax; - splx(s); + mutex_exit(&sc->sc_mutex); return (0); } @@ -181,7 +181,7 @@ int ldbegindetach(struct ld_softc *sc, int flags) { struct dk_softc *dksc = &sc->sc_dksc; - int s, rv = 0; + int rv = 0; if ((sc->sc_flags & LDF_ENABLED) == 0) return (0); @@ -191,18 +191,16 @@ ldbegindetach(struct ld_softc *sc, int f if (rv != 0) return rv; - s = splbio(); + mutex_enter(&sc->sc_mutex); sc->sc_maxqueuecnt = 0; dk_detach(dksc); while (sc->sc_queuecnt > 0) { sc->sc_flags |= LDF_DRAIN; - rv = tsleep(&sc->sc_queuecnt, PRIBIO, "lddrn", 0); - if (rv) - break; + cv_wait(&sc->sc_drain, &sc->sc_mutex); } - splx(s); + mutex_exit(&sc->sc_mutex); return (rv); } @@ -211,27 +209,28 @@ void ldenddetach(struct ld_softc *sc) { struct dk_softc *dksc = &sc->sc_dksc; - int s, bmaj, cmaj, i, mn; + int bmaj, cmaj, i, mn; if ((sc->sc_flags & LDF_ENABLED) == 0) return; + mutex_enter(&sc->sc_mutex); + /* Wait for commands queued with the hardware to complete. */ if (sc->sc_queuecnt != 0) if (tsleep(&sc->sc_queuecnt, PRIBIO, "lddtch", 30 * hz)) printf("%s: not drained\n", dksc->sc_xname); - /* Locate the major numbers. */ - bmaj = bdevsw_lookup_major(&ld_bdevsw); - cmaj = cdevsw_lookup_major(&ld_cdevsw); - /* Kill off any queued buffers. */ - s = splbio(); bufq_drain(dksc->sc_bufq); - splx(s); + mutex_exit(&sc->sc_mutex); bufq_free(dksc->sc_bufq); + /* Locate the major numbers. */ + bmaj = bdevsw_lookup_major(&ld_bdevsw); + cmaj = cdevsw_lookup_major(&ld_cdevsw); + /* Nuke the vnodes for any open instances. */ for (i = 0; i < MAXPARTITIONS; i++) { mn = DISKMINOR(device_unit(dksc->sc_dev), i); @@ -263,6 +262,7 @@ ldenddetach(struct ld_softc *sc) if ((*sc->sc_flush)(sc, 0) != 0) aprint_error_dev(dksc->sc_dev, "unable to flush cache\n"); #endif + cv_destroy(&sc->sc_drain); mutex_destroy(&sc->sc_mutex); } Index: src/sys/dev/ldvar.h diff -u src/sys/dev/ldvar.h:1.24 src/sys/dev/ldvar.h:1.25 --- src/sys/dev/ldvar.h:1.24 Sun Jul 26 07:23:10 2015 +++ src/sys/dev/ldvar.h Sun Aug 16 14:02:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ldvar.h,v 1.24 2015/07/26 07:23:10 skrll Exp $ */ +/* $NetBSD: ldvar.h,v 1.25 2015/08/16 14:02:52 mlelstv Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -40,6 +40,7 @@ struct ld_softc { struct dk_softc sc_dksc; kmutex_t sc_mutex; + kcondvar_t sc_drain; krndsource_t sc_rnd_source; int sc_queuecnt; /* current h/w queue depth */