commit - 3161ed12f319d0321c3cb79df486f8a9c79d2085
commit + ff99cb2ffd6a96106021164a402d2118933bf0a5
blob - cc9c5a033bb242d86eff647d65bf8b358a54b37e
blob + e30150b7da820a17d69a19f15660be18341ab486
--- share/man/man9/bufq_init.9
+++ share/man/man9/bufq_init.9
-.\" $OpenBSD: bufq_init.9,v 1.6 2015/12/25 20:50:57 bentley Exp $
+.\" $OpenBSD: bufq_init.9,v 1.7 2025/05/17 10:13:40 jsg Exp $
.\"
.\" Copyright (c) 2013 David Gwynne <dlg@openbsd.org>
.\"
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: December 25 2015 $
+.Dd $Mdocdate: May 17 2025 $
.Dt BUFQ_INIT 9
.Os
.Sh NAME
.Nm bufq_init ,
-.Nm bufq_switch ,
.Nm bufq_destroy ,
.Nm bufq_queue ,
.Nm bufq_dequeue ,
-.Nm bufq_requeue ,
.Nm bufq_peek ,
.Nm bufq_drain
.\" .Nm bufq_wait ,
.In sys/buf.h
.Ft int
.Fn bufq_init "struct bufq *bufq" "int type"
-.Ft int
-.Fn bufq_switch "struct bufq *bufq" "int type"
.Ft void
.Fn bufq_destroy "struct bufq *bufq"
.Ft void
.Fn bufq_queue "struct bufq *bufq" "struct buf *bp"
.Ft struct buf *
.Fn bufq_dequeue "struct bufq *bufq"
-.Ft void
-.Fn bufq_requeue "struct bufq *bufq" "struct buf *bp"
.Ft int
.Fn bufq_peek "struct bufq *bufq"
.Ft void
.Fa type
argument.
.Pp
-.Fn bufq_switch
-can be used to change the scheduler currently used by
-.Fa bufq
-to the algorithm specified by
-.Fa type .
-.Pp
The
.Fa type
argument to
.Fn bufq_init
-and
-.Fn bufq_switch
can be one of the following scheduling algorithms:
.Pp
.Bl -tag -offset indent -width BUFQ_DEFAULT -compact
has scheduled to be serviced by a disk.
The buf will be removed from the queue.
.Pp
-.Fn bufq_requeue
-can be used to return a previously dequeued buf specified by
-.Fa bp
-to the head of the queue of
-.Fa bufq .
-.Pp
.Fn bufq_peek
allows the caller to determine if there are more bufs queued on
.Fa bufq
error, and returns them to the block layer via
.Xr biodone 9 .
.Sh CONTEXT
-.Fn bufq_init ,
-.Fn bufq_switch ,
+.Fn bufq_init
and
.Fn bufq_destroy
can be called during autoconf, or from process context.
.Pp
.Nm bufq_queue ,
.Nm bufq_dequeue ,
-.Nm bufq_requeue ,
.Nm bufq_peek ,
and
.Nm bufq_drain
can be called during autoconf, from process context, or from interrupt context.
.Sh RETURN VALUES
.Fn bufq_init
-and
-.Fn bufq_switch
will return 0 on success, or an error code as per
.Xr errno 2 .
.Pp
blob - 505770176c4b746a97a264f6c13b706b907d3c92
blob + 5f5be3b74dfd5720697babfedc6e4b5355dce47d
--- sys/kern/kern_bufq.c
+++ sys/kern/kern_bufq.c
-/* $OpenBSD: kern_bufq.c,v 1.35 2022/12/05 23:18:37 deraadt Exp $ */
+/* $OpenBSD: kern_bufq.c,v 1.36 2025/05/17 10:13:40 jsg Exp $ */
/*
* Copyright (c) 2010 Thordur I. Bjornsson <thib@openbsd.org>
* Copyright (c) 2010 David Gwynne <dlg@openbsd.org>
void (*impl_queue)(void *, struct buf *);
struct buf *(*impl_dequeue)(void *);
- void (*impl_requeue)(void *, struct buf *);
int (*impl_peek)(void *);
};
void bufq_fifo_destroy(void *);
void bufq_fifo_queue(void *, struct buf *);
struct buf *bufq_fifo_dequeue(void *);
-void bufq_fifo_requeue(void *, struct buf *);
int bufq_fifo_peek(void *);
void *bufq_nscan_create(void);
void bufq_nscan_destroy(void *);
void bufq_nscan_queue(void *, struct buf *);
struct buf *bufq_nscan_dequeue(void *);
-void bufq_nscan_requeue(void *, struct buf *);
int bufq_nscan_peek(void *);
const struct bufq_impl bufq_impls[BUFQ_HOWMANY] = {
bufq_fifo_destroy,
bufq_fifo_queue,
bufq_fifo_dequeue,
- bufq_fifo_requeue,
bufq_fifo_peek
},
{
bufq_nscan_destroy,
bufq_nscan_queue,
bufq_nscan_dequeue,
- bufq_nscan_requeue,
bufq_nscan_peek
}
};
return (0);
}
-int
-bufq_switch(struct bufq *bq, int type)
-{
- void *data;
- void *odata;
- int otype;
- struct buf *bp;
- int ret;
-
- mtx_enter(&bq->bufq_mtx);
- ret = (bq->bufq_type == type);
- mtx_leave(&bq->bufq_mtx);
- if (ret)
- return (0);
-
- data = bufq_impls[type].impl_create();
- if (data == NULL)
- return (ENOMEM);
-
- mtx_enter(&bq->bufq_mtx);
- if (bq->bufq_type != type) { /* might have changed during create */
- odata = bq->bufq_data;
- otype = bq->bufq_type;
-
- while ((bp = bufq_impls[otype].impl_dequeue(odata)) != NULL)
- bufq_impls[type].impl_queue(data, bp);
-
- bq->bufq_data = data;
- bq->bufq_type = type;
- bq->bufq_impl = &bufq_impls[type];
- } else {
- otype = type;
- odata = data;
- }
- mtx_leave(&bq->bufq_mtx);
-
- bufq_impls[otype].impl_destroy(odata);
-
- return (0);
-}
-
void
bufq_destroy(struct bufq *bq)
{
return (bp);
}
-void
-bufq_requeue(struct bufq *bq, struct buf *bp)
-{
- mtx_enter(&bq->bufq_mtx);
- bq->bufq_impl->impl_requeue(bq->bufq_data, bp);
- mtx_leave(&bq->bufq_mtx);
-}
-
int
bufq_peek(struct bufq *bq)
{
return (bp);
}
-void
-bufq_fifo_requeue(void *data, struct buf *bp)
-{
- struct bufq_fifo_head *head = data;
-
- SIMPLEQ_INSERT_HEAD(head, bp, b_bufq.bufq_data_fifo.bqf_entries);
-}
-
int
bufq_fifo_peek(void *data)
{
return (bp);
}
-void
-bufq_nscan_requeue(void *vdata, struct buf *bp)
-{
- struct bufq_nscan_data *data = vdata;
-
- SIMPLEQ_INSERT_HEAD(&data->fifo, bp, dsentries);
-}
-
int
bufq_nscan_peek(void *vdata)
{
blob - c956f7c7cb781f812844fbdf4d33f8fd63195611
blob + 5c08b91e6ef97840b7c17b4e95d4b666f6a41efc
--- sys/sys/buf.h
+++ sys/sys/buf.h
-/* $OpenBSD: buf.h,v 1.116 2025/04/13 09:52:43 jsg Exp $ */
+/* $OpenBSD: buf.h,v 1.117 2025/05/17 10:13:40 jsg Exp $ */
/* $NetBSD: buf.h,v 1.25 1997/04/09 21:12:17 mycroft Exp $ */
/*
};
int bufq_init(struct bufq *, int);
-int bufq_switch(struct bufq *, int);
void bufq_destroy(struct bufq *);
void bufq_queue(struct bufq *, struct buf *);
struct buf *bufq_dequeue(struct bufq *);
-void bufq_requeue(struct bufq *, struct buf *);
int bufq_peek(struct bufq *);
void bufq_drain(struct bufq *);