diff options
author | 2004-01-21 21:00:14 +0000 | |
---|---|---|
committer | 2004-01-21 21:00:14 +0000 | |
commit | 4dfdfe5546b4720a815fc4a3b76007d51a50f1cd (patch) | |
tree | 67428b5c1d9bd69c49f0d6b5d5d6644b6f6cbb92 | |
parent | Prototype llabs(3). Forgotten commit gathering bit rot in my tree... (diff) | |
download | wireguard-openbsd-4dfdfe5546b4720a815fc4a3b76007d51a50f1cd.tar.xz wireguard-openbsd-4dfdfe5546b4720a815fc4a3b76007d51a50f1cd.zip |
dynamic bufq support. basically a nullop. ok grange@
-rw-r--r-- | sys/dev/ata/wd.c | 14 | ||||
-rw-r--r-- | sys/kern/subr_disk.c | 22 | ||||
-rw-r--r-- | sys/sys/buf.h | 17 |
3 files changed, 38 insertions, 15 deletions
diff --git a/sys/dev/ata/wd.c b/sys/dev/ata/wd.c index 092f98bea5a..8f7d4f75be2 100644 --- a/sys/dev/ata/wd.c +++ b/sys/dev/ata/wd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wd.c,v 1.36 2004/01/16 21:00:57 grange Exp $ */ +/* $OpenBSD: wd.c,v 1.37 2004/01/21 21:00:14 tedu Exp $ */ /* $NetBSD: wd.c,v 1.193 1999/02/28 17:15:27 explorer Exp $ */ /* @@ -134,7 +134,7 @@ struct wd_softc { /* General disk infos */ struct device sc_dev; struct disk sc_dk; - struct bufq_default sc_q; + struct bufq *sc_q; /* IDE disk soft states */ struct ata_bio sc_wdc_bio; /* current transfer */ struct buf *sc_bp; /* buf being transferred */ @@ -264,8 +264,7 @@ wdattach(struct device *parent, struct device *self, void *aux) char buf[41], c, *p, *q; WDCDEBUG_PRINT(("wdattach\n"), DEBUG_FUNCS | DEBUG_PROBE); - wd->sc_q.bufq.bufq_get = bufq_default_get; - wd->sc_q.bufq.bufq_add = bufq_default_add; + wd->sc_q = BUFQ_ALLOC(0); wd->openings = aa_link->aa_openings; wd->drvp = aa_link->aa_drv_data; @@ -405,7 +404,7 @@ wddetach(struct device *self, int flags) /* Remove unprocessed buffers from queue */ s = splbio(); - while ((bp = BUFQ_GET(&sc->sc_q)) != NULL) { + while ((bp = BUFQ_GET(sc->sc_q)) != NULL) { bp->b_error = ENXIO; bp->b_flags |= B_ERROR; biodone(bp); @@ -430,6 +429,7 @@ wddetach(struct device *self, int flags) /* Unhook the entropy source. */ rnd_detach_source(&sc->rnd_source); #endif + BUFQ_FREE(sc->sc_q); return (0); } @@ -490,7 +490,7 @@ wdstrategy(struct buf *bp) goto done; /* Queue transfer on drive, activate drive and controller if idle. */ s = splbio(); - BUFQ_ADD(&wd->sc_q, bp); + BUFQ_ADD(wd->sc_q, bp); wdstart(wd); splx(s); device_unref(&wd->sc_dev); @@ -521,7 +521,7 @@ wdstart(void *arg) while (wd->openings > 0) { /* Is there a buf for us ? */ - if ((bp = BUFQ_GET(&wd->sc_q)) == NULL) + if ((bp = BUFQ_GET(wd->sc_q)) == NULL) return; /* diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index cace466e490..7802ac73801 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_disk.c,v 1.23 2003/06/25 20:52:57 tedu Exp $ */ +/* $OpenBSD: subr_disk.c,v 1.24 2004/01/21 21:00:14 tedu Exp $ */ /* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */ /* @@ -526,6 +526,26 @@ dk_mountroot() return (*mountrootfn)(); } +struct bufq * +bufq_default_alloc(void) +{ + struct bufq_default *bq; + + bq = malloc(sizeof(*bq), M_DEVBUF, M_NOWAIT); + memset(bq, 0, sizeof(*bq)); + bq->bufq.bufq_free = bufq_default_free; + bq->bufq.bufq_add = bufq_default_add; + bq->bufq.bufq_get = bufq_default_get; + + return ((struct bufq *)bq); +} + +void +bufq_default_free(struct bufq *bq) +{ + free(bq, M_DEVBUF); +} + void bufq_default_add(struct bufq *bq, struct buf *bp) { diff --git a/sys/sys/buf.h b/sys/sys/buf.h index 13030886c85..c93a4f44e96 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: buf.h,v 1.44 2003/06/25 20:52:57 tedu Exp $ */ +/* $OpenBSD: buf.h,v 1.45 2004/01/21 21:00:14 tedu Exp $ */ /* $NetBSD: buf.h,v 1.25 1997/04/09 21:12:17 mycroft Exp $ */ /* @@ -105,8 +105,9 @@ struct buf { * flexible buffer queue routines */ struct bufq { - void (*bufq_add)(struct bufq*, struct buf *); - struct buf *(*bufq_get)(struct bufq*); + void (*bufq_free)(struct bufq *); + void (*bufq_add)(struct bufq *, struct buf *); + struct buf *(*bufq_get)(struct bufq *); }; struct bufq_default { @@ -114,11 +115,13 @@ struct bufq_default { struct buf bufq_head[3]; }; -#define BUFQ_ADD(_bufq, _bp) \ - ((struct bufq *)_bufq)->bufq_add((struct bufq *)_bufq, _bp) -#define BUFQ_GET(_bufq) \ - ((struct bufq *)_bufq)->bufq_get((struct bufq *)_bufq) +#define BUFQ_ALLOC(_type) bufq_default_alloc() /* XXX */ +#define BUFQ_FREE(_bufq) (_bufq)->bufq_free(_bufq) +#define BUFQ_ADD(_bufq, _bp) (_bufq)->bufq_add(_bufq, _bp) +#define BUFQ_GET(_bufq) (_bufq)->bufq_get(_bufq) +struct bufq *bufq_default_alloc(void); +void bufq_default_free(struct bufq *); void bufq_default_add(struct bufq *, struct buf *); struct buf *bufq_default_get(struct bufq *); |