Bring back the geom_bioqueues, they _are_ a good idea.
ATA will uses these RSN.
This commit is contained in:
parent
860115ff61
commit
d82e43eede
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user