Update for RDMA io engine's compatibility
[fio.git] / engines / rdma.c
index a847b541d3a0927dd3b575fa5a38fb3dc5832ff4..81f167367e90df6f9e2dd439e2ddfdc41f7c08e1 100644 (file)
@@ -5,12 +5,7 @@
  * Supports both RDMA memory semantics and channel semantics
  *   for the InfiniBand, RoCE and iWARP protocols.
  *
- * This I/O engine is disabled by default. To enable it, execute:
- *
- * $ export EXTFLAGS+=" -DFIO_HAVE_RDMA "
- * $ export EXTLIBS+=" -libverbs -lrdmacm "
- *
- * before running make. You will need the Linux RDMA software as well, either
+ * You will need the Linux RDMA software installed, either
  * from your Linux distributor or directly from openfabrics.org:
  *
  * http://www.openfabrics.org/downloads/OFED/
@@ -41,7 +36,6 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 
-#include <byteswap.h>
 #include <pthread.h>
 #include <inttypes.h>
 
@@ -534,10 +528,10 @@ static int fio_rdmaio_getevents(struct thread_data *td, unsigned int min,
 {
        struct rdmaio_data *rd = td->io_ops->data;
        enum ibv_wc_opcode comp_opcode;
-       comp_opcode = IBV_WC_RDMA_WRITE;
        struct ibv_cq *ev_cq;
        void *ev_ctx;
        int ret, r = 0;
+       comp_opcode = IBV_WC_RDMA_WRITE;
 
        switch (rd->rdma_protocol) {
        case FIO_RDMA_MEM_WRITE:
@@ -1018,26 +1012,11 @@ static int fio_rdmaio_setup_listen(struct thread_data *td, short port)
        return 0;
 }
 
-static int fio_rdmaio_init(struct thread_data *td)
+static int check_set_rlimits(struct thread_data *td)
 {
-       struct rdmaio_data *rd = td->io_ops->data;
-       struct flist_head *entry;
-       unsigned int max_bs;
-       unsigned int port;
-       char host[64], buf[128];
-       char *sep, *portp, *modep;
-       int ret, i = 0;
+#ifdef CONFIG_RLIMIT_MEMLOCK
        struct rlimit rl;
 
-       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;
-       }
-
        /* check RLIMIT_MEMLOCK */
        if (getrlimit(RLIMIT_MEMLOCK, &rl) != 0) {
                log_err("fio: getrlimit fail: %d(%s)\n",
@@ -1062,6 +1041,31 @@ static int fio_rdmaio_init(struct thread_data *td)
                        return 1;
                }
        }
+#endif
+
+       return 0;
+}
+
+static int fio_rdmaio_init(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;
+
+       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 (check_set_rlimits(td))
+               return 1;
 
        strcpy(buf, td->o.filename);
 
@@ -1148,8 +1152,8 @@ static int fio_rdmaio_init(struct thread_data *td)
 
        max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]);
        /* register each io_u in the free list */
-       flist_for_each(entry, &td->io_u_freelist) {
-               struct io_u *io_u = flist_entry(entry, struct io_u, list);
+       for (i = 0; i < td->io_u_freelist.nr; i++) {
+               struct io_u *io_u = td->io_u_freelist.io_us[i];
 
                io_u->engine_data = malloc(sizeof(struct rdma_io_u_data));
                memset(io_u->engine_data, 0, sizeof(struct rdma_io_u_data));
@@ -1172,7 +1176,6 @@ static int fio_rdmaio_init(struct thread_data *td)
 #if 0
                log_info("fio: Send rkey %x addr %" PRIx64 " len %d to client\n", io_u->mr->rkey, io_u->buf, max_bs); */
 #endif
-               i++;
        }
 
        rd->send_buf.nr = htonl(i);