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