X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Frdma.c;h=79d72d20c844d7f8a393c6e1e7873a3f5bbde99c;hb=5fb8d7912ebf6fabb9ad3a61c4cd316126af602e;hp=2eeb897278e02f81e8ba7c8b35673dc8a95400ba;hpb=21b8aee865f0d3960687ce6ba7385e5977f45061;p=fio.git diff --git a/engines/rdma.c b/engines/rdma.c index 2eeb8972..79d72d20 100644 --- a/engines/rdma.c +++ b/engines/rdma.c @@ -1,16 +1,17 @@ /* - * rdma engine + * RDMA I/O engine * - * RDMA IO engine using OFED library. - * Support both RDMA memory semantic and channel semantic - * in InfiniBand, RoCE and iWarp environment. + * RDMA I/O engine based on the IB verbs and RDMA/CM user space libraries. + * Supports both RDMA memory semantics and channel semantics + * for the InfiniBand, RoCE and iWARP protocols. * - * This is currently disabled. To enable it, execute: + * 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'll need the OFED as well: + * before running make. You will need the Linux RDMA software as well, either + * from your Linux distributor or directly from openfabrics.org: * * http://www.openfabrics.org/downloads/OFED/ * @@ -40,7 +41,7 @@ #include #include -#define FIO_RDMA_MAX_IO_DPETH 128 +#define FIO_RDMA_MAX_IO_DEPTH 128 enum rdma_io_mode { FIO_RDMA_UNKNOWN = 0, @@ -61,7 +62,7 @@ struct rdma_info_blk { uint32_t nr; /* client: io depth server: number of records for memory semantic */ - struct remote_u rmt_us[FIO_RDMA_MAX_IO_DPETH]; + struct remote_u rmt_us[FIO_RDMA_MAX_IO_DEPTH]; }; struct rdma_io_u_data { @@ -114,7 +115,7 @@ static int client_recv(struct thread_data *td, struct ibv_wc *wc) struct rdmaio_data *rd = td->io_ops->data; if (wc->byte_len != sizeof(rd->recv_buf)) { - fprintf(stderr, "Received bogus data, size %d\n", wc->byte_len); + log_err("Received bogus data, size %d\n", wc->byte_len); return 1; } @@ -145,7 +146,7 @@ static int server_recv(struct thread_data *td, struct ibv_wc *wc) { struct rdmaio_data *rd = td->io_ops->data; - if (wc->wr_id == FIO_RDMA_MAX_IO_DPETH) { + if (wc->wr_id == FIO_RDMA_MAX_IO_DEPTH) { rd->rdma_protocol = ntohl(rd->recv_buf.mode); /* CHANNEL semantic, do nothing */ @@ -183,7 +184,7 @@ static int cq_event_handler(struct thread_data *td, enum ibv_wc_opcode opcode) else server_recv(td, &wc); - if (wc.wr_id == FIO_RDMA_MAX_IO_DPETH) + if (wc.wr_id == FIO_RDMA_MAX_IO_DEPTH) break; for (i = 0; i < rd->io_u_flight_nr; i++) { @@ -204,7 +205,7 @@ static int cq_event_handler(struct thread_data *td, enum ibv_wc_opcode opcode) } } if (i == rd->io_u_flight_nr) - log_err("fio: recv wr %ld not found\n", + log_err("fio: recv wr %" PRId64 " not found\n", wc.wr_id); else { /* put the last one into middle of the list */ @@ -218,7 +219,7 @@ static int cq_event_handler(struct thread_data *td, enum ibv_wc_opcode opcode) case IBV_WC_SEND: case IBV_WC_RDMA_WRITE: case IBV_WC_RDMA_READ: - if (wc.wr_id == FIO_RDMA_MAX_IO_DPETH) + if (wc.wr_id == FIO_RDMA_MAX_IO_DEPTH) break; for (i = 0; i < rd->io_u_flight_nr; i++) { @@ -233,7 +234,7 @@ static int cq_event_handler(struct thread_data *td, enum ibv_wc_opcode opcode) } } if (i == rd->io_u_flight_nr) - log_err("fio: send wr %ld not found\n", + log_err("fio: send wr %" PRId64 " not found\n", wc.wr_id); else { /* put the last one into middle of the list */ @@ -405,7 +406,7 @@ static int fio_rdmaio_setup_control_msg_buffers(struct thread_data *td) rd->recv_sgl.lkey = rd->recv_mr->lkey; rd->rq_wr.sg_list = &rd->recv_sgl; rd->rq_wr.num_sge = 1; - rd->rq_wr.wr_id = FIO_RDMA_MAX_IO_DPETH; + rd->rq_wr.wr_id = FIO_RDMA_MAX_IO_DEPTH; /* send wq */ rd->send_sgl.addr = (uint64_t) (unsigned long)&rd->send_buf; @@ -416,7 +417,7 @@ static int fio_rdmaio_setup_control_msg_buffers(struct thread_data *td) rd->sq_wr.send_flags = IBV_SEND_SIGNALED; rd->sq_wr.sg_list = &rd->send_sgl; rd->sq_wr.num_sge = 1; - rd->sq_wr.wr_id = FIO_RDMA_MAX_IO_DPETH; + rd->sq_wr.wr_id = FIO_RDMA_MAX_IO_DEPTH; return 0; } @@ -586,8 +587,10 @@ static int fio_rdmaio_send(struct thread_data *td, struct io_u **io_us, { struct rdmaio_data *rd = td->io_ops->data; struct ibv_send_wr *bad_wr; +#if 0 enum ibv_wc_opcode comp_opcode; comp_opcode = IBV_WC_RDMA_WRITE; +#endif int i, index; struct rdma_io_u_data *r_io_u_d; @@ -602,8 +605,8 @@ static int fio_rdmaio_send(struct thread_data *td, struct io_u **io_us, index = rand() % rd->rmt_nr; r_io_u_d->sq_wr.opcode = IBV_WR_RDMA_WRITE; r_io_u_d->sq_wr.wr.rdma.rkey = rd->rmt_us[index].rkey; - r_io_u_d->sq_wr.wr.rdma.remote_addr = - rd->rmt_us[index].buf; + r_io_u_d->sq_wr.wr.rdma.remote_addr = \ + rd->rmt_us[index].buf; r_io_u_d->sq_wr.sg_list->length = io_us[i]->buflen; break; case FIO_RDMA_MEM_READ: @@ -612,8 +615,8 @@ static int fio_rdmaio_send(struct thread_data *td, struct io_u **io_us, index = rand() % rd->rmt_nr; r_io_u_d->sq_wr.opcode = IBV_WR_RDMA_READ; r_io_u_d->sq_wr.wr.rdma.rkey = rd->rmt_us[index].rkey; - r_io_u_d->sq_wr.wr.rdma.remote_addr = - rd->rmt_us[index].buf; + r_io_u_d->sq_wr.wr.rdma.remote_addr = \ + rd->rmt_us[index].buf; r_io_u_d->sq_wr.sg_list->length = io_us[i]->buflen; break; case FIO_RDMA_CHA_SEND: @@ -671,7 +674,8 @@ static int fio_rdmaio_recv(struct thread_data *td, struct io_u **io_us, rdma_poll_wait(td, IBV_WC_RECV); dprint(FD_IO, "fio: recv FINISH message\n"); - exit(0); + td->done = 1; + return 0; } return i; @@ -1017,8 +1021,9 @@ static int fio_rdmaio_init(struct thread_data *td) /* soft limit */ if ((rl.rlim_cur != RLIM_INFINITY) && (rl.rlim_cur < td->orig_buffer_size)) { - log_err("fio: soft RLIMIT_MEMLOCK is: %ld\n", rl.rlim_cur); - log_err("fio: total block size is: %ld\n", + log_err("fio: soft RLIMIT_MEMLOCK is: %" PRId64 "\n", + rl.rlim_cur); + log_err("fio: total block size is: %zd\n", td->orig_buffer_size); /* try to set larger RLIMIT_MEMLOCK */ rl.rlim_cur = rl.rlim_max; @@ -1087,9 +1092,9 @@ static int fio_rdmaio_init(struct thread_data *td) if ((rd->rdma_protocol == FIO_RDMA_MEM_WRITE) || (rd->rdma_protocol == FIO_RDMA_MEM_READ)) { rd->rmt_us = - malloc(FIO_RDMA_MAX_IO_DPETH * sizeof(struct remote_u)); + malloc(FIO_RDMA_MAX_IO_DEPTH * sizeof(struct remote_u)); memset(rd->rmt_us, 0, - FIO_RDMA_MAX_IO_DPETH * sizeof(struct remote_u)); + FIO_RDMA_MAX_IO_DEPTH * sizeof(struct remote_u)); rd->rmt_nr = 0; } @@ -1184,19 +1189,19 @@ 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, }; #else /* FIO_HAVE_RDMA */ @@ -1231,13 +1236,13 @@ static int fio_rdmaio_init(struct thread_data fio_unused * td) } 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, + .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