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 *);

Reply via email to