* 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/
#include <sys/time.h>
#include <sys/resource.h>
-#include <byteswap.h>
#include <pthread.h>
#include <inttypes.h>
#include "../fio.h"
#include "../hash.h"
-#ifdef FIO_HAVE_RDMA
-
#include <rdma/rdma_cma.h>
#include <infiniband/arch.h>
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",
return 1;
}
}
+#endif
+
+ return 0;
+}
+
+static int fio_rdmaio_init(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;
+
+ 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);
.flags = FIO_DISKLESSIO | FIO_UNIDIR | FIO_PIPEIO,
};
-#else /* FIO_HAVE_RDMA */
-
-static int fio_rdmaio_open_file(struct thread_data *td, struct fio_file *f)
-{
- return 0;
-}
-
-static int fio_rdmaio_close_file(struct thread_data *td, struct fio_file *f)
-{
- return 0;
-}
-
-static int fio_rdmaio_queue(struct thread_data *td, struct io_u *io_u)
-{
- return FIO_Q_COMPLETED;
-}
-
-static int fio_rdmaio_init(struct thread_data fio_unused * td)
-{
- log_err("fio: rdma(librdmacm libibverbs) not available\n");
- log_err(" You haven't compiled rdma ioengine into fio.\n");
- log_err(" If you want to try rdma ioengine,\n");
- log_err(" make sure OFED is installed,\n");
- log_err(" $ ofed_info\n");
- log_err(" then try to make fio as follows:\n");
- log_err(" $ export EXTFLAGS+=\" -DFIO_HAVE_RDMA \"\n");
- log_err(" $ export EXTLIBS+=\" -libverbs -lrdmacm \"\n");
- log_err(" $ make clean && make\n");
- return 1;
-}
-
-static struct ioengine_ops ioengine_rw = {
- .name = "rdma",
- .version = FIO_IOOPS_VERSION,
- .init = fio_rdmaio_init,
- .queue = fio_rdmaio_queue,
- .open_file = fio_rdmaio_open_file,
- .close_file = fio_rdmaio_close_file,
- .flags = FIO_SYNCIO | FIO_DISKLESSIO | FIO_UNIDIR | FIO_PIPEIO,
-};
-
-#endif
-
static void fio_init fio_rdmaio_register(void)
{
register_ioengine(&ioengine_rw);