Module Name: src Committed By: tsutsui Date: Wed Sep 1 15:08:22 UTC 2010
Modified Files: src/sys/arch/dreamcast/dev: gdrom.c Log Message: - use bufq(9) - account busy counter of disk(9) To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/sys/arch/dreamcast/dev/gdrom.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/dreamcast/dev/gdrom.c diff -u src/sys/arch/dreamcast/dev/gdrom.c:1.29 src/sys/arch/dreamcast/dev/gdrom.c:1.30 --- src/sys/arch/dreamcast/dev/gdrom.c:1.29 Wed Sep 1 12:25:27 2010 +++ src/sys/arch/dreamcast/dev/gdrom.c Wed Sep 1 15:08:22 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: gdrom.c,v 1.29 2010/09/01 12:25:27 tsutsui Exp $ */ +/* $NetBSD: gdrom.c,v 1.30 2010/09/01 15:08:22 tsutsui Exp $ */ /*- * Copyright (c) 2001 Marcus Comstedt @@ -33,13 +33,14 @@ */ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: gdrom.c,v 1.29 2010/09/01 12:25:27 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gdrom.c,v 1.30 2010/09/01 15:08:22 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/device.h> #include <sys/buf.h> +#include <sys/bufq.h> #include <sys/ioctl.h> #include <sys/fcntl.h> #include <sys/disklabel.h> @@ -74,10 +75,12 @@ struct gdrom_softc { device_t sc_dev; /* generic device info */ - struct disk dkdev; /* generic disk info */ + struct disk sc_dk; /* generic disk info */ + struct bufq_state *sc_bufq; /* device buffer queue */ struct buf curbuf; /* state of current I/O operation */ int is_open, is_busy; + bool is_active; int openpart_start; /* start sector of currently open partition */ int cmd_active; @@ -126,6 +129,7 @@ int gdrom_read_sectors(struct gdrom_softc *, void *, int, int, int *); int gdrom_mount_disk(struct gdrom_softc *); int gdrom_intr(void *); +void gdrom_start(struct gdrom_softc *); int gdrom_getstat(void) { @@ -389,11 +393,13 @@ sc = device_private(self); sc->sc_dev = self; + bufq_alloc(&sc->sc_bufq, "disksort", BUFQ_SORT_RAWBLOCK); + /* * Initialize and attach the disk structure. */ - disk_init(&sc->dkdev, device_xname(self), &gdromdkdriver); - disk_attach(&sc->dkdev); + disk_init(&sc->sc_dk, device_xname(self), &gdromdkdriver); + disk_attach(&sc->sc_dk); /* * reenable disabled drive @@ -475,7 +481,7 @@ gdromstrategy(struct buf *bp) { struct gdrom_softc *sc; - int s, unit, error, resid; + int s, unit; #ifdef GDROMDEBUG printf("GDROM: strategy\n"); #endif @@ -494,19 +500,10 @@ bp->b_bcount>>11, bp->b_bcount); #endif s = splbio(); - while (sc->is_busy) - tsleep(&sc->is_busy, PRIBIO, "gdbusy", 0); - sc->is_busy = 1; + bufq_put(sc->sc_bufq, bp); splx(s); - - if ((error = gdrom_read_sectors(sc, bp->b_data, bp->b_rawblkno, - bp->b_bcount >> 11, &resid))) - bp->b_error = error; - - sc->is_busy = 0; - wakeup(&sc->is_busy); - bp->b_resid = resid; - biodone(bp); + if (!sc->is_active) + gdrom_start(sc); return; done: @@ -514,6 +511,48 @@ biodone(bp); } +void +gdrom_start(struct gdrom_softc *sc) +{ + struct buf *bp; + int error, resid, s; + + sc->is_active = true; + + for (;;) { + s = splbio(); + bp = bufq_get(sc->sc_bufq); + if (bp == NULL) { + splx(s); + break; + } + + while (sc->is_busy) + tsleep(&sc->is_busy, PRIBIO, "gdbusy", 0); + sc->is_busy = 1; + disk_busy(&sc->sc_dk); + splx(s); + + error = gdrom_read_sectors(sc, bp->b_data, bp->b_rawblkno, + bp->b_bcount >> 11, &resid); + bp->b_error = error; + bp->b_resid = resid; + if (error != 0) + bp->b_resid = bp->b_bcount; + + sc->is_busy = 0; + wakeup(&sc->is_busy); + + s = splbio(); + disk_unbusy(&sc->sc_dk, bp->b_bcount - bp->b_resid, + (bp->b_flags & B_READ) != 0); + splx(s); + biodone(bp); + } + + sc->is_active = false; +} + int gdromioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) {