Bring back the geom_bioqueues, they _are_ a good idea.

ATA will uses these RSN.
This commit is contained in:
phk 2004-01-28 08:39:18 +00:00
parent 860115ff61
commit d82e43eede
2 changed files with 30 additions and 1 deletions

View File

@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
static struct g_bioq g_bio_run_down;
static struct g_bioq g_bio_run_up;
static struct g_bioq g_bio_run_task;
static u_int pace;
static uma_zone_t biozone;
@ -151,6 +152,7 @@ g_io_init()
g_bioq_init(&g_bio_run_down);
g_bioq_init(&g_bio_run_up);
g_bioq_init(&g_bio_run_task);
biozone = uma_zcreate("g_bio", sizeof (struct bio),
NULL, NULL,
NULL, NULL,
@ -358,6 +360,23 @@ g_io_schedule_down(struct thread *tp __unused)
}
}
void
bio_taskqueue(struct bio *bp, bio_task_t *func, void *arg)
{
bp->bio_task = func;
bp->bio_task_arg = arg;
/*
* The taskqueue is actually just a second queue off the "up"
* queue, so we use the same lock.
*/
g_bioq_lock(&g_bio_run_up);
TAILQ_INSERT_TAIL(&g_bio_run_task.bio_queue, bp, bio_queue);
g_bio_run_task.bio_queue_length++;
wakeup(&g_wait_up);
g_bioq_unlock(&g_bio_run_up);
}
void
g_io_schedule_up(struct thread *tp __unused)
{
@ -368,6 +387,14 @@ g_io_schedule_up(struct thread *tp __unused)
mtx_init(&mymutex, "g_xup", NULL, MTX_DEF);
for(;;) {
g_bioq_lock(&g_bio_run_up);
bp = g_bioq_first(&g_bio_run_task);
if (bp != NULL) {
g_bioq_unlock(&g_bio_run_up);
mtx_lock(&mymutex);
bp->bio_task(bp->bio_task_arg);
mtx_unlock(&mymutex);
continue;
}
bp = g_bioq_first(&g_bio_run_up);
if (bp != NULL) {
g_bioq_unlock(&g_bio_run_up);

View File

@ -47,7 +47,7 @@
struct disk;
struct bio;
typedef void bio_task_t(struct bio *, void *);
typedef void bio_task_t(void *);
/*
* The bio structure describes an I/O operation in the kernel.
@ -122,6 +122,8 @@ void bioq_init(struct bio_queue_head *head);
void bioq_insert_tail(struct bio_queue_head *head, struct bio *bp);
void bioq_remove(struct bio_queue_head *head, struct bio *bp);
void bio_taskqueue(struct bio *bp, bio_task_t *fund, void *arg);
int physio(dev_t dev, struct uio *uio, int ioflag);
#define physread physio
#define physwrite physio