Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix fio perfomance on windows to match IOMETER. #64

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions HOWTO
Original file line number Diff line number Diff line change
Expand Up @@ -2010,6 +2010,7 @@ before it can be used with this format. The offset and length are given in
bytes. The action can be one of these:

wait Wait for 'offset' microseconds. Everything below 100 is discarded.
The time is relative to the previous wait statement.
read Read 'length' bytes beginning from 'offset'
write Write 'length' bytes beginning from 'offset'
sync fsync() the file
Expand Down
2 changes: 1 addition & 1 deletion backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ static int wait_for_completions(struct thread_data *td, struct timeval *time)
* if the queue is full, we MUST reap at least 1 event
*/
min_evts = min(td->o.iodepth_batch_complete, td->cur_depth);
if (full && !min_evts)
if ((full && !min_evts) || !td->o.iodepth_batch_complete)
min_evts = 1;

if (time && (__should_check_rate(td, DDIR_READ) ||
Expand Down
21 changes: 6 additions & 15 deletions engines/windowsaio.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,14 +284,13 @@ static int fio_windowsaio_getevents(struct thread_data *td, unsigned int min,

if (fov->io_complete) {
fov->io_complete = FALSE;
ResetEvent(fov->o.hEvent);
wd->aio_events[dequeued] = io_u;
dequeued++;
}

if (dequeued >= min)
break;
}
if (dequeued >= min)
break;

if (dequeued < min) {
status = WaitForSingleObject(wd->iocomplete_event, mswait);
Expand All @@ -310,23 +309,22 @@ static int fio_windowsaio_queue(struct thread_data *td, struct io_u *io_u)
{
struct fio_overlapped *o = io_u->engine_data;
LPOVERLAPPED lpOvl = &o->o;
DWORD iobytes;
BOOL success = FALSE;
int rc = FIO_Q_COMPLETED;

fio_ro_check(td, io_u);

lpOvl->Internal = STATUS_PENDING;
lpOvl->Internal = 0;
lpOvl->InternalHigh = 0;
lpOvl->Offset = io_u->offset & 0xFFFFFFFF;
lpOvl->OffsetHigh = io_u->offset >> 32;

switch (io_u->ddir) {
case DDIR_WRITE:
success = WriteFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, &iobytes, lpOvl);
success = WriteFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, NULL, lpOvl);
break;
case DDIR_READ:
success = ReadFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, &iobytes, lpOvl);
success = ReadFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, NULL, lpOvl);
break;
case DDIR_SYNC:
case DDIR_DATASYNC:
Expand Down Expand Up @@ -403,7 +401,6 @@ static void fio_windowsaio_io_u_free(struct thread_data *td, struct io_u *io_u)
struct fio_overlapped *o = io_u->engine_data;

if (o) {
CloseHandle(o->o.hEvent);
io_u->engine_data = NULL;
free(o);
}
Expand All @@ -416,13 +413,7 @@ static int fio_windowsaio_io_u_init(struct thread_data *td, struct io_u *io_u)
o = malloc(sizeof(*o));
o->io_complete = FALSE;
o->io_u = io_u;
o->o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (o->o.hEvent == NULL) {
log_err("windowsaio: failed to create event handle\n");
free(o);
return 1;
}

o->o.hEvent = NULL;
io_u->engine_data = o;
return 0;
}
Expand Down