summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2004-01-21 21:00:14 +0000
committertedu <tedu@openbsd.org>2004-01-21 21:00:14 +0000
commit4dfdfe5546b4720a815fc4a3b76007d51a50f1cd (patch)
tree67428b5c1d9bd69c49f0d6b5d5d6644b6f6cbb92
parentPrototype llabs(3). Forgotten commit gathering bit rot in my tree... (diff)
downloadwireguard-openbsd-4dfdfe5546b4720a815fc4a3b76007d51a50f1cd.tar.xz
wireguard-openbsd-4dfdfe5546b4720a815fc4a3b76007d51a50f1cd.zip
dynamic bufq support. basically a nullop. ok grange@
-rw-r--r--sys/dev/ata/wd.c14
-rw-r--r--sys/kern/subr_disk.c22
-rw-r--r--sys/sys/buf.h17
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 *);