2 * Native Solaris async IO engine
12 #ifdef FIO_HAVE_SOLARISAIO
14 #include <sys/asynch.h>
16 struct solarisaio_data {
17 struct io_u **aio_events;
21 static int fio_solarisaio_cancel(struct thread_data fio_unused *td,
24 return aiocancel(&io_u->resultp);
27 static int fio_solarisaio_prep(struct thread_data fio_unused *td,
30 io_u->resultp.aio_return = AIO_INPROGRESS;
34 static int fio_solarisaio_getevents(struct thread_data *td, unsigned int min,
35 unsigned int max, struct timespec *t)
37 struct solarisaio_data *sd = td->io_ops->data;
50 tv.tv_sec = t->tv_sec;
51 tv.tv_usec = t->tv_nsec / 1000;
56 io_u = container_of(p, struct io_u, resultp);
58 sd->aio_events[r++] = io_u;
61 if (io_u->resultp.aio_return >= 0) {
62 io_u->resid = io_u->xfer_buflen
63 - io_u->resultp.aio_return;
66 io_u->error = io_u->resultp.aio_return;
73 static struct io_u *fio_solarisaio_event(struct thread_data *td, int event)
75 struct solarisaio_data *sd = td->io_ops->data;
77 return sd->aio_events[event];
80 static int fio_solarisaio_queue(struct thread_data fio_unused *td,
83 struct solarisaio_data *sd = td->io_ops->data;
84 struct fio_file *f = io_u->file;
88 fio_ro_check(td, io_u);
90 if (io_u->ddir == DDIR_SYNC) {
96 return FIO_Q_COMPLETED;
99 if (sd->nr == td->o.iodepth)
103 if (io_u->ddir == DDIR_READ)
104 ret = aioread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, off,
105 SEEK_SET, &io_u->resultp);
107 ret = aiowrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, off,
108 SEEK_SET, &io_u->resultp);
111 td_verror(td, io_u->error, "xfer");
112 return FIO_Q_COMPLETED;
119 static void fio_solarisaio_cleanup(struct thread_data *td)
121 struct solarisaio_data *sd = td->io_ops->data;
124 free(sd->aio_events);
129 static int fio_solarisaio_init(struct thread_data *td)
131 struct solarisaio_data *sd = malloc(sizeof(*sd));
133 memset(sd, 0, sizeof(*sd));
134 sd->aio_events = malloc(td->o.iodepth * sizeof(struct io_u *));
135 memset(sd->aio_events, 0, td->o.iodepth * sizeof(struct io_u *));
137 td->io_ops->data = sd;
141 static struct ioengine_ops ioengine = {
142 .name = "solarisaio",
143 .version = FIO_IOOPS_VERSION,
144 .init = fio_solarisaio_init,
145 .prep = fio_solarisaio_prep,
146 .queue = fio_solarisaio_queue,
147 .cancel = fio_solarisaio_cancel,
148 .getevents = fio_solarisaio_getevents,
149 .event = fio_solarisaio_event,
150 .cleanup = fio_solarisaio_cleanup,
151 .open_file = generic_open_file,
152 .close_file = generic_close_file,
155 #else /* FIO_HAVE_SOLARISAIO */
158 * When we have a proper configure system in place, we simply wont build
159 * and install this io engine. For now install a crippled version that
160 * just complains and fails to load.
162 static int fio_solarisaio_init(struct thread_data fio_unused *td)
164 fprintf(stderr, "fio: solarisaio not available\n");
168 static struct ioengine_ops ioengine = {
169 .name = "solarisaio",
170 .version = FIO_IOOPS_VERSION,
171 .init = fio_solarisaio_init,
176 static void fio_init fio_solarisaio_register(void)
178 register_ioengine(&ioengine);
181 static void fio_exit fio_solarisaio_unregister(void)
183 unregister_ioengine(&ioengine);