xref: /freebsd/contrib/ofed/librdmacm/rdma_verbs.h (revision d6b92ffa)
1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2010-2014 Intel Corporation.  All rights reserved.
3d6b92ffaSHans Petter Selasky  *
4d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
5d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
6d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
7d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
8d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
9d6b92ffaSHans Petter Selasky  *
10d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
11d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
12d6b92ffaSHans Petter Selasky  *     conditions are met:
13d6b92ffaSHans Petter Selasky  *
14d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
15d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
16d6b92ffaSHans Petter Selasky  *        disclaimer.
17d6b92ffaSHans Petter Selasky  *
18d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
19d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
20d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
21d6b92ffaSHans Petter Selasky  *        provided with the distribution.
22d6b92ffaSHans Petter Selasky  *
23d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30d6b92ffaSHans Petter Selasky  * SOFTWARE.
31d6b92ffaSHans Petter Selasky  */
32d6b92ffaSHans Petter Selasky 
33d6b92ffaSHans Petter Selasky #if !defined(RDMA_VERBS_H)
34d6b92ffaSHans Petter Selasky #define RDMA_VERBS_H
35d6b92ffaSHans Petter Selasky 
36d6b92ffaSHans Petter Selasky #include <assert.h>
37d6b92ffaSHans Petter Selasky #include <infiniband/verbs.h>
38d6b92ffaSHans Petter Selasky #include <rdma/rdma_cma.h>
39d6b92ffaSHans Petter Selasky #include <errno.h>
40d6b92ffaSHans Petter Selasky 
41d6b92ffaSHans Petter Selasky #ifdef __cplusplus
42d6b92ffaSHans Petter Selasky extern "C" {
43d6b92ffaSHans Petter Selasky #endif
44d6b92ffaSHans Petter Selasky 
rdma_seterrno(int ret)45d6b92ffaSHans Petter Selasky static inline int rdma_seterrno(int ret)
46d6b92ffaSHans Petter Selasky {
47d6b92ffaSHans Petter Selasky 	if (ret) {
48d6b92ffaSHans Petter Selasky 		errno = ret;
49d6b92ffaSHans Petter Selasky 		ret = -1;
50d6b92ffaSHans Petter Selasky 	}
51d6b92ffaSHans Petter Selasky 	return ret;
52d6b92ffaSHans Petter Selasky }
53d6b92ffaSHans Petter Selasky 
54d6b92ffaSHans Petter Selasky /*
55d6b92ffaSHans Petter Selasky  * Shared receive queues.
56d6b92ffaSHans Petter Selasky  */
57d6b92ffaSHans Petter Selasky int rdma_create_srq(struct rdma_cm_id *id, struct ibv_pd *pd,
58d6b92ffaSHans Petter Selasky 		    struct ibv_srq_init_attr *attr);
59d6b92ffaSHans Petter Selasky int rdma_create_srq_ex(struct rdma_cm_id *id, struct ibv_srq_init_attr_ex *attr);
60d6b92ffaSHans Petter Selasky 
61d6b92ffaSHans Petter Selasky void rdma_destroy_srq(struct rdma_cm_id *id);
62d6b92ffaSHans Petter Selasky 
63d6b92ffaSHans Petter Selasky 
64d6b92ffaSHans Petter Selasky /*
65d6b92ffaSHans Petter Selasky  * Memory registration helpers.
66d6b92ffaSHans Petter Selasky  */
67d6b92ffaSHans Petter Selasky static inline struct ibv_mr *
rdma_reg_msgs(struct rdma_cm_id * id,void * addr,size_t length)68d6b92ffaSHans Petter Selasky rdma_reg_msgs(struct rdma_cm_id *id, void *addr, size_t length)
69d6b92ffaSHans Petter Selasky {
70d6b92ffaSHans Petter Selasky 	return ibv_reg_mr(id->pd, addr, length, IBV_ACCESS_LOCAL_WRITE);
71d6b92ffaSHans Petter Selasky }
72d6b92ffaSHans Petter Selasky 
73d6b92ffaSHans Petter Selasky static inline struct ibv_mr *
rdma_reg_read(struct rdma_cm_id * id,void * addr,size_t length)74d6b92ffaSHans Petter Selasky rdma_reg_read(struct rdma_cm_id *id, void *addr, size_t length)
75d6b92ffaSHans Petter Selasky {
76d6b92ffaSHans Petter Selasky 	return ibv_reg_mr(id->pd, addr, length, IBV_ACCESS_LOCAL_WRITE |
77d6b92ffaSHans Petter Selasky 						IBV_ACCESS_REMOTE_READ);
78d6b92ffaSHans Petter Selasky }
79d6b92ffaSHans Petter Selasky 
80d6b92ffaSHans Petter Selasky static inline struct ibv_mr *
rdma_reg_write(struct rdma_cm_id * id,void * addr,size_t length)81d6b92ffaSHans Petter Selasky rdma_reg_write(struct rdma_cm_id *id, void *addr, size_t length)
82d6b92ffaSHans Petter Selasky {
83d6b92ffaSHans Petter Selasky 	return ibv_reg_mr(id->pd, addr, length, IBV_ACCESS_LOCAL_WRITE |
84d6b92ffaSHans Petter Selasky 						IBV_ACCESS_REMOTE_WRITE);
85d6b92ffaSHans Petter Selasky }
86d6b92ffaSHans Petter Selasky 
87d6b92ffaSHans Petter Selasky static inline int
rdma_dereg_mr(struct ibv_mr * mr)88d6b92ffaSHans Petter Selasky rdma_dereg_mr(struct ibv_mr *mr)
89d6b92ffaSHans Petter Selasky {
90d6b92ffaSHans Petter Selasky 	return rdma_seterrno(ibv_dereg_mr(mr));
91d6b92ffaSHans Petter Selasky }
92d6b92ffaSHans Petter Selasky 
93d6b92ffaSHans Petter Selasky 
94d6b92ffaSHans Petter Selasky /*
95d6b92ffaSHans Petter Selasky  * Vectored send, receive, and RDMA operations.
96d6b92ffaSHans Petter Selasky  * Support multiple scatter-gather entries.
97d6b92ffaSHans Petter Selasky  */
98d6b92ffaSHans Petter Selasky static inline int
rdma_post_recvv(struct rdma_cm_id * id,void * context,struct ibv_sge * sgl,int nsge)99d6b92ffaSHans Petter Selasky rdma_post_recvv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
100d6b92ffaSHans Petter Selasky 		int nsge)
101d6b92ffaSHans Petter Selasky {
102d6b92ffaSHans Petter Selasky 	struct ibv_recv_wr wr, *bad;
103d6b92ffaSHans Petter Selasky 
104d6b92ffaSHans Petter Selasky 	wr.wr_id = (uintptr_t) context;
105d6b92ffaSHans Petter Selasky 	wr.next = NULL;
106d6b92ffaSHans Petter Selasky 	wr.sg_list = sgl;
107d6b92ffaSHans Petter Selasky 	wr.num_sge = nsge;
108d6b92ffaSHans Petter Selasky 
109d6b92ffaSHans Petter Selasky 	if (id->srq)
110d6b92ffaSHans Petter Selasky 		return rdma_seterrno(ibv_post_srq_recv(id->srq, &wr, &bad));
111d6b92ffaSHans Petter Selasky 	else
112d6b92ffaSHans Petter Selasky 		return rdma_seterrno(ibv_post_recv(id->qp, &wr, &bad));
113d6b92ffaSHans Petter Selasky }
114d6b92ffaSHans Petter Selasky 
115d6b92ffaSHans Petter Selasky static inline int
rdma_post_sendv(struct rdma_cm_id * id,void * context,struct ibv_sge * sgl,int nsge,int flags)116d6b92ffaSHans Petter Selasky rdma_post_sendv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
117d6b92ffaSHans Petter Selasky 		int nsge, int flags)
118d6b92ffaSHans Petter Selasky {
119d6b92ffaSHans Petter Selasky 	struct ibv_send_wr wr, *bad;
120d6b92ffaSHans Petter Selasky 
121d6b92ffaSHans Petter Selasky 	wr.wr_id = (uintptr_t) context;
122d6b92ffaSHans Petter Selasky 	wr.next = NULL;
123d6b92ffaSHans Petter Selasky 	wr.sg_list = sgl;
124d6b92ffaSHans Petter Selasky 	wr.num_sge = nsge;
125d6b92ffaSHans Petter Selasky 	wr.opcode = IBV_WR_SEND;
126d6b92ffaSHans Petter Selasky 	wr.send_flags = flags;
127d6b92ffaSHans Petter Selasky 
128d6b92ffaSHans Petter Selasky 	return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
129d6b92ffaSHans Petter Selasky }
130d6b92ffaSHans Petter Selasky 
131d6b92ffaSHans Petter Selasky static inline int
rdma_post_readv(struct rdma_cm_id * id,void * context,struct ibv_sge * sgl,int nsge,int flags,uint64_t remote_addr,uint32_t rkey)132d6b92ffaSHans Petter Selasky rdma_post_readv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
133d6b92ffaSHans Petter Selasky 		int nsge, int flags, uint64_t remote_addr, uint32_t rkey)
134d6b92ffaSHans Petter Selasky {
135d6b92ffaSHans Petter Selasky 	struct ibv_send_wr wr, *bad;
136d6b92ffaSHans Petter Selasky 
137d6b92ffaSHans Petter Selasky 	wr.wr_id = (uintptr_t) context;
138d6b92ffaSHans Petter Selasky 	wr.next = NULL;
139d6b92ffaSHans Petter Selasky 	wr.sg_list = sgl;
140d6b92ffaSHans Petter Selasky 	wr.num_sge = nsge;
141d6b92ffaSHans Petter Selasky 	wr.opcode = IBV_WR_RDMA_READ;
142d6b92ffaSHans Petter Selasky 	wr.send_flags = flags;
143d6b92ffaSHans Petter Selasky 	wr.wr.rdma.remote_addr = remote_addr;
144d6b92ffaSHans Petter Selasky 	wr.wr.rdma.rkey = rkey;
145d6b92ffaSHans Petter Selasky 
146d6b92ffaSHans Petter Selasky 	return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
147d6b92ffaSHans Petter Selasky }
148d6b92ffaSHans Petter Selasky 
149d6b92ffaSHans Petter Selasky static inline int
rdma_post_writev(struct rdma_cm_id * id,void * context,struct ibv_sge * sgl,int nsge,int flags,uint64_t remote_addr,uint32_t rkey)150d6b92ffaSHans Petter Selasky rdma_post_writev(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
151d6b92ffaSHans Petter Selasky 		 int nsge, int flags, uint64_t remote_addr, uint32_t rkey)
152d6b92ffaSHans Petter Selasky {
153d6b92ffaSHans Petter Selasky 	struct ibv_send_wr wr, *bad;
154d6b92ffaSHans Petter Selasky 
155d6b92ffaSHans Petter Selasky 	wr.wr_id = (uintptr_t) context;
156d6b92ffaSHans Petter Selasky 	wr.next = NULL;
157d6b92ffaSHans Petter Selasky 	wr.sg_list = sgl;
158d6b92ffaSHans Petter Selasky 	wr.num_sge = nsge;
159d6b92ffaSHans Petter Selasky 	wr.opcode = IBV_WR_RDMA_WRITE;
160d6b92ffaSHans Petter Selasky 	wr.send_flags = flags;
161d6b92ffaSHans Petter Selasky 	wr.wr.rdma.remote_addr = remote_addr;
162d6b92ffaSHans Petter Selasky 	wr.wr.rdma.rkey = rkey;
163d6b92ffaSHans Petter Selasky 
164d6b92ffaSHans Petter Selasky 	return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
165d6b92ffaSHans Petter Selasky }
166d6b92ffaSHans Petter Selasky 
167d6b92ffaSHans Petter Selasky /*
168d6b92ffaSHans Petter Selasky  * Simple send, receive, and RDMA calls.
169d6b92ffaSHans Petter Selasky  */
170d6b92ffaSHans Petter Selasky static inline int
rdma_post_recv(struct rdma_cm_id * id,void * context,void * addr,size_t length,struct ibv_mr * mr)171d6b92ffaSHans Petter Selasky rdma_post_recv(struct rdma_cm_id *id, void *context, void *addr,
172d6b92ffaSHans Petter Selasky 	       size_t length, struct ibv_mr *mr)
173d6b92ffaSHans Petter Selasky {
174d6b92ffaSHans Petter Selasky 	struct ibv_sge sge;
175d6b92ffaSHans Petter Selasky 
176d6b92ffaSHans Petter Selasky 	assert((addr >= mr->addr) &&
177d6b92ffaSHans Petter Selasky 		(((uint8_t *) addr + length) <= ((uint8_t *) mr->addr + mr->length)));
178d6b92ffaSHans Petter Selasky 	sge.addr = (uint64_t) (uintptr_t) addr;
179d6b92ffaSHans Petter Selasky 	sge.length = (uint32_t) length;
180d6b92ffaSHans Petter Selasky 	sge.lkey = mr->lkey;
181d6b92ffaSHans Petter Selasky 
182d6b92ffaSHans Petter Selasky 	return rdma_post_recvv(id, context, &sge, 1);
183d6b92ffaSHans Petter Selasky }
184d6b92ffaSHans Petter Selasky 
185d6b92ffaSHans Petter Selasky static inline int
rdma_post_send(struct rdma_cm_id * id,void * context,void * addr,size_t length,struct ibv_mr * mr,int flags)186d6b92ffaSHans Petter Selasky rdma_post_send(struct rdma_cm_id *id, void *context, void *addr,
187d6b92ffaSHans Petter Selasky 	       size_t length, struct ibv_mr *mr, int flags)
188d6b92ffaSHans Petter Selasky {
189d6b92ffaSHans Petter Selasky 	struct ibv_sge sge;
190d6b92ffaSHans Petter Selasky 
191d6b92ffaSHans Petter Selasky 	sge.addr = (uint64_t) (uintptr_t) addr;
192d6b92ffaSHans Petter Selasky 	sge.length = (uint32_t) length;
193d6b92ffaSHans Petter Selasky 	sge.lkey = mr ? mr->lkey : 0;
194d6b92ffaSHans Petter Selasky 
195d6b92ffaSHans Petter Selasky 	return rdma_post_sendv(id, context, &sge, 1, flags);
196d6b92ffaSHans Petter Selasky }
197d6b92ffaSHans Petter Selasky 
198d6b92ffaSHans Petter Selasky static inline int
rdma_post_read(struct rdma_cm_id * id,void * context,void * addr,size_t length,struct ibv_mr * mr,int flags,uint64_t remote_addr,uint32_t rkey)199d6b92ffaSHans Petter Selasky rdma_post_read(struct rdma_cm_id *id, void *context, void *addr,
200d6b92ffaSHans Petter Selasky 	       size_t length, struct ibv_mr *mr, int flags,
201d6b92ffaSHans Petter Selasky 	       uint64_t remote_addr, uint32_t rkey)
202d6b92ffaSHans Petter Selasky {
203d6b92ffaSHans Petter Selasky 	struct ibv_sge sge;
204d6b92ffaSHans Petter Selasky 
205d6b92ffaSHans Petter Selasky 	sge.addr = (uint64_t) (uintptr_t) addr;
206d6b92ffaSHans Petter Selasky 	sge.length = (uint32_t) length;
207d6b92ffaSHans Petter Selasky 	sge.lkey = mr->lkey;
208d6b92ffaSHans Petter Selasky 
209d6b92ffaSHans Petter Selasky 	return rdma_post_readv(id, context, &sge, 1, flags, remote_addr, rkey);
210d6b92ffaSHans Petter Selasky }
211d6b92ffaSHans Petter Selasky 
212d6b92ffaSHans Petter Selasky static inline int
rdma_post_write(struct rdma_cm_id * id,void * context,void * addr,size_t length,struct ibv_mr * mr,int flags,uint64_t remote_addr,uint32_t rkey)213d6b92ffaSHans Petter Selasky rdma_post_write(struct rdma_cm_id *id, void *context, void *addr,
214d6b92ffaSHans Petter Selasky 		size_t length, struct ibv_mr *mr, int flags,
215d6b92ffaSHans Petter Selasky 		uint64_t remote_addr, uint32_t rkey)
216d6b92ffaSHans Petter Selasky {
217d6b92ffaSHans Petter Selasky 	struct ibv_sge sge;
218d6b92ffaSHans Petter Selasky 
219d6b92ffaSHans Petter Selasky 	sge.addr = (uint64_t) (uintptr_t) addr;
220d6b92ffaSHans Petter Selasky 	sge.length = (uint32_t) length;
221d6b92ffaSHans Petter Selasky 	sge.lkey = mr ? mr->lkey : 0;
222d6b92ffaSHans Petter Selasky 
223d6b92ffaSHans Petter Selasky 	return rdma_post_writev(id, context, &sge, 1, flags, remote_addr, rkey);
224d6b92ffaSHans Petter Selasky }
225d6b92ffaSHans Petter Selasky 
226d6b92ffaSHans Petter Selasky static inline int
rdma_post_ud_send(struct rdma_cm_id * id,void * context,void * addr,size_t length,struct ibv_mr * mr,int flags,struct ibv_ah * ah,uint32_t remote_qpn)227d6b92ffaSHans Petter Selasky rdma_post_ud_send(struct rdma_cm_id *id, void *context, void *addr,
228d6b92ffaSHans Petter Selasky 		  size_t length, struct ibv_mr *mr, int flags,
229d6b92ffaSHans Petter Selasky 		  struct ibv_ah *ah, uint32_t remote_qpn)
230d6b92ffaSHans Petter Selasky {
231d6b92ffaSHans Petter Selasky 	struct ibv_send_wr wr, *bad;
232d6b92ffaSHans Petter Selasky 	struct ibv_sge sge;
233d6b92ffaSHans Petter Selasky 
234d6b92ffaSHans Petter Selasky 	sge.addr = (uint64_t) (uintptr_t) addr;
235d6b92ffaSHans Petter Selasky 	sge.length = (uint32_t) length;
236d6b92ffaSHans Petter Selasky 	sge.lkey = mr ? mr->lkey : 0;
237d6b92ffaSHans Petter Selasky 
238d6b92ffaSHans Petter Selasky 	wr.wr_id = (uintptr_t) context;
239d6b92ffaSHans Petter Selasky 	wr.next = NULL;
240d6b92ffaSHans Petter Selasky 	wr.sg_list = &sge;
241d6b92ffaSHans Petter Selasky 	wr.num_sge = 1;
242d6b92ffaSHans Petter Selasky 	wr.opcode = IBV_WR_SEND;
243d6b92ffaSHans Petter Selasky 	wr.send_flags = flags;
244d6b92ffaSHans Petter Selasky 	wr.wr.ud.ah = ah;
245d6b92ffaSHans Petter Selasky 	wr.wr.ud.remote_qpn = remote_qpn;
246d6b92ffaSHans Petter Selasky 	wr.wr.ud.remote_qkey = RDMA_UDP_QKEY;
247d6b92ffaSHans Petter Selasky 
248d6b92ffaSHans Petter Selasky 	return rdma_seterrno(ibv_post_send(id->qp, &wr, &bad));
249d6b92ffaSHans Petter Selasky }
250d6b92ffaSHans Petter Selasky 
251d6b92ffaSHans Petter Selasky static inline int
rdma_get_send_comp(struct rdma_cm_id * id,struct ibv_wc * wc)252d6b92ffaSHans Petter Selasky rdma_get_send_comp(struct rdma_cm_id *id, struct ibv_wc *wc)
253d6b92ffaSHans Petter Selasky {
254d6b92ffaSHans Petter Selasky 	struct ibv_cq *cq;
255d6b92ffaSHans Petter Selasky 	void *context;
256d6b92ffaSHans Petter Selasky 	int ret;
257d6b92ffaSHans Petter Selasky 
258d6b92ffaSHans Petter Selasky 	do {
259d6b92ffaSHans Petter Selasky 		ret = ibv_poll_cq(id->send_cq, 1, wc);
260d6b92ffaSHans Petter Selasky 		if (ret)
261d6b92ffaSHans Petter Selasky 			break;
262d6b92ffaSHans Petter Selasky 
263d6b92ffaSHans Petter Selasky 		ret = ibv_req_notify_cq(id->send_cq, 0);
264d6b92ffaSHans Petter Selasky 		if (ret)
265d6b92ffaSHans Petter Selasky 			return rdma_seterrno(ret);
266d6b92ffaSHans Petter Selasky 
267d6b92ffaSHans Petter Selasky 		ret = ibv_poll_cq(id->send_cq, 1, wc);
268d6b92ffaSHans Petter Selasky 		if (ret)
269d6b92ffaSHans Petter Selasky 			break;
270d6b92ffaSHans Petter Selasky 
271d6b92ffaSHans Petter Selasky 		ret = ibv_get_cq_event(id->send_cq_channel, &cq, &context);
272d6b92ffaSHans Petter Selasky 		if (ret)
273d6b92ffaSHans Petter Selasky 			return ret;
274d6b92ffaSHans Petter Selasky 
275d6b92ffaSHans Petter Selasky 		assert(cq == id->send_cq && context == id);
276d6b92ffaSHans Petter Selasky 		ibv_ack_cq_events(id->send_cq, 1);
277d6b92ffaSHans Petter Selasky 	} while (1);
278d6b92ffaSHans Petter Selasky 
279d6b92ffaSHans Petter Selasky 	return (ret < 0) ? rdma_seterrno(ret) : ret;
280d6b92ffaSHans Petter Selasky }
281d6b92ffaSHans Petter Selasky 
282d6b92ffaSHans Petter Selasky static inline int
rdma_get_recv_comp(struct rdma_cm_id * id,struct ibv_wc * wc)283d6b92ffaSHans Petter Selasky rdma_get_recv_comp(struct rdma_cm_id *id, struct ibv_wc *wc)
284d6b92ffaSHans Petter Selasky {
285d6b92ffaSHans Petter Selasky 	struct ibv_cq *cq;
286d6b92ffaSHans Petter Selasky 	void *context;
287d6b92ffaSHans Petter Selasky 	int ret;
288d6b92ffaSHans Petter Selasky 
289d6b92ffaSHans Petter Selasky 	do {
290d6b92ffaSHans Petter Selasky 		ret = ibv_poll_cq(id->recv_cq, 1, wc);
291d6b92ffaSHans Petter Selasky 		if (ret)
292d6b92ffaSHans Petter Selasky 			break;
293d6b92ffaSHans Petter Selasky 
294d6b92ffaSHans Petter Selasky 		ret = ibv_req_notify_cq(id->recv_cq, 0);
295d6b92ffaSHans Petter Selasky 		if (ret)
296d6b92ffaSHans Petter Selasky 			return rdma_seterrno(ret);
297d6b92ffaSHans Petter Selasky 
298d6b92ffaSHans Petter Selasky 		ret = ibv_poll_cq(id->recv_cq, 1, wc);
299d6b92ffaSHans Petter Selasky 		if (ret)
300d6b92ffaSHans Petter Selasky 			break;
301d6b92ffaSHans Petter Selasky 
302d6b92ffaSHans Petter Selasky 		ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
303d6b92ffaSHans Petter Selasky 		if (ret)
304d6b92ffaSHans Petter Selasky 			return ret;
305d6b92ffaSHans Petter Selasky 
306d6b92ffaSHans Petter Selasky 		assert(cq == id->recv_cq && context == id);
307d6b92ffaSHans Petter Selasky 		ibv_ack_cq_events(id->recv_cq, 1);
308d6b92ffaSHans Petter Selasky 	} while (1);
309d6b92ffaSHans Petter Selasky 
310d6b92ffaSHans Petter Selasky 	return (ret < 0) ? rdma_seterrno(ret) : ret;
311d6b92ffaSHans Petter Selasky }
312d6b92ffaSHans Petter Selasky 
313d6b92ffaSHans Petter Selasky #ifdef __cplusplus
314d6b92ffaSHans Petter Selasky }
315d6b92ffaSHans Petter Selasky #endif
316d6b92ffaSHans Petter Selasky 
317d6b92ffaSHans Petter Selasky #endif /* RDMA_CMA_H */
318