X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fbinject.c;h=fb1906206a039be8e13f5cc00118307b6febd1dd;hb=e53cf97beb6c07ea1dedc218058675cc291e9f2a;hp=d83b1180000269a3c507e377753b5d81c87dfd32;hpb=0e238572c4e63b0675fd9cbbf168d19ad8d60464;p=fio.git diff --git a/engines/binject.c b/engines/binject.c index d83b1180..fb190620 100644 --- a/engines/binject.c +++ b/engines/binject.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include "../fio.h" @@ -57,6 +59,37 @@ static int pollin_events(struct pollfd *pfds, int fds) return 0; } +static unsigned int binject_read_commands(struct thread_data *td, void *p, + int left, int *err) +{ + struct binject_file *bf; + struct fio_file *f; + int i, ret, events; + +one_more: + events = 0; + for_each_file(td, f, i) { + bf = (struct binject_file *) (uintptr_t) f->engine_data; + ret = read(bf->fd, p, left * sizeof(struct b_user_cmd)); + if (ret < 0) { + if (errno == EAGAIN) + continue; + *err = -errno; + td_verror(td, errno, "read"); + break; + } else if (ret) { + p += ret; + events += ret / sizeof(struct b_user_cmd); + } + } + + if (*err || events) + return events; + + usleep(1000); + goto one_more; +} + static int fio_binject_getevents(struct thread_data *td, unsigned int min, unsigned int max, struct timespec fio_unused *t) { @@ -71,7 +104,7 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min, * Fill in the file descriptors */ for_each_file(td, f, i) { - bf = (struct binject_file *) f->file_data; + bf = (struct binject_file *) (uintptr_t) f->engine_data; /* * don't block for min events == 0 @@ -85,12 +118,7 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min, } while (left) { - void *p; - - do { - if (!min) - break; - + while (!min) { ret = poll(bd->pfds, td->o.nr_files, -1); if (ret < 0) { if (!r) @@ -102,36 +130,15 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min, if (pollin_events(bd->pfds, td->o.nr_files)) break; - } while (1); + } if (r < 0) break; -re_read: - p = buf; - events = 0; - for_each_file(td, f, i) { - bf = (struct binject_file *) f->file_data; - - ret = read(bf->fd, p, left * sizeof(struct b_user_cmd)); - if (ret < 0) { - if (errno == EAGAIN) - continue; - r = -errno; - td_verror(td, errno, "read"); - break; - } else if (ret) { - p += ret; - events += ret / sizeof(struct b_user_cmd); - } - } + events = binject_read_commands(td, buf, left, &r); if (r < 0) break; - if (!events) { - usleep(1000); - goto re_read; - } left -= events; r += events; @@ -139,14 +146,14 @@ re_read: for (i = 0; i < events; i++) { struct b_user_cmd *buc = (struct b_user_cmd *) buf + i; - bd->events[ev_index] = (struct io_u *) buc->usr_ptr; + bd->events[ev_index] = (struct io_u *) (unsigned long) buc->usr_ptr; ev_index++; } } if (!min) { for_each_file(td, f, i) { - bf = (struct binject_file *) f->file_data; + bf = (struct binject_file *) (uintptr_t) f->engine_data; fcntl(bf->fd, F_SETFL, bd->fd_flags[i]); } } @@ -160,8 +167,7 @@ re_read: static int fio_binject_doio(struct thread_data *td, struct io_u *io_u) { struct b_user_cmd *buc = &io_u->buc; - struct fio_file *f = io_u->file; - struct binject_file *bf = (struct binject_file *) f->file_data; + struct binject_file *bf = (struct binject_file *) (uintptr_t) io_u->file->engine_data; int ret; ret = write(bf->fd, buc, sizeof(*buc)); @@ -175,7 +181,7 @@ static int fio_binject_prep(struct thread_data *td, struct io_u *io_u) { struct binject_data *bd = td->io_ops->data; struct b_user_cmd *buc = &io_u->buc; - struct binject_file *bf = (struct binject_file *) io_u->file->file_data; + struct binject_file *bf = (struct binject_file *) (uintptr_t) io_u->file->engine_data; if (io_u->xfer_buflen & (bf->bs - 1)) { log_err("read/write not sector aligned\n"); @@ -187,7 +193,10 @@ static int fio_binject_prep(struct thread_data *td, struct io_u *io_u) buc->type = B_TYPE_READ; } else if (io_u->ddir == DDIR_WRITE) { binject_buc_init(bd, io_u); - buc->type = B_TYPE_WRITE; + if (io_u->flags & IO_U_F_BARRIER) + buc->type = B_TYPE_WRITEBARRIER; + else + buc->type = B_TYPE_WRITE; } else if (io_u->ddir == DDIR_TRIM) { binject_buc_init(bd, io_u); buc->type = B_TYPE_DISCARD; @@ -224,6 +233,17 @@ static struct io_u *fio_binject_event(struct thread_data *td, int event) return bd->events[event]; } +static int binject_open_ctl(struct thread_data *td) +{ + int fd; + + fd = open("/dev/binject-ctl", O_RDWR); + if (fd < 0) + td_verror(td, errno, "open binject-ctl"); + + return fd; +} + static void binject_unmap_dev(struct thread_data *td, struct binject_file *bf) { struct b_ioctl_cmd bic; @@ -234,19 +254,14 @@ static void binject_unmap_dev(struct thread_data *td, struct binject_file *bf) bf->fd = -1; } - fdb = open("/dev/binject-ctl", O_RDWR); - if (fdb < 0) { - td_verror(td, errno, "open binject-ctl"); + fdb = binject_open_ctl(td); + if (fdb < 0) return; - } bic.minor = bf->minor; - if (ioctl(fdb, 1, &bic) < 0) { + if (ioctl(fdb, B_IOCTL_DEL, &bic) < 0) td_verror(td, errno, "binject dev unmap"); - close(fdb); - return; - } close(fdb); } @@ -259,15 +274,13 @@ static int binject_map_dev(struct thread_data *td, struct binject_file *bf, struct stat sb; int fdb, dev_there, loops; - fdb = open("/dev/binject-ctl", O_RDWR); - if (fdb < 0) { - td_verror(td, errno, "binject ctl open"); + fdb = binject_open_ctl(td); + if (fdb < 0) return 1; - } bic.fd = fd; - if (ioctl(fdb, 0, &bic) < 0) { + if (ioctl(fdb, B_IOCTL_ADD, &bic) < 0) { td_verror(td, errno, "binject dev map"); close(fdb); return 1; @@ -310,12 +323,12 @@ err_unmap: static int fio_binject_close_file(struct thread_data *td, struct fio_file *f) { - struct binject_file *bf = (struct binject_file *) f->file_data; + struct binject_file *bf = (struct binject_file *) (uintptr_t) f->engine_data; if (bf) { binject_unmap_dev(td, bf); free(bf); - f->file_data = 0; + f->engine_data = 0; return generic_close_file(td, f); } @@ -344,7 +357,7 @@ static int fio_binject_open_file(struct thread_data *td, struct fio_file *f) bf = malloc(sizeof(*bf)); bf->bs = bs; bf->minor = bf->fd = -1; - f->file_data = (unsigned long) bf; + f->engine_data = (uintptr_t) bf; if (binject_map_dev(td, bf, f->fd)) { err_close: @@ -403,7 +416,7 @@ static struct ioengine_ops ioengine = { .open_file = fio_binject_open_file, .close_file = fio_binject_close_file, .get_file_size = generic_get_file_size, - .flags = FIO_RAWIO, + .flags = FIO_RAWIO | FIO_BARRIER | FIO_MEMALIGN, }; #else /* FIO_HAVE_BINJECT */