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