Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
+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 = f->file_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)
{
static int fio_binject_getevents(struct thread_data *td, unsigned int min,
unsigned int max, struct timespec fio_unused *t)
{
* Fill in the file descriptors
*/
for_each_file(td, f, i) {
* Fill in the file descriptors
*/
for_each_file(td, f, i) {
- bf = (struct binject_file *) f->file_data;
/*
* don't block for min events == 0
/*
* don't block for min events == 0
- void *p;
-
- do {
- if (!min)
- break;
-
ret = poll(bd->pfds, td->o.nr_files, -1);
if (ret < 0) {
if (!r)
ret = poll(bd->pfds, td->o.nr_files, -1);
if (ret < 0) {
if (!r)
if (pollin_events(bd->pfds, td->o.nr_files))
break;
if (pollin_events(bd->pfds, td->o.nr_files))
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 (!events) {
- usleep(1000);
- goto re_read;
- }
left -= events;
r += events;
left -= events;
r += events;
if (!min) {
for_each_file(td, f, i) {
if (!min) {
for_each_file(td, f, i) {
- bf = (struct binject_file *) f->file_data;
fcntl(bf->fd, F_SETFL, bd->fd_flags[i]);
}
}
fcntl(bf->fd, F_SETFL, bd->fd_flags[i]);
}
}
static int fio_binject_doio(struct thread_data *td, struct io_u *io_u)
{
struct b_user_cmd *buc = &io_u->buc;
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 = io_u->file->file_data;
int ret;
ret = write(bf->fd, buc, sizeof(*buc));
int ret;
ret = write(bf->fd, buc, sizeof(*buc));
{
struct binject_data *bd = td->io_ops->data;
struct b_user_cmd *buc = &io_u->buc;
{
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 = io_u->file->file_data;
if (io_u->xfer_buflen & (bf->bs - 1)) {
log_err("read/write not sector aligned\n");
if (io_u->xfer_buflen & (bf->bs - 1)) {
log_err("read/write not sector aligned\n");
static int fio_binject_close_file(struct thread_data *td, struct fio_file *f)
{
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 = f->file_data;
if (bf) {
binject_unmap_dev(td, bf);
free(bf);
if (bf) {
binject_unmap_dev(td, bf);
free(bf);
return generic_close_file(td, f);
}
return generic_close_file(td, f);
}
bf = malloc(sizeof(*bf));
bf->bs = bs;
bf->minor = bf->fd = -1;
bf = malloc(sizeof(*bf));
bf->bs = bs;
bf->minor = bf->fd = -1;
- f->file_data = (unsigned long) bf;
if (binject_map_dev(td, bf, f->fd)) {
err_close:
if (binject_map_dev(td, bf, f->fd)) {
err_close:
B_TYPE_DISCARD,
B_TYPE_READVOID,
B_TYPE_WRITEZERO,
B_TYPE_DISCARD,
B_TYPE_READVOID,
B_TYPE_WRITEZERO,
+ B_TYPE_READBARRIER,
+ B_TYPE_WRITEBARRIER,