Module Name: src
Committed By: mlelstv
Date: Mon Dec 21 12:33:13 UTC 2015
Modified Files:
src/sys/dev: dksubr.c dkvar.h
Log Message:
support deferral of diskstart to a separate thread.
To generate a diff of this commit:
cvs rdiff -u -r1.84 -r1.85 src/sys/dev/dksubr.c
cvs rdiff -u -r1.24 -r1.25 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.84 src/sys/dev/dksubr.c:1.85
--- src/sys/dev/dksubr.c:1.84 Mon Dec 21 12:30:29 2015
+++ src/sys/dev/dksubr.c Mon Dec 21 12:33:12 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.84 2015/12/21 12:30:29 mlelstv Exp $ */
+/* $NetBSD: dksubr.c,v 1.85 2015/12/21 12:33:12 mlelstv 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.84 2015/12/21 12:30:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.85 2015/12/21 12:33:12 mlelstv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -276,8 +276,8 @@ done:
return bp->b_error;
}
-void
-dk_strategy(struct dk_softc *dksc, struct buf *bp)
+static int
+dk_strategy1(struct dk_softc *dksc, struct buf *bp)
{
int error;
@@ -288,21 +288,69 @@ dk_strategy(struct dk_softc *dksc, struc
DPRINTF_FOLLOW(("%s: not inited\n", __func__));
bp->b_error = ENXIO;
biodone(bp);
- return;
+ return 1;
}
error = dk_translate(dksc, bp);
if (error >= 0) {
biodone(bp);
- return;
+ return 1;
}
+ return 0;
+}
+
+void
+dk_strategy(struct dk_softc *dksc, struct buf *bp)
+{
+ int error;
+
+ error = dk_strategy1(dksc, bp);
+ if (error)
+ return;
+
/*
* Queue buffer and start unit
*/
dk_start(dksc, bp);
}
+int
+dk_strategy_defer(struct dk_softc *dksc, struct buf *bp)
+{
+ int error;
+
+ error = dk_strategy1(dksc, bp);
+ if (error)
+ return error;
+
+ /*
+ * Queue buffer only
+ */
+ mutex_enter(&dksc->sc_iolock);
+ bufq_put(dksc->sc_bufq, bp);
+ mutex_exit(&dksc->sc_iolock);
+
+ return 0;
+}
+
+int
+dk_strategy_pending(struct dk_softc *dksc)
+{
+ struct buf *bp;
+
+ if (!(dksc->sc_flags & DKF_INITED)) {
+ DPRINTF_FOLLOW(("%s: not inited\n", __func__));
+ return 0;
+ }
+
+ mutex_enter(&dksc->sc_iolock);
+ bp = bufq_peek(dksc->sc_bufq);
+ mutex_exit(&dksc->sc_iolock);
+
+ return bp != NULL;
+}
+
void
dk_start(struct dk_softc *dksc, struct buf *bp)
{
Index: src/sys/dev/dkvar.h
diff -u src/sys/dev/dkvar.h:1.24 src/sys/dev/dkvar.h:1.25
--- src/sys/dev/dkvar.h:1.24 Fri Aug 28 17:41:49 2015
+++ src/sys/dev/dkvar.h Mon Dec 21 12:33:12 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dkvar.h,v 1.24 2015/08/28 17:41:49 mlelstv Exp $ */
+/* $NetBSD: dkvar.h,v 1.25 2015/12/21 12:33:12 mlelstv Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -92,6 +92,8 @@ int dk_open(struct dk_softc *, dev_t,
int dk_close(struct dk_softc *, dev_t,
int, int, struct lwp *);
void dk_strategy(struct dk_softc *, struct buf *);
+int dk_strategy_defer(struct dk_softc *, struct buf *);
+int dk_strategy_pending(struct dk_softc *);
int dk_discard(struct dk_softc *, dev_t, off_t, off_t);
void dk_start(struct dk_softc *, struct buf *);
void dk_done(struct dk_softc *, struct buf *);