Index: arch/i386/conf/GENERIC =================================================================== RCS file: /cvsroot/syssrc/sys/arch/i386/conf/GENERIC,v retrieving revision 1.507 diff -u -r1.507 GENERIC --- arch/i386/conf/GENERIC 2002/08/12 03:28:52 1.507 +++ arch/i386/conf/GENERIC 2002/09/06 21:02:03 @@ -45,6 +45,8 @@ # delay between "rebooting ..." message and hardware reset, in milliseconds #options CPURESET_DELAY=2000 +options SD_CLUSTER + # This option allows you to force a serial console at the specified # I/O address. see console(4) for details. #options CONSDEVNAME="\"com\"",CONADDR=0x2f8,CONSPEED=57600 Index: conf/files =================================================================== RCS file: /cvsroot/syssrc/sys/conf/files,v retrieving revision 1.549 diff -u -r1.549 files --- conf/files 2002/08/28 07:19:58 1.549 +++ conf/files 2002/09/06 21:02:32 @@ -116,6 +116,14 @@ # defparam opt_bufcache.h BUFCACHE BUFPAGES +# +# i/o clustering options +# +defflag opt_cluster.h CLUSTER_DEBUG +defparam opt_cluster.h MAX_CLUSTERS +defparam opt_cluster.h MAX_CLUSTEREDVA +defflag opt_cluster.h CLUSTER_STATS + # userconf # defflag USERCONF @@ -1027,6 +1039,7 @@ file dev/vnd.c vnd needs-flag file kern/core_elf32.c exec_elf32 file kern/core_elf64.c exec_elf64 +file kern/subr_cluster.c sd_cluster | wd_cluster file kern/core_netbsd.c file kern/cnmagic.c file kern/exec_aout.c exec_aout Index: dev/ata/files.ata =================================================================== RCS file: /cvsroot/syssrc/sys/dev/ata/files.ata,v retrieving revision 1.5 diff -u -r1.5 files.ata --- dev/ata/files.ata 2001/02/24 01:59:47 1.5 +++ dev/ata/files.ata 2002/09/06 21:02:33 @@ -6,6 +6,8 @@ # appropriate devices. # ATA disks +defflag opt_ata.h WDCDEBUG WD_CLUSTER + device wd: disk attach wd at ata file dev/ata/wd.c wd needs-flag Index: dev/ata/wd.c =================================================================== RCS file: /cvsroot/syssrc/sys/dev/ata/wd.c,v retrieving revision 1.224 diff -u -r1.224 wd.c --- dev/ata/wd.c 2002/07/21 15:32:17 1.224 +++ dev/ata/wd.c 2002/09/06 21:02:35 @@ -68,6 +68,10 @@ #include __KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.224 2002/07/21 15:32:17 hannken Exp $"); +#if defined(_KERNEL_OPT) +#include "opt_ata.h" +#endif + #ifndef WDCDEBUG #define WDCDEBUG #endif /* WDCDEBUG */ @@ -116,6 +120,15 @@ #define WDLABELDEV(dev) (MAKEWDDEV(major(dev), WDUNIT(dev), RAW_PART)) +#ifdef WD_CLUSTER +static int dowdcluster = 1; +#define WDBUFQ_GET(bs, s) dowdcluster ? cluster((bs), (s)) : BUFQ_GET(bs) +#else +#define WDBUFQ_GET(bs, s) BUFQ_GET(bs) +#endif + +#define WDBUFQ_PUT(bs, bp) BUFQ_PUT(bs, bp) + #define DEBUG_INTR 0x01 #define DEBUG_XFERS 0x02 #define DEBUG_STATUS 0x04 @@ -268,6 +281,9 @@ callout_init(&wd->sc_restart_ch); bufq_alloc(&wd->sc_q, BUFQ_DISKSORT|BUFQ_SORT_RAWBLOCK); +#ifdef WD_CLUSTER + cluster_init(); +#endif wd->atabus = adev->adev_bustype; wd->openings = adev->adev_openings; @@ -411,7 +427,7 @@ s = splbio(); /* Kill off any queued buffers. */ - while ((bp = BUFQ_GET(&sc->sc_q)) != NULL) { + while ((bp = WDBUFQ_GET(&sc->sc_q, 0)) != NULL) { bp->b_error = EIO; bp->b_flags |= B_ERROR; bp->b_resid = bp->b_bcount; @@ -501,9 +517,14 @@ bp->b_rawblkno = blkno; +#ifdef WD_CLUSTER + if (dowdcluster) + cluster_init_buf(bp); +#endif + /* Queue transfer on drive, activate drive and controller if idle. */ s = splbio(); - BUFQ_PUT(&wd->sc_q, bp); + WDBUFQ_PUT(&wd->sc_q, bp); wdstart(wd); splx(s); return; @@ -523,6 +544,7 @@ void *arg; { struct wd_softc *wd = arg; + struct disklabel *lp = wd->sc_dk.dk_label; struct buf *bp = NULL; WDCDEBUG_PRINT(("wdstart %s\n", wd->sc_dev.dv_xname), @@ -530,7 +552,7 @@ while (wd->openings > 0) { /* Is there a buf for us ? */ - if ((bp = BUFQ_GET(&wd->sc_q)) == NULL) + if ((bp = WDBUFQ_GET(&wd->sc_q, lp->d_secsize)) == NULL) return; /* Index: dev/scsipi/files.scsipi =================================================================== RCS file: /cvsroot/syssrc/sys/dev/scsipi/files.scsipi,v retrieving revision 1.32 diff -u -r1.32 files.scsipi --- dev/scsipi/files.scsipi 2002/05/16 02:59:57 1.32 +++ dev/scsipi/files.scsipi 2002/09/06 21:02:44 @@ -6,6 +6,7 @@ defflag opt_scsi.h SCSIVERBOSE ST_ENABLE_EARLYWARN SES_ENABLE_PASSTHROUGH SCSI_OLD_NOINQUIRY + SD_CLUSTER defparam opt_scsi.h ST_MOUNT_DELAY SDRETRIES SD_IO_TIMEOUT defflag opt_scsipi_debug.h SCSIPI_DEBUG Index: dev/scsipi/sd.c =================================================================== RCS file: /cvsroot/syssrc/sys/dev/scsipi/sd.c,v retrieving revision 1.186 diff -u -r1.186 sd.c --- dev/scsipi/sd.c 2002/08/30 15:43:38 1.186 +++ dev/scsipi/sd.c 2002/09/06 21:02:46 @@ -56,7 +56,9 @@ #include __KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.186 2002/08/30 15:43:38 hannken Exp $"); +#if defined(_KERNEL_OPT) #include "opt_scsi.h" +#endif #include "rnd.h" #include @@ -96,6 +98,16 @@ #define SDLABELDEV(dev) (MAKESDDEV(major(dev), SDUNIT(dev), RAW_PART)) +#ifdef SD_CLUSTER +static int dosdcluster = 1; +#define SDBUFQ_GET(bs, s) dosdcluster ? cluster((bs), (s)) : BUFQ_GET(bs) +#else +#define SDBUFQ_GET(bs, s) BUFQ_GET(bs) +#endif + +#define SDBUFQ_PUT(bs, bp) BUFQ_PUT(bs, bp) + + int sdlock __P((struct sd_softc *)); void sdunlock __P((struct sd_softc *)); void sdminphys __P((struct buf *)); @@ -135,6 +147,9 @@ SC_DEBUG(periph, SCSIPI_DB2, ("sdattach: ")); bufq_alloc(&sd->buf_queue, BUFQ_DISKSORT|BUFQ_SORT_RAWBLOCK); +#ifdef SD_CLUSTER + cluster_init(); +#endif /* * Store information needed to contact our base driver @@ -269,7 +284,7 @@ s = splbio(); /* Kill off any queued buffers. */ - while ((bp = BUFQ_GET(&sd->buf_queue)) != NULL) { + while ((bp = SDBUFQ_GET(&sd->buf_queue, 0)) != NULL) { bp->b_error = EIO; bp->b_flags |= B_ERROR; bp->b_resid = bp->b_bcount; @@ -560,6 +575,7 @@ return (0); } + /* * Actually translate the requested transfer into one the physical driver * can understand. The transfer is described by a buf and will include @@ -637,6 +653,10 @@ bp->b_rawblkno = blkno; +#ifdef SD_CLUSTER + if (dosdcluster) + cluster_init_buf(bp); +#endif s = splbio(); /* @@ -645,7 +665,7 @@ * XXX Only do disksort() if the current operating mode does not * XXX include tagged queueing. */ - BUFQ_PUT(&sd->buf_queue, bp); + SDBUFQ_PUT(&sd->buf_queue, bp); /* * Tell the device to get going on the transfer if it's @@ -715,7 +735,7 @@ /* * See if there is a buf with work for us to do.. */ - if ((bp = BUFQ_GET(&sd->buf_queue)) == NULL) + if ((bp = SDBUFQ_GET(&sd->buf_queue, lp->d_secsize)) == NULL) return; /* Index: sys/buf.h =================================================================== RCS file: /cvsroot/syssrc/sys/sys/buf.h,v retrieving revision 1.54 diff -u -r1.54 buf.h --- sys/buf.h 2002/08/30 19:21:14 1.54 +++ sys/buf.h 2002/09/06 21:02:54 @@ -125,6 +125,10 @@ #define BUFQ_PEEK(bufq) \ (*(bufq)->bq_get)((bufq), 0) /* Get buffer from queue */ +void cluster_init __P((void)); +void cluster_init_buf __P((struct buf *)); +struct buf *cluster __P((struct bufq_state *, u_int32_t)); + #endif /* _KERNEL */ /*