Module Name:    src
Committed By:   jdolecek
Date:           Mon Oct 24 17:14:27 UTC 2016

Modified Files:
        src/sys/dev: dksubr.c dkvar.h

Log Message:
revert 1.90 of dksubr.c and change sc_deferred back to simple pointer; the
global sc_busy flag guards against race so it's not actually necessary, and
this place is unlikely to need to be parallelized in near future

discussed with mlelstv@


To generate a diff of this commit:
cvs rdiff -u -r1.90 -r1.91 src/sys/dev/dksubr.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/dkvar.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/dksubr.c
diff -u src/sys/dev/dksubr.c:1.90 src/sys/dev/dksubr.c:1.91
--- src/sys/dev/dksubr.c:1.90	Sat Oct 22 22:32:33 2016
+++ src/sys/dev/dksubr.c	Mon Oct 24 17:14:27 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.90 2016/10/22 22:32:33 jdolecek Exp $ */
+/* $NetBSD: dksubr.c,v 1.91 2016/10/24 17:14:27 jdolecek Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.90 2016/10/22 22:32:33 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.91 2016/10/24 17:14:27 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -105,8 +105,6 @@ dk_attach(struct dk_softc *dksc)
 	/* Attach the device into the rnd source list. */
 	rnd_attach_source(&dksc->sc_rnd_source, dksc->sc_xname,
 	    RND_TYPE_DISK, RND_FLAG_DEFAULT);
-
-	TAILQ_INIT(&dksc->sc_deferred);
 }
 
 void
@@ -380,27 +378,25 @@ dk_start(struct dk_softc *dksc, struct b
 	 *
 	 * So when a diskstart fails, the buffer is saved
 	 * and tried again before the next buffer is fetched.
-	 * dk_drain() handles flushing of a saved buffer(s).
+	 * dk_drain() handles flushing of a saved buffer.
 	 *
 	 * This keeps order of I/O operations, unlike bufq_put.
 	 */
 
-	for(;;) {
-		bp = TAILQ_FIRST(&dksc->sc_deferred);
-		if (__predict_false(bp != NULL))
-			TAILQ_REMOVE(&dksc->sc_deferred, bp, b_actq);
-		else {
-			bp = bufq_get(dksc->sc_bufq);
-			if (bp == NULL)
-				break;
-		}
+	bp = dksc->sc_deferred;
+	dksc->sc_deferred = NULL;
+
+	if (bp == NULL)
+		bp = bufq_get(dksc->sc_bufq);
+
+	while (bp != NULL) {
 
 		disk_busy(&dksc->sc_dkdev);
 		mutex_exit(&dksc->sc_iolock);
 		error = dkd->d_diskstart(dksc->sc_dev, bp);
 		mutex_enter(&dksc->sc_iolock);
 		if (error == EAGAIN) {
-			TAILQ_INSERT_TAIL(&dksc->sc_deferred, bp, b_actq);
+			dksc->sc_deferred = bp;
 			disk_unbusy(&dksc->sc_dkdev, 0, (bp->b_flags & B_READ));
 			break;
 		}
@@ -410,6 +406,8 @@ dk_start(struct dk_softc *dksc, struct b
 			bp->b_resid = bp->b_bcount;
 			dk_done1(dksc, bp, false);
 		}
+
+		bp = bufq_get(dksc->sc_bufq);
 	}
 
 	dksc->sc_busy = false;
@@ -453,8 +451,9 @@ dk_drain(struct dk_softc *dksc)
 	struct buf *bp;
 
 	mutex_enter(&dksc->sc_iolock);
-	while ((bp = TAILQ_FIRST(&dksc->sc_deferred)) != NULL) {
-		TAILQ_REMOVE(&dksc->sc_deferred, bp, b_actq);
+	bp = dksc->sc_deferred;
+	dksc->sc_deferred = NULL;
+	if (bp != NULL) {
 		bp->b_error = EIO;
 		bp->b_resid = bp->b_bcount;
 		biodone(bp); 

Index: src/sys/dev/dkvar.h
diff -u src/sys/dev/dkvar.h:1.26 src/sys/dev/dkvar.h:1.27
--- src/sys/dev/dkvar.h:1.26	Sat Oct 22 22:32:33 2016
+++ src/sys/dev/dkvar.h	Mon Oct 24 17:14:27 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: dkvar.h,v 1.26 2016/10/22 22:32:33 jdolecek Exp $ */
+/* $NetBSD: dkvar.h,v 1.27 2016/10/24 17:14:27 jdolecek Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -49,7 +49,7 @@ struct dk_softc {
 	kmutex_t		 sc_iolock;	/* protects buffer queue */
 	struct bufq_state	*sc_bufq;	/* buffer queue */
 	int			 sc_dtype;	/* disk type */
-	TAILQ_HEAD(, buf)	 sc_deferred;	/* retry after start failed */
+	struct buf		*sc_deferred;	/* retry after start failed */
 	bool			 sc_busy;	/* processing buffers */
 	krndsource_t		 sc_rnd_source;	/* entropy source */
 };

Reply via email to