net.c revision 2fc2698113c087352c1851bf5ebfcad6adb53932
1ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe/* 2ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * Transfer data over the net. Pretty basic setup, will only support 3ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * 1 file per thread/job. 4ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe */ 5ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdio.h> 6ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdlib.h> 7ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <unistd.h> 8ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <errno.h> 9ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <assert.h> 10ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netinet/in.h> 11ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <arpa/inet.h> 12ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netdb.h> 13ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 14ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../fio.h" 15ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../os.h" 16ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 17ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestruct net_data { 18ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe int send_to_net; 19ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct io_u *last_io_u; 20ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}; 21ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 22ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_getevents(struct thread_data *td, int fio_unused min, 23ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe int max, struct timespec fio_unused *t) 24ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 25ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe assert(max <= 1); 26ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 27ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe /* 28ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * we can only have one finished io_u for sync io, since the depth 29ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * is always 1 30ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe */ 31ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (list_empty(&td->io_u_busylist)) 32ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 33ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 34ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 35ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 36ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 37ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic struct io_u *fio_netio_event(struct thread_data *td, int event) 38ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 39ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct net_data *nd = td->io_ops->data; 40ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 41ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe assert(event == 0); 42ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 43ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return nd->last_io_u; 44ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 45ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 46ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_prep(struct thread_data *td, struct io_u *io_u) 47ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 48ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct net_data *nd = td->io_ops->data; 49ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct fio_file *f = io_u->file; 50ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 51ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (nd->send_to_net) { 52ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (io_u->ddir == DDIR_READ) { 53ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_verror(td, EINVAL); 54ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 55ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 56ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } else { 57ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (io_u->ddir == DDIR_WRITE) { 58ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_verror(td, EINVAL); 59ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 60ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 61ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 62ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 63ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (io_u->ddir == DDIR_SYNC) 64ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 65ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (io_u->offset == f->last_completed_pos) 66ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 67ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 68e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe /* 69e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe * If offset is different from last end position, it's a seek. 70e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe * As network io is purely sequential, we don't allow seeks. 71e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe */ 72ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_verror(td, EINVAL); 73ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 74ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 75ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 76ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_queue(struct thread_data *td, struct io_u *io_u) 77ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 78ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct net_data *nd = td->io_ops->data; 79ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct fio_file *f = io_u->file; 80ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe unsigned int ret = 0; 81ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 82ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (io_u->ddir == DDIR_WRITE) 83ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe ret = write(f->fd, io_u->buf, io_u->buflen); 84ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe else if (io_u->ddir == DDIR_READ) 85ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe ret = read(f->fd, io_u->buf, io_u->buflen); 86ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 87ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (ret != io_u->buflen) { 88ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (ret > 0) { 89ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe io_u->resid = io_u->buflen - ret; 90ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe io_u->error = EIO; 91ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } else 92ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe io_u->error = errno; 93ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 94ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 95ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (!io_u->error) 96ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd->last_io_u = io_u; 97ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 98ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return io_u->error; 99ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 100ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 101ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup_connect(struct thread_data *td, const char *host, 102e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe unsigned short port) 103ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 104ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct sockaddr_in addr; 105ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct fio_file *f; 1062fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe int i; 107ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 108ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe memset(&addr, 0, sizeof(addr)); 109ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe addr.sin_family = AF_INET; 110e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe addr.sin_port = htons(port); 111ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 112ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (inet_aton(host, &addr.sin_addr) != 1) { 113ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct hostent *hent = gethostbyname(host); 114ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 115ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (!hent) { 116ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_vmsg(td, errno, "gethostbyname"); 117ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 118ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 119ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 120ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe memcpy(&addr.sin_addr, hent->h_addr, 4); 121ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 122ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 1232fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe for_each_file(td, f, i) { 1242fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe f->fd = socket(AF_INET, SOCK_STREAM, 0); 1252fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe if (f->fd < 0) { 1262fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe td_vmsg(td, errno, "socket"); 1272fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe return 1; 1282fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe } 129ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 1302fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe if (connect(f->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 1312fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe td_vmsg(td, errno, "connect"); 1322fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe return 1; 1332fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe } 134ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 135ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 136ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 137ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 138ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 139ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 140e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboestatic int fio_netio_setup_listen(struct thread_data *td, unsigned short port) 141ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 142ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct sockaddr_in addr; 143ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe socklen_t socklen; 1442fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe struct fio_file *f; 1452fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe int fd, opt, i; 146ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 147ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe fd = socket(AF_INET, SOCK_STREAM, 0); 148ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (fd < 0) { 149ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_vmsg(td, errno, "socket"); 150ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 151ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 152ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 153ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe opt = 1; 154ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { 155ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_vmsg(td, errno, "setsockopt"); 156ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 157ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 158ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 159ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe memset(&addr, 0, sizeof(addr)); 160ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe addr.sin_family = AF_INET; 161ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe addr.sin_addr.s_addr = htonl(INADDR_ANY); 162e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe addr.sin_port = htons(port); 163ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 164ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 165ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_vmsg(td, errno, "bind"); 166ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 167ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 168ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (listen(fd, 1) < 0) { 169ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td_vmsg(td, errno, "listen"); 170ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 171ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 172ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 1732fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe fprintf(f_out, "fio: waiting for %u connections\n", td->nr_files); 1742fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe 175ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe socklen = sizeof(addr); 1762fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe for_each_file(td, f, i) { 1772fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe f->fd = accept(fd, (struct sockaddr *) &addr, &socklen); 1782fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe if (f->fd < 0) { 1792fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe td_vmsg(td, errno, "accept"); 1802fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe return 1; 1812fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe } 182ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 183ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 184ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 185ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 186ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 187ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup(struct thread_data *td) 188ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 189e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe char host[64], buf[128]; 190ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct net_data *nd; 191e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe unsigned short port; 1922fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe struct fio_file *f; 193ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe char *sep; 1942fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe int ret, i; 195ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 196ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe /* 197ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * work around for late init call 198ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe */ 199ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (td->io_ops->init(td)) 200ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 201ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 202ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd = td->io_ops->data; 203ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 204ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (td->iomix) { 205ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe log_err("fio: network connections must be read OR write\n"); 206ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 207ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 208ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 209ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe strcpy(buf, td->filename); 210ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 211ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe sep = strchr(buf, ':'); 212ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (!sep) { 213ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe log_err("fio: bad network host:port <<%s>>\n", td->filename); 214ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 1; 215ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 216ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 217ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe *sep = '\0'; 218ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe sep++; 219ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe strcpy(host, buf); 220e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe port = atoi(sep); 221ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 222ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (td->ddir == READ) { 223ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd->send_to_net = 0; 224ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe ret = fio_netio_setup_listen(td, port); 225ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } else { 226ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd->send_to_net = 1; 227ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe ret = fio_netio_setup_connect(td, host, port); 228ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 229ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 2302fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe if (ret) 2312fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe return ret; 2322fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe 2332fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe td->io_size = td->total_file_size; 2342fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe td->total_io_size = td->io_size; 2352fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe 2362fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe for_each_file(td, f, i) { 2372fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe f->file_size = td->total_file_size / td->nr_files; 2382fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe f->real_file_size = f->file_size; 239ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 240ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 2412fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe return 0; 242ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 243ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 244ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_netio_cleanup(struct thread_data *td) 245ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 246ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (td->io_ops->data) { 247ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe free(td->io_ops->data); 248ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td->io_ops->data = NULL; 249ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe } 250ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 251ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 252ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_init(struct thread_data *td) 253ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 254ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe struct net_data *nd; 255ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 256e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe /* 257e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe * Hack to work-around the ->setup() function calling init on its 258e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe * own, since it needs ->io_ops->data to be set up. 259e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe */ 260ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe if (td->io_ops->data) 261ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 262ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 263ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd = malloc(sizeof(*nd)); 264ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe nd->last_io_u = NULL; 265ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe td->io_ops->data = nd; 266ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe return 0; 267ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 268ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 269ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic struct ioengine_ops ioengine = { 270ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .name = "net", 271ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .version = FIO_IOOPS_VERSION, 272ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .init = fio_netio_init, 273ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .prep = fio_netio_prep, 274ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .queue = fio_netio_queue, 275ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .getevents = fio_netio_getevents, 276ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .event = fio_netio_event, 277ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .cleanup = fio_netio_cleanup, 278ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .setup = fio_netio_setup, 279ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe .flags = FIO_SYNCIO | FIO_NETIO, 280ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}; 281ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 282ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_init fio_netio_register(void) 283ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 284ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe register_ioengine(&ioengine); 285ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 286ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe 287ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_exit fio_netio_unregister(void) 288ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{ 289ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe unregister_ioengine(&ioengine); 290ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe} 291