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

Reply via email to