X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fposixaio.c;h=e315e972b73df4d085f220fb54ed4bc276083de9;hp=4c39a771e12419e9690c9e6cd93ee4a7ad17f791;hb=9918be5a9bfe2819cccdb9f975f2b9d4d36f3f70;hpb=6ff42e9fca58cc6e1ab05810abaf113d77c104d1 diff --git a/engines/posixaio.c b/engines/posixaio.c index 4c39a771..e315e972 100644 --- a/engines/posixaio.c +++ b/engines/posixaio.c @@ -72,6 +72,7 @@ static int fio_posixaio_prep(struct thread_data fio_unused *td, aiocb->aio_buf = io_u->xfer_buf; aiocb->aio_nbytes = io_u->xfer_buflen; aiocb->aio_offset = io_u->offset; + aiocb->aio_sigevent.sigev_notify = SIGEV_NONE; io_u->seen = 0; return 0; @@ -152,7 +153,7 @@ static struct io_u *fio_posixaio_event(struct thread_data *td, int event) return pd->aio_events[event]; } -static int fio_posixaio_queue(struct thread_data fio_unused *td, +static int fio_posixaio_queue(struct thread_data *td, struct io_u *io_u) { struct posixaio_data *pd = td->io_ops->data; @@ -165,7 +166,13 @@ static int fio_posixaio_queue(struct thread_data fio_unused *td, ret = aio_read(aiocb); else if (io_u->ddir == DDIR_WRITE) ret = aio_write(aiocb); - else { + else if (io_u->ddir == DDIR_TRIM) { + if (pd->queued) + return FIO_Q_BUSY; + + do_io_u_trim(td, io_u); + return FIO_Q_COMPLETED; + } else { #ifdef FIO_HAVE_POSIXAIO_FSYNC ret = aio_fsync(O_SYNC, aiocb); #else @@ -178,6 +185,15 @@ static int fio_posixaio_queue(struct thread_data fio_unused *td, } if (ret) { + /* + * At least OSX has a very low limit on the number of pending + * IOs, so if it returns EAGAIN, we are out of resources + * to queue more. Just return FIO_Q_BUSY to naturally + * drop off at this depth. + */ + if (errno == EAGAIN) + return FIO_Q_BUSY; + io_u->error = errno; td_verror(td, io_u->error, "xfer"); return FIO_Q_COMPLETED; @@ -233,7 +249,7 @@ static struct ioengine_ops ioengine = { */ static int fio_posixaio_init(struct thread_data fio_unused *td) { - fprintf(stderr, "fio: posixaio not available\n"); + log_err("fio: posixaio not available\n"); return 1; }