#include <assert.h>
#include <infiniband/verbs.h>
#include <rdma/rdma_cma.h>
+#include <errno.h>
#ifdef __cplusplus
extern "C" {
#endif
+static inline int rdma_seterrno(int ret)
+{
+ if (ret) {
+ errno = ret;
+ ret = -1;
+ }
+ return ret;
+}
+
/*
* Memory registration helpers.
*/
static inline struct ibv_mr *
rdma_reg_read(struct rdma_cm_id *id, void *addr, size_t length)
{
- return ibv_reg_mr(id->qp->pd, addr, length, IBV_ACCESS_LOCAL_WRITE|
+ return ibv_reg_mr(id->qp->pd, addr, length, IBV_ACCESS_LOCAL_WRITE |
IBV_ACCESS_REMOTE_READ);
}
static inline int
rdma_dereg_mr(struct ibv_mr *mr)
{
- return ibv_dereg_mr(mr);
+ return rdma_seterrno(ibv_dereg_mr(mr));
}
wr.sg_list = sgl;
wr.num_sge = nsge;
- return ibv_post_recv(id->qp, &wr, &bad);
+ return rdma_seterrno(ibv_post_recv(id->qp, &wr, &bad));
}
static inline int
wr.opcode = IBV_WR_SEND;
wr.send_flags = flags;
- return ibv_post_send(id->qp, &wr, &bad);
+ return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
}
static inline int
wr.wr.rdma.remote_addr = remote_addr;
wr.wr.rdma.rkey = rkey;
- return ibv_post_send(id->qp, &wr, &bad);
+ return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
}
static inline int
wr.wr.rdma.remote_addr = remote_addr;
wr.wr.rdma.rkey = rkey;
- return ibv_post_send(id->qp, &wr, &bad);
+ return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
}
/*
wr.wr.ud.remote_qpn = remote_qpn;
wr.wr.ud.remote_qkey = RDMA_UDP_QKEY;
- return ibv_post_send(id->qp, &wr, &bad);
+ return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
}
static inline int
ret = ibv_poll_cq(id->send_cq, 1, wc);
if (ret)
- return ret;
+ goto out;
ret = ibv_req_notify_cq(id->send_cq, 0);
if (ret)
- return ret;
+ return rdma_seterrno(ret);
while (!(ret = ibv_poll_cq(id->send_cq, 1, wc))) {
ret = ibv_get_cq_event(id->send_cq_channel, &cq, &context);
if (ret)
- break;
+ return rdma_seterrno(ret);
assert(cq == id->send_cq && context == id);
ibv_ack_cq_events(id->send_cq, 1);
}
-
- return ret;
+out:
+ return (ret < 0) ? rdma_seterrno(ret) : ret;
}
static inline int
ret = ibv_poll_cq(id->recv_cq, 1, wc);
if (ret)
- return ret;
+ goto out;
ret = ibv_req_notify_cq(id->recv_cq, 0);
if (ret)
- return ret;
+ return rdma_seterrno(ret);
while (!(ret = ibv_poll_cq(id->recv_cq, 1, wc))) {
ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
if (ret)
- break;
+ return rdma_seterrno(ret);
assert(cq == id->recv_cq && context == id);
ibv_ack_cq_events(id->recv_cq, 1);
}
-
- return ret;
+out:
+ return (ret < 0) ? rdma_seterrno(ret) : ret;
}
#ifdef __cplusplus