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 */