X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Ffio-engine-sg.c;h=112f027869a840aebe43bc2f16c5e0a9a75873f5;hp=59eea1df7bae8b67b8209e5b62742ee94e40ea23;hb=87dc1ab1b4df7b977f60e3d43533a896e2ee665b;hpb=2866c82d598e30604d8a92723c664ee6ced90fb0 diff --git a/engines/fio-engine-sg.c b/engines/fio-engine-sg.c index 59eea1df..112f0278 100644 --- a/engines/fio-engine-sg.c +++ b/engines/fio-engine-sg.c @@ -61,8 +61,9 @@ static int fio_sgio_ioctl_getevents(struct thread_data *td, int fio_unused min, static int fio_sgio_getevents(struct thread_data *td, int min, int max, struct timespec fio_unused *t) { + struct fio_file *f = &td->files[0]; struct sgio_data *sd = td->io_ops->data; - struct pollfd pfd = { .fd = td->fd, .events = POLLIN }; + struct pollfd pfd = { .fd = f->fd, .events = POLLIN }; void *buf = malloc(max * sizeof(struct sg_io_hdr)); int left = max, ret, events, i, r = 0, fl = 0; @@ -70,8 +71,8 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max, * don't block for !events */ if (!min) { - fl = fcntl(td->fd, F_GETFL); - fcntl(td->fd, F_SETFL, fl | O_NONBLOCK); + fl = fcntl(f->fd, F_GETFL); + fcntl(f->fd, F_SETFL, fl | O_NONBLOCK); } while (left) { @@ -83,7 +84,7 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max, break; } while (1); - ret = read(td->fd, buf, left * sizeof(struct sg_io_hdr)); + ret = read(f->fd, buf, left * sizeof(struct sg_io_hdr)); if (ret < 0) { if (errno == EAGAIN) break; @@ -105,33 +106,34 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max, } if (!min) - fcntl(td->fd, F_SETFL, fl); + fcntl(f->fd, F_SETFL, fl); free(buf); return r; } -static int fio_sgio_ioctl_doio(struct thread_data *td, struct io_u *io_u) +static int fio_sgio_ioctl_doio(struct thread_data *td, + struct fio_file *f, struct io_u *io_u) { struct sgio_data *sd = td->io_ops->data; struct sg_io_hdr *hdr = &io_u->hdr; sd->events[0] = io_u; - return ioctl(td->fd, SG_IO, hdr); + return ioctl(f->fd, SG_IO, hdr); } -static int fio_sgio_rw_doio(struct thread_data *td, struct io_u *io_u, int sync) +static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync) { struct sg_io_hdr *hdr = &io_u->hdr; int ret; - ret = write(td->fd, hdr, sizeof(*hdr)); + ret = write(f->fd, hdr, sizeof(*hdr)); if (ret < 0) return errno; if (sync) { - ret = read(td->fd, hdr, sizeof(*hdr)); + ret = read(f->fd, hdr, sizeof(*hdr)); if (ret < 0) return errno; } @@ -141,32 +143,12 @@ static int fio_sgio_rw_doio(struct thread_data *td, struct io_u *io_u, int sync) static int fio_sgio_doio(struct thread_data *td, struct io_u *io_u, int sync) { - if (td->filetype == FIO_TYPE_BD) - return fio_sgio_ioctl_doio(td, io_u); - - return fio_sgio_rw_doio(td, io_u, sync); -} + struct fio_file *f = io_u->file; -static int fio_sgio_sync(struct thread_data *td) -{ - struct sgio_data *sd = td->io_ops->data; - struct sg_io_hdr *hdr; - struct io_u *io_u; - int ret; - - io_u = __get_io_u(td); - if (!io_u) - return ENOMEM; - - hdr = &io_u->hdr; - sgio_hdr_init(sd, hdr, io_u, 0); - hdr->dxfer_direction = SG_DXFER_NONE; - - hdr->cmdp[0] = 0x35; + if (td->filetype == FIO_TYPE_BD) + return fio_sgio_ioctl_doio(td, f, io_u); - ret = fio_sgio_doio(td, io_u, 1); - put_io_u(td, io_u); - return ret; + return fio_sgio_rw_doio(f, io_u, sync); } static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u) @@ -180,24 +162,34 @@ static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u) return EINVAL; } - sgio_hdr_init(sd, hdr, io_u, 1); - if (io_u->ddir == DDIR_READ) { + sgio_hdr_init(sd, hdr, io_u, 1); + hdr->dxfer_direction = SG_DXFER_FROM_DEV; hdr->cmdp[0] = 0x28; - } else { + } else if (io_u->ddir == DDIR_WRITE) { + sgio_hdr_init(sd, hdr, io_u, 1); + hdr->dxfer_direction = SG_DXFER_TO_DEV; hdr->cmdp[0] = 0x2a; + } else { + sgio_hdr_init(sd, hdr, io_u, 0); + + hdr->dxfer_direction = SG_DXFER_NONE; + hdr->cmdp[0] = 0x35; + } + + if (hdr->dxfer_direction != SG_DXFER_NONE) { + nr_blocks = io_u->buflen / sd->bs; + lba = io_u->offset / sd->bs; + hdr->cmdp[2] = (lba >> 24) & 0xff; + hdr->cmdp[3] = (lba >> 16) & 0xff; + hdr->cmdp[4] = (lba >> 8) & 0xff; + hdr->cmdp[5] = lba & 0xff; + hdr->cmdp[7] = (nr_blocks >> 8) & 0xff; + hdr->cmdp[8] = nr_blocks & 0xff; } - nr_blocks = io_u->buflen / sd->bs; - lba = io_u->offset / sd->bs; - hdr->cmdp[2] = (lba >> 24) & 0xff; - hdr->cmdp[3] = (lba >> 16) & 0xff; - hdr->cmdp[4] = (lba >> 8) & 0xff; - hdr->cmdp[5] = lba & 0xff; - hdr->cmdp[7] = (nr_blocks >> 8) & 0xff; - hdr->cmdp[8] = nr_blocks & 0xff; return 0; } @@ -206,7 +198,7 @@ static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u) struct sg_io_hdr *hdr = &io_u->hdr; int ret; - ret = fio_sgio_doio(td, io_u, 0); + ret = fio_sgio_doio(td, io_u, io_u->ddir == DDIR_SYNC); if (ret < 0) io_u->error = errno; @@ -266,6 +258,7 @@ static void fio_sgio_cleanup(struct thread_data *td) static int fio_sgio_init(struct thread_data *td) { + struct fio_file *f = &td->files[0]; struct sgio_data *sd; unsigned int bs; int ret; @@ -276,14 +269,14 @@ static int fio_sgio_init(struct thread_data *td) td->io_ops->data = sd; if (td->filetype == FIO_TYPE_BD) { - if (ioctl(td->fd, BLKSSZGET, &bs) < 0) { + if (ioctl(f->fd, BLKSSZGET, &bs) < 0) { td_verror(td, errno); return 1; } } else if (td->filetype == FIO_TYPE_CHAR) { int version; - if (ioctl(td->fd, SG_GET_VERSION_NUM, &version) < 0) { + if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) { td_verror(td, errno); return 1; } @@ -319,6 +312,5 @@ struct ioengine_ops ioengine = { .getevents = fio_sgio_getevents, .event = fio_sgio_event, .cleanup = fio_sgio_cleanup, - .sync = fio_sgio_sync, - .flags = FIO_SYNCIO, + .flags = FIO_SYNCIO | FIO_RAWIO, };