[PATCH] Separate io engines into separate loadable objects
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/fio.c b/fio.c
index 445babd..a2651f0 100644
--- a/fio.c
+++ b/fio.c
@@ -434,7 +434,7 @@
static int td_io_prep(struct thread_data *td, struct io_u *io_u)
{
- if (td->io_prep && td->io_prep(td, io_u))
+ if (td->io_ops->prep && td->io_ops->prep(td, io_u))
return 1;
return 0;
@@ -569,8 +569,8 @@
static int sync_td(struct thread_data *td)
{
- if (td->io_sync)
- return td->io_sync(td);
+ if (td->io_ops->sync)
+ return td->io_ops->sync(td);
return 0;
}
@@ -578,14 +578,14 @@
static int io_u_getevents(struct thread_data *td, int min, int max,
struct timespec *t)
{
- return td->io_getevents(td, min, max, t);
+ return td->io_ops->getevents(td, min, max, t);
}
static int io_u_queue(struct thread_data *td, struct io_u *io_u)
{
gettimeofday(&io_u->issue_time, NULL);
- return td->io_queue(td, io_u);
+ return td->io_ops->queue(td, io_u);
}
#define iocb_time(iocb) ((unsigned long) (iocb)->data)
@@ -629,7 +629,7 @@
icd->bytes_done[0] = icd->bytes_done[1] = 0;
for (i = 0; i < icd->nr; i++) {
- io_u = td->io_event(td, i);
+ io_u = td->io_ops->event(td, i);
io_completed(td, io_u, icd);
put_io_u(td, io_u);
@@ -660,11 +660,11 @@
/*
* now cancel remaining active events
*/
- if (td->io_cancel) {
+ if (td->io_ops->cancel) {
list_for_each_safe(entry, n, &td->io_u_busylist) {
io_u = list_entry(entry, struct io_u, list);
- r = td->io_cancel(td, io_u);
+ r = td->io_ops->cancel(td, io_u);
if (!r)
put_io_u(td, io_u);
}
@@ -749,7 +749,7 @@
break;
}
- v_io_u = td->io_event(td, 0);
+ v_io_u = td->io_ops->event(td, 0);
icd.nr = 1;
icd.error = 0;
io_completed(td, v_io_u, &icd);
@@ -895,32 +895,12 @@
}
}
-static void cleanup_io(struct thread_data *td)
-{
- if (td->io_cleanup)
- td->io_cleanup(td);
-}
-
static int init_io(struct thread_data *td)
{
- if (td->io_engine == FIO_SYNCIO)
- return fio_syncio_init(td);
- else if (td->io_engine == FIO_MMAPIO)
- return fio_mmapio_init(td);
- else if (td->io_engine == FIO_LIBAIO)
- return fio_libaio_init(td);
- else if (td->io_engine == FIO_POSIXAIO)
- return fio_posixaio_init(td);
- else if (td->io_engine == FIO_SGIO)
- return fio_sgio_init(td);
- else if (td->io_engine == FIO_SPLICEIO)
- return fio_spliceio_init(td);
- else if (td->io_engine == FIO_CPUIO)
- return fio_cpuio_init(td);
- else {
- log_err("bad io_engine %d\n", td->io_engine);
- return 1;
- }
+ if (td->io_ops->init)
+ return td->io_ops->init(td);
+
+ return 0;
}
static void cleanup_io_u(struct thread_data *td)
@@ -956,10 +936,10 @@
int i, max_units;
char *p;
- if (td->io_engine == FIO_CPUIO)
+ if (td->io_ops->flags & FIO_CPUIO)
return 0;
- if (td->io_engine & FIO_SYNCIO)
+ if (td->io_ops->flags & FIO_SYNCIO)
max_units = 1;
else
max_units = td->iodepth;
@@ -1229,7 +1209,7 @@
struct stat st;
int flags = 0;
- if (td->io_engine == FIO_CPUIO)
+ if (td->io_ops->flags & FIO_CPUIO)
return 0;
if (stat(td->file_name, &st) == -1) {
@@ -1282,10 +1262,10 @@
if (get_file_size(td))
return 1;
- if (td->io_engine != FIO_MMAPIO)
- return setup_file_plain(td);
- else
+ if (td->io_ops->flags & FIO_MMAPIO)
return setup_file_mmap(td);
+ else
+ return setup_file_plain(td);
}
static int switch_ioscheduler(struct thread_data *td)
@@ -1338,7 +1318,7 @@
static void clear_io_state(struct thread_data *td)
{
- if (td->io_engine == FIO_SYNCIO)
+ if (td->io_ops->flags & FIO_SYNCIO)
lseek(td->fd, SEEK_SET, 0);
td->last_pos = 0;
@@ -1423,7 +1403,7 @@
clear_io_state(td);
prune_io_piece_log(td);
- if (td->io_engine == FIO_CPUIO)
+ if (td->io_ops->flags & FIO_CPUIO)
do_cpuio(td);
else
do_io(td);
@@ -1472,7 +1452,7 @@
}
if (td->mmap)
munmap(td->mmap, td->file_size);
- cleanup_io(td);
+ close_ioengine(td);
cleanup_io_u(td);
td_set_runstate(td, TD_EXITED);
return NULL;
@@ -1738,7 +1718,7 @@
for (i = 0, cputhreads = 0; i < thread_number; i++) {
struct thread_data *td = &threads[i];
- if (td->io_engine == FIO_CPUIO)
+ if (td->io_ops->flags & FIO_CPUIO)
cputhreads++;
if (td->runstate != TD_EXITED)