The following changes since commit b01af66b13f0594617602b61d31b1495292e5fd2:

  add eta and elapsed to root of json output (2015-06-22 14:34:04 -0700)

are available in the git repository at:

  git://git.kernel.dk/fio.git master

for you to fetch changes up to cdf91594d537b59588f3a95c4cc44336326faaf3:

  Modify rdma engine to use proper arguments. (2015-06-23 16:28:03 -0600)

----------------------------------------------------------------
Logan Gunthorpe (1):
      Modify rdma engine to use proper arguments.

 engines/rdma.c             | 212 +++++++++++++++++++++++++++++++++------------
 examples/rdmaio-client.fio |   6 +-
 examples/rdmaio-server.fio |   4 +-
 options.h                  |   2 +
 4 files changed, 163 insertions(+), 61 deletions(-)

---

Diff of recent changes:

diff --git a/engines/rdma.c b/engines/rdma.c
index c59d5dd..2ba34e4 100644
--- a/engines/rdma.c
+++ b/engines/rdma.c
@@ -55,6 +55,77 @@ enum rdma_io_mode {
        FIO_RDMA_CHA_RECV
 };
 
+struct rdmaio_options {
+       struct thread_data *td;
+       unsigned int port;
+       enum rdma_io_mode verb;
+};
+
+static int str_hostname_cb(void *data, const char *input)
+{
+       struct rdmaio_options *o = data;
+
+       if (o->td->o.filename)
+               free(o->td->o.filename);
+       o->td->o.filename = strdup(input);
+       return 0;
+}
+
+static struct fio_option options[] = {
+       {
+               .name   = "hostname",
+               .lname  = "rdma engine hostname",
+               .type   = FIO_OPT_STR_STORE,
+               .cb     = str_hostname_cb,
+               .help   = "Hostname for RDMA IO engine",
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_RDMA,
+       },
+       {
+               .name   = "port",
+               .lname  = "rdma engine port",
+               .type   = FIO_OPT_INT,
+               .off1   = offsetof(struct rdmaio_options, port),
+               .minval = 1,
+               .maxval = 65535,
+               .help   = "Port to use for RDMA connections",
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_RDMA,
+       },
+       {
+               .name   = "verb",
+               .lname  = "RDMA engine verb",
+               .alias  = "proto",
+               .type   = FIO_OPT_STR,
+               .off1   = offsetof(struct rdmaio_options, verb),
+               .help   = "RDMA engine verb",
+               .def    = "write",
+               .posval = {
+                         { .ival = "write",
+                           .oval = FIO_RDMA_MEM_WRITE,
+                           .help = "Memory Write",
+                         },
+                         { .ival = "read",
+                           .oval = FIO_RDMA_MEM_READ,
+                           .help = "Memory Read",
+                         },
+                         { .ival = "send",
+                           .oval = FIO_RDMA_CHA_SEND,
+                           .help = "Posted Send",
+                         },
+                         { .ival = "recv",
+                           .oval = FIO_RDMA_CHA_RECV,
+                           .help = "Posted Recieve",
+                         },
+               },
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_RDMA,
+       },
+       {
+               .name   = NULL,
+       },
+};
+
 struct remote_u {
        uint64_t buf;
        uint32_t rkey;
@@ -1046,66 +1117,88 @@ static int check_set_rlimits(struct thread_data *td)
        return 0;
 }
 
-static int fio_rdmaio_init(struct thread_data *td)
+static int compat_options(struct thread_data *td)
 {
-       struct rdmaio_data *rd = td->io_ops->data;
-       unsigned int max_bs;
-       unsigned int port;
-       char host[64], buf[128];
-       char *sep, *portp, *modep;
-       int ret, i;
+       // The original RDMA engine had an ugly / seperator
+       // on the filename for it's options. This function
+       // retains backwards compatibility with it.100
 
-       if (td_rw(td)) {
-               log_err("fio: rdma connections must be read OR write\n");
-               return 1;
-       }
-       if (td_random(td)) {
-               log_err("fio: RDMA network IO can't be random\n");
-               return 1;
-       }
+       struct rdmaio_options *o = td->eo;
+       char *modep, *portp;
+       char *filename = td->o.filename;
 
-       if (check_set_rlimits(td))
-               return 1;
+       if (!filename)
+               return 0;
 
-       strcpy(buf, td->o.filename);
+       portp = strchr(filename, '/');
+       if (portp == NULL)
+               return 0;
 
-       sep = strchr(buf, '/');
-       if (!sep)
-               goto bad_host;
+       *portp = '\0';
+       portp++;
 
-       *sep = '\0';
-       sep++;
-       strcpy(host, buf);
-       if (!strlen(host))
+       o->port = strtol(portp, NULL, 10);
+       if (!o->port || o->port > 65535)
                goto bad_host;
 
-       modep = NULL;
-       portp = sep;
-       sep = strchr(portp, '/');
-       if (sep) {
-               *sep = '\0';
-               modep = sep + 1;
+       modep = strchr(portp, '/');
+       if (modep != NULL) {
+               *modep = '\0';
+               modep++;
        }
 
-       port = strtol(portp, NULL, 10);
-       if (!port || port > 65535)
-               goto bad_host;
-
        if (modep) {
                if (!strncmp("rdma_write", modep, strlen(modep)) ||
                    !strncmp("RDMA_WRITE", modep, strlen(modep)))
-                       rd->rdma_protocol = FIO_RDMA_MEM_WRITE;
+                       o->verb = FIO_RDMA_MEM_WRITE;
                else if (!strncmp("rdma_read", modep, strlen(modep)) ||
                         !strncmp("RDMA_READ", modep, strlen(modep)))
-                       rd->rdma_protocol = FIO_RDMA_MEM_READ;
+                       o->verb = FIO_RDMA_MEM_READ;
                else if (!strncmp("send", modep, strlen(modep)) ||
                         !strncmp("SEND", modep, strlen(modep)))
-                       rd->rdma_protocol = FIO_RDMA_CHA_SEND;
+                       o->verb = FIO_RDMA_CHA_SEND;
                else
                        goto bad_host;
        } else
-               rd->rdma_protocol = FIO_RDMA_MEM_WRITE;
+               o->verb = FIO_RDMA_MEM_WRITE;
+
+
+       return 0;
 
+bad_host:
+       log_err("fio: bad rdma host/port/protocol: %s\n", td->o.filename);
+       return 1;
+}
+
+static int fio_rdmaio_init(struct thread_data *td)
+{
+       struct rdmaio_data *rd = td->io_ops->data;
+       struct rdmaio_options *o = td->eo;
+       unsigned int max_bs;
+       int ret, i;
+
+       if (td_rw(td)) {
+               log_err("fio: rdma connections must be read OR write\n");
+               return 1;
+       }
+       if (td_random(td)) {
+               log_err("fio: RDMA network IO can't be random\n");
+               return 1;
+       }
+
+       if (compat_options(td))
+               return 1;
+
+       if (!o->port) {
+               log_err("fio: no port has been specified which is required "
+                       "for the rdma engine\n");
+               return 1;
+       }
+
+       if (check_set_rlimits(td))
+               return 1;
+
+       rd->rdma_protocol = o->verb;
        rd->cq_event_num = 0;
 
        rd->cm_channel = rdma_create_event_channel();
@@ -1144,10 +1237,10 @@ static int fio_rdmaio_init(struct thread_data *td)
        if (td_read(td)) {      /* READ as the server */
                rd->is_client = 0;
                /* server rd->rdma_buf_len will be setup after got request */
-               ret = fio_rdmaio_setup_listen(td, port);
+               ret = fio_rdmaio_setup_listen(td, o->port);
        } else {                /* WRITE as the client */
                rd->is_client = 1;
-               ret = fio_rdmaio_setup_connect(td, host, port);
+               ret = fio_rdmaio_setup_connect(td, td->o.filename, o->port);
        }
 
        max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]);
@@ -1181,9 +1274,6 @@ static int fio_rdmaio_init(struct thread_data *td)
        rd->send_buf.nr = htonl(i);
 
        return ret;
-bad_host:
-       log_err("fio: bad rdma host/port/protocol: %s\n", td->o.filename);
-       return 1;
 }
 
 static void fio_rdmaio_cleanup(struct thread_data *td)
@@ -1198,6 +1288,12 @@ static int fio_rdmaio_setup(struct thread_data *td)
 {
        struct rdmaio_data *rd;
 
+       if (!td->files_index) {
+               add_file(td, td->o.filename ?: "rdma", 0, 0);
+               td->o.nr_files = td->o.nr_files ?: 1;
+               td->o.open_files++;
+       }
+
        if (!td->io_ops->data) {
                rd = malloc(sizeof(*rd));
 
@@ -1210,19 +1306,21 @@ static int fio_rdmaio_setup(struct thread_data *td)
 }
 
 static struct ioengine_ops ioengine_rw = {
-       .name           = "rdma",
-       .version        = FIO_IOOPS_VERSION,
-       .setup          = fio_rdmaio_setup,
-       .init           = fio_rdmaio_init,
-       .prep           = fio_rdmaio_prep,
-       .queue          = fio_rdmaio_queue,
-       .commit         = fio_rdmaio_commit,
-       .getevents      = fio_rdmaio_getevents,
-       .event          = fio_rdmaio_event,
-       .cleanup        = fio_rdmaio_cleanup,
-       .open_file      = fio_rdmaio_open_file,
-       .close_file     = fio_rdmaio_close_file,
-       .flags          = FIO_DISKLESSIO | FIO_UNIDIR | FIO_PIPEIO,
+       .name                   = "rdma",
+       .version                = FIO_IOOPS_VERSION,
+       .setup                  = fio_rdmaio_setup,
+       .init                   = fio_rdmaio_init,
+       .prep                   = fio_rdmaio_prep,
+       .queue                  = fio_rdmaio_queue,
+       .commit                 = fio_rdmaio_commit,
+       .getevents              = fio_rdmaio_getevents,
+       .event                  = fio_rdmaio_event,
+       .cleanup                = fio_rdmaio_cleanup,
+       .open_file              = fio_rdmaio_open_file,
+       .close_file             = fio_rdmaio_close_file,
+       .flags                  = FIO_DISKLESSIO | FIO_UNIDIR | FIO_PIPEIO,
+       .options                = options,
+       .option_struct_size     = sizeof(struct rdmaio_options),
 };
 
 static void fio_init fio_rdmaio_register(void)
diff --git a/examples/rdmaio-client.fio b/examples/rdmaio-client.fio
index 7c660c9..286aa21 100644
--- a/examples/rdmaio-client.fio
+++ b/examples/rdmaio-client.fio
@@ -1,11 +1,13 @@
 # Example rdma client job
 [global]
 ioengine=rdma
-filename=[ip_addr]/[port]/[RDMA_WRITE/RDMA_READ/SEND]
+hostname=[hostname]
+port=[port]
+verb=[read/write/send/recv]
 bs=1m
 size=100g
 
 [sender]
 rw=write
 iodepth=1
-iodepth_batch_complete=1
\ No newline at end of file
+iodepth_batch_complete=1
diff --git a/examples/rdmaio-server.fio b/examples/rdmaio-server.fio
index 9348859..ee30856 100644
--- a/examples/rdmaio-server.fio
+++ b/examples/rdmaio-server.fio
@@ -1,10 +1,10 @@
 # Example rdma server job
 [global]
 ioengine=rdma
-filename=[ip_addr]/[port]
+port=[port]
 bs=1m
 size=100g
 
 [receiver]
 rw=read
-iodepth=16
\ No newline at end of file
+iodepth=16
diff --git a/options.h b/options.h
index 6805b31..fd6ad92 100644
--- a/options.h
+++ b/options.h
@@ -112,6 +112,7 @@ enum opt_category_group {
        __FIO_OPT_G_ERR,
        __FIO_OPT_G_E4DEFRAG,
        __FIO_OPT_G_NETIO,
+       __FIO_OPT_G_RDMA,
        __FIO_OPT_G_LIBAIO,
        __FIO_OPT_G_ACT,
        __FIO_OPT_G_LATPROF,
@@ -144,6 +145,7 @@ enum opt_category_group {
        FIO_OPT_G_ERR           = (1U << __FIO_OPT_G_ERR),
        FIO_OPT_G_E4DEFRAG      = (1U << __FIO_OPT_G_E4DEFRAG),
        FIO_OPT_G_NETIO         = (1U << __FIO_OPT_G_NETIO),
+       FIO_OPT_G_RDMA          = (1U << __FIO_OPT_G_RDMA),
        FIO_OPT_G_LIBAIO        = (1U << __FIO_OPT_G_LIBAIO),
        FIO_OPT_G_ACT           = (1U << __FIO_OPT_G_ACT),
        FIO_OPT_G_LATPROF       = (1U << __FIO_OPT_G_LATPROF),
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to