NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
dpa_ping_pong_sample.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 NVIDIA CORPORATION AND AFFILIATES. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification, are permitted
5  * provided that the following conditions are met:
6  * * Redistributions of source code must retain the above copyright notice, this list of
7  * conditions and the following disclaimer.
8  * * Redistributions in binary form must reproduce the above copyright notice, this list of
9  * conditions and the following disclaimer in the documentation and/or other materials
10  * provided with the distribution.
11  * * Neither the name of the NVIDIA CORPORATION nor the names of its contributors may be used
12  * to endorse or promote products derived from this software without specific prior written
13  * permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
21  * STRICT LIABILITY, OR TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  */
25 
26 #include "dpa_common.h"
27 #include "../common/dpa_ping_pong_common_defs.h"
28 
29 DOCA_LOG_REGISTER(DPA_PING_PONG::SAMPLE);
30 
36 
50  struct dpa_completion_obj *ping_dpa_completion_obj,
51  struct dpa_completion_obj *pong_dpa_completion_obj,
52  struct dpa_rdma_obj *ping_dpa_rdma_obj,
53  struct dpa_rdma_obj *pong_dpa_rdma_obj)
54 {
55  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
56 
57  ping_dpa_rdma_obj->doca_device = resources->rdma_doca_device;
58  ping_dpa_rdma_obj->doca_dpa = resources->rdma_dpa_ctx;
61  ping_dpa_rdma_obj->buf_list_len = RDMA_DEFAULT_BUF_LIST_LEN;
62  ping_dpa_rdma_obj->gid_index = RDMA_DEVICE_DEFAULT_GID_INDEX;
63  ping_dpa_rdma_obj->recv_queue_size = 1;
64  ping_dpa_rdma_obj->dpa_comp = ping_dpa_completion_obj->dpa_comp;
65  doca_err = dpa_rdma_obj_init(ping_dpa_rdma_obj);
66  if (doca_err != DOCA_SUCCESS) {
67  DOCA_LOG_ERR("Function dpa_rdma_obj_init failed (%s)", doca_error_get_descr(doca_err));
68  goto exit;
69  }
70 
71  pong_dpa_rdma_obj->doca_device = resources->rdma_doca_device;
72  pong_dpa_rdma_obj->doca_dpa = resources->rdma_dpa_ctx;
73  pong_dpa_rdma_obj->buf_list_len = RDMA_DEFAULT_BUF_LIST_LEN;
74  pong_dpa_rdma_obj->gid_index = RDMA_DEVICE_DEFAULT_GID_INDEX;
75  pong_dpa_rdma_obj->recv_queue_size = 1;
78  pong_dpa_rdma_obj->dpa_comp = pong_dpa_completion_obj->dpa_comp;
79  doca_err = dpa_rdma_obj_init(pong_dpa_rdma_obj);
80  if (doca_err != DOCA_SUCCESS) {
81  DOCA_LOG_ERR("Function dpa_rdma_obj_init failed (%s)", doca_error_get_descr(doca_err));
82  goto destroy_ping_rdma_obj;
83  }
84 
85  doca_err = dpa_rdma_obj_start(ping_dpa_rdma_obj);
86  if (doca_err != DOCA_SUCCESS) {
87  DOCA_LOG_ERR("Function dpa_rdma_obj_start failed (%s)", doca_error_get_descr(doca_err));
88  goto destroy_pong_rdma_obj;
89  }
90 
91  doca_err = dpa_rdma_obj_start(pong_dpa_rdma_obj);
92  if (doca_err != DOCA_SUCCESS) {
93  DOCA_LOG_ERR("Function dpa_rdma_obj_start failed (%s)", doca_error_get_descr(doca_err));
94  goto destroy_pong_rdma_obj;
95  }
96 
97  doca_err = doca_rdma_connect(ping_dpa_rdma_obj->rdma,
98  pong_dpa_rdma_obj->connection_details,
99  pong_dpa_rdma_obj->conn_det_len,
100  ping_dpa_rdma_obj->connection);
101  if (doca_err != DOCA_SUCCESS) {
102  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
103  goto destroy_pong_rdma_obj;
104  }
105 
106  doca_err = doca_rdma_connect(pong_dpa_rdma_obj->rdma,
107  ping_dpa_rdma_obj->connection_details,
108  ping_dpa_rdma_obj->conn_det_len,
109  pong_dpa_rdma_obj->connection);
110  if (doca_err != DOCA_SUCCESS) {
111  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
112  goto destroy_pong_rdma_obj;
113  }
114 
115  return doca_err;
116 
117 destroy_pong_rdma_obj:
118  tmp_doca_err = dpa_rdma_obj_destroy(pong_dpa_rdma_obj);
119  if (tmp_doca_err != DOCA_SUCCESS) {
120  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
121  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
122  }
123 
124 destroy_ping_rdma_obj:
125  tmp_doca_err = dpa_rdma_obj_destroy(ping_dpa_rdma_obj);
126  if (tmp_doca_err != DOCA_SUCCESS) {
127  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
128  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
129  }
130 
131 exit:
132  return doca_err;
133 }
134 
142 static doca_error_t rdma_objs_destroy(struct dpa_rdma_obj *ping_dpa_rdma_obj, struct dpa_rdma_obj *pong_dpa_rdma_obj)
143 {
144  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
145 
146  tmp_doca_err = dpa_rdma_obj_destroy(ping_dpa_rdma_obj);
147  if (tmp_doca_err != DOCA_SUCCESS) {
148  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
149  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
150  }
151 
152  tmp_doca_err = dpa_rdma_obj_destroy(pong_dpa_rdma_obj);
153  if (tmp_doca_err != DOCA_SUCCESS) {
154  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
155  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
156  }
157 
158  return doca_err;
159 }
160 
168 {
169  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
170  doca_dpa_dev_uintptr_t ping_thread_arg_dev_ptr = 0;
171  doca_dpa_dev_uintptr_t ping_tls_dev_ptr = 0;
172  doca_dpa_dev_uintptr_t ping_recv_arr_dev_ptr = 0;
173  struct dpa_ping_pong_tls ping_tls = {0};
174  doca_dpa_dev_uintptr_t pong_thread_arg_dev_ptr = 0;
175  doca_dpa_dev_uintptr_t pong_tls_dev_ptr = 0;
176  doca_dpa_dev_uintptr_t pong_recv_arr_dev_ptr = 0;
177  struct dpa_ping_pong_tls pong_tls = {0};
178  struct dpa_thread_obj ping_thread_obj = {0};
179  struct dpa_thread_obj pong_thread_obj = {0};
180  struct dpa_completion_obj ping_dpa_completion_obj = {0};
181  struct dpa_completion_obj pong_dpa_completion_obj = {0};
182  struct dpa_rdma_obj ping_rdma_obj = {0};
183  struct dpa_rdma_obj pong_rdma_obj = {0};
184  struct doca_sync_event *ping_comp_se = NULL;
185  doca_dpa_dev_sync_event_t ping_comp_se_handle = 0;
186  struct doca_sync_event *pong_comp_se = NULL;
187  doca_dpa_dev_sync_event_t pong_comp_se_handle = 0;
188  const uint64_t wait_sync_ev_threshold = 9;
189  doca_dpa_dev_uintptr_t ping_receive_buf_dev_ptr = 0;
190  struct doca_mmap_obj ping_receive_mmap_obj = {0};
191  doca_dpa_dev_uintptr_t pong_receive_buf_dev_ptr = 0;
192  struct doca_mmap_obj pong_receive_mmap_obj = {0};
193  doca_dpa_dev_uintptr_t ping_send_buf_dev_ptr = 0;
194  struct doca_mmap_obj ping_send_mmap_obj = {0};
195  doca_dpa_dev_uintptr_t pong_send_buf_dev_ptr = 0;
196  struct doca_mmap_obj pong_send_mmap_obj = {0};
197  struct dpa_thread_arg ping_thread_arg = {0};
198  struct dpa_thread_arg pong_thread_arg = {0};
199  uint64_t retval = 0;
200 
201  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_thread_arg), &ping_thread_arg_dev_ptr);
202  if (doca_err != DOCA_SUCCESS) {
203  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
204  goto exit;
205  }
206  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, ping_thread_arg_dev_ptr, 0, sizeof(struct dpa_thread_arg));
207  if (doca_err != DOCA_SUCCESS) {
208  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
209  goto destroy_ping_thread_arg_dev_ptr;
210  }
211 
212  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_ping_pong_tls), &ping_tls_dev_ptr);
213  if (doca_err != DOCA_SUCCESS) {
214  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
215  goto destroy_ping_thread_arg_dev_ptr;
216  }
217  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx,
218  sizeof(uint32_t) * EXPECTED_NUM_RECEIVES,
219  &ping_recv_arr_dev_ptr);
220  if (doca_err != DOCA_SUCCESS) {
221  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
222  goto destroy_ping_tls_dev_ptr;
223  }
224  ping_tls.received_values_arr_ptr = ping_recv_arr_dev_ptr;
225  ping_tls.num_receives = 0;
226  ping_tls.is_ping_thread = 1;
227  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
228  ping_tls_dev_ptr,
229  &ping_tls,
230  sizeof(struct dpa_ping_pong_tls));
231  if (doca_err != DOCA_SUCCESS) {
232  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
233  goto destroy_ping_recv_arr_dev_ptr;
234  }
235 
236  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_thread_arg), &pong_thread_arg_dev_ptr);
237  if (doca_err != DOCA_SUCCESS) {
238  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
239  goto destroy_ping_recv_arr_dev_ptr;
240  }
241  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, pong_thread_arg_dev_ptr, 0, sizeof(struct dpa_thread_arg));
242  if (doca_err != DOCA_SUCCESS) {
243  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
244  goto destroy_pong_thread_arg_dev_ptr;
245  }
246 
247  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_ping_pong_tls), &pong_tls_dev_ptr);
248  if (doca_err != DOCA_SUCCESS) {
249  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
250  goto destroy_pong_thread_arg_dev_ptr;
251  }
252  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx,
253  sizeof(uint32_t) * EXPECTED_NUM_RECEIVES,
254  &pong_recv_arr_dev_ptr);
255  if (doca_err != DOCA_SUCCESS) {
256  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
257  goto destroy_pong_tls_dev_ptr;
258  }
259  pong_tls.received_values_arr_ptr = pong_recv_arr_dev_ptr;
260  pong_tls.num_receives = 0;
261  pong_tls.is_ping_thread = 0;
262  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
263  pong_tls_dev_ptr,
264  &pong_tls,
265  sizeof(struct dpa_ping_pong_tls));
266  if (doca_err != DOCA_SUCCESS) {
267  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
268  goto destroy_pong_recv_arr_dev_ptr;
269  }
270 
271  ping_thread_obj.doca_dpa = resources->rdma_dpa_ctx;
272  ping_thread_obj.func = &thread_kernel;
273  ping_thread_obj.arg = ping_thread_arg_dev_ptr;
274  ping_thread_obj.tls_dev_ptr = ping_tls_dev_ptr;
275  doca_err = dpa_thread_obj_init(&ping_thread_obj);
276  if (doca_err != DOCA_SUCCESS) {
277  DOCA_LOG_ERR("Function dpa_thread_obj_init failed (%s)", doca_error_get_descr(doca_err));
278  goto destroy_pong_recv_arr_dev_ptr;
279  }
280  pong_thread_obj.doca_dpa = resources->rdma_dpa_ctx;
281  pong_thread_obj.func = &thread_kernel;
282  pong_thread_obj.arg = pong_thread_arg_dev_ptr;
283  pong_thread_obj.tls_dev_ptr = pong_tls_dev_ptr;
284  doca_err = dpa_thread_obj_init(&pong_thread_obj);
285  if (doca_err != DOCA_SUCCESS) {
286  DOCA_LOG_ERR("Function dpa_thread_obj_init failed (%s)", doca_error_get_descr(doca_err));
287  goto destroy_ping_thread_obj;
288  }
289 
290  ping_dpa_completion_obj.doca_dpa = resources->rdma_dpa_ctx;
291  ping_dpa_completion_obj.queue_size = 2;
292  ping_dpa_completion_obj.thread = ping_thread_obj.thread;
293  doca_err = dpa_completion_obj_init(&ping_dpa_completion_obj);
294  if (doca_err != DOCA_SUCCESS) {
295  DOCA_LOG_ERR("Function dpa_completion_obj_init failed (%s)", doca_error_get_descr(doca_err));
296  goto destroy_pong_thread_obj;
297  }
298  pong_dpa_completion_obj.doca_dpa = resources->rdma_dpa_ctx;
299  pong_dpa_completion_obj.queue_size = 2;
300  pong_dpa_completion_obj.thread = pong_thread_obj.thread;
301  doca_err = dpa_completion_obj_init(&pong_dpa_completion_obj);
302  if (doca_err != DOCA_SUCCESS) {
303  DOCA_LOG_ERR("Function dpa_completion_obj_init failed (%s)", doca_error_get_descr(doca_err));
304  goto destroy_ping_dpa_completion_obj;
305  }
306 
307  doca_err = rdma_objs_init(resources,
308  &ping_dpa_completion_obj,
309  &pong_dpa_completion_obj,
310  &ping_rdma_obj,
311  &pong_rdma_obj);
312  if (doca_err != DOCA_SUCCESS) {
313  DOCA_LOG_ERR("Function rdma_objs_init failed (%s)", doca_error_get_descr(doca_err));
314  goto destroy_pong_dpa_completion_obj;
315  }
316 
317  doca_err = doca_dpa_thread_run(ping_thread_obj.thread);
318  if (doca_err != DOCA_SUCCESS) {
319  DOCA_LOG_ERR("Function doca_dpa_thread_run failed (%s)", doca_error_get_descr(doca_err));
320  goto destroy_rdma_objs;
321  }
322  doca_err = doca_dpa_thread_run(pong_thread_obj.thread);
323  if (doca_err != DOCA_SUCCESS) {
324  DOCA_LOG_ERR("Function doca_dpa_thread_run failed (%s)", doca_error_get_descr(doca_err));
325  goto destroy_rdma_objs;
326  }
327 
328  doca_err = create_doca_dpa_completion_sync_event(resources->pf_dpa_ctx,
329  resources->pf_doca_device,
330  &ping_comp_se,
331  &ping_comp_se_handle);
332  if (doca_err != DOCA_SUCCESS) {
333  DOCA_LOG_ERR("Function create_doca_dpa_completion_sync_event failed (%s)",
334  doca_error_get_descr(doca_err));
335  goto destroy_rdma_objs;
336  }
337  doca_err = create_doca_dpa_completion_sync_event(resources->pf_dpa_ctx,
338  resources->pf_doca_device,
339  &pong_comp_se,
340  &pong_comp_se_handle);
341  if (doca_err != DOCA_SUCCESS) {
342  DOCA_LOG_ERR("Function create_doca_dpa_completion_sync_event failed (%s)",
343  doca_error_get_descr(doca_err));
344  goto destroy_ping_completion_sync_event;
345  }
346 
347  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(uint64_t), &ping_receive_buf_dev_ptr);
348  if (doca_err != DOCA_SUCCESS) {
349  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
350  goto destroy_pong_completion_sync_event;
351  }
352 
353  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, ping_receive_buf_dev_ptr, 0, sizeof(uint64_t));
354  if (doca_err != DOCA_SUCCESS) {
355  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
356  goto destroy_ping_receive_buf_dev_ptr;
357  }
358 
359  ping_receive_mmap_obj.mmap_type = MMAP_TYPE_DPA;
360  ping_receive_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
361  ping_receive_mmap_obj.doca_device = resources->rdma_doca_device;
364  ping_receive_mmap_obj.memrange_addr = (void *)ping_receive_buf_dev_ptr;
365  ping_receive_mmap_obj.memrange_len = sizeof(uint64_t);
366  doca_err = doca_mmap_obj_init(&ping_receive_mmap_obj);
367  if (doca_err != DOCA_SUCCESS) {
368  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
369  goto destroy_ping_receive_buf_dev_ptr;
370  }
371 
372  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(uint64_t), &pong_receive_buf_dev_ptr);
373  if (doca_err != DOCA_SUCCESS) {
374  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
375  goto destroy_ping_receive_mmap_obj;
376  }
377 
378  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, pong_receive_buf_dev_ptr, 0, sizeof(uint64_t));
379  if (doca_err != DOCA_SUCCESS) {
380  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
381  goto destroy_pong_receive_buf_dev_ptr;
382  }
383 
384  pong_receive_mmap_obj.mmap_type = MMAP_TYPE_DPA;
385  pong_receive_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
386  pong_receive_mmap_obj.doca_device = resources->rdma_doca_device;
389  pong_receive_mmap_obj.memrange_addr = (void *)pong_receive_buf_dev_ptr;
390  pong_receive_mmap_obj.memrange_len = sizeof(uint64_t);
391  doca_err = doca_mmap_obj_init(&pong_receive_mmap_obj);
392  if (doca_err != DOCA_SUCCESS) {
393  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
394  goto destroy_pong_receive_buf_dev_ptr;
395  }
396 
397  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(uint64_t), &ping_send_buf_dev_ptr);
398  if (doca_err != DOCA_SUCCESS) {
399  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
400  goto destroy_pong_receive_mmap_obj;
401  }
402 
403  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, ping_send_buf_dev_ptr, 0, sizeof(uint64_t));
404  if (doca_err != DOCA_SUCCESS) {
405  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
406  goto destroy_ping_send_buf_dev_ptr;
407  }
408 
409  ping_send_mmap_obj.mmap_type = MMAP_TYPE_DPA;
410  ping_send_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
411  ping_send_mmap_obj.doca_device = resources->rdma_doca_device;
414  ping_send_mmap_obj.memrange_addr = (void *)ping_send_buf_dev_ptr;
415  ping_send_mmap_obj.memrange_len = sizeof(uint64_t);
416  doca_err = doca_mmap_obj_init(&ping_send_mmap_obj);
417  if (doca_err != DOCA_SUCCESS) {
418  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
419  goto destroy_ping_send_buf_dev_ptr;
420  }
421 
422  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(uint64_t), &pong_send_buf_dev_ptr);
423  if (doca_err != DOCA_SUCCESS) {
424  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
425  goto destroy_ping_send_mmap_obj;
426  }
427 
428  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, pong_send_buf_dev_ptr, 0, sizeof(uint64_t));
429  if (doca_err != DOCA_SUCCESS) {
430  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
431  goto destroy_pong_send_buf_dev_ptr;
432  }
433 
434  pong_send_mmap_obj.mmap_type = MMAP_TYPE_DPA;
435  pong_send_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
436  pong_send_mmap_obj.doca_device = resources->rdma_doca_device;
439  pong_send_mmap_obj.memrange_addr = (void *)pong_send_buf_dev_ptr;
440  pong_send_mmap_obj.memrange_len = sizeof(uint64_t);
441  doca_err = doca_mmap_obj_init(&pong_send_mmap_obj);
442  if (doca_err != DOCA_SUCCESS) {
443  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
444  goto destroy_pong_send_buf_dev_ptr;
445  }
446 
447  ping_thread_arg.dpa_ctx_handle = resources->rdma_dpa_ctx_handle;
448  ping_thread_arg.dpa_comp_handle = ping_dpa_completion_obj.handle;
449  ping_thread_arg.rdma_handle = (doca_dpa_dev_uintptr_t)ping_rdma_obj.dpa_rdma;
450  ping_thread_arg.recv_addr = ping_receive_buf_dev_ptr;
451  ping_thread_arg.recv_addr_mmap_handle = ping_receive_mmap_obj.dpa_mmap_handle;
452  ping_thread_arg.recv_addr_length = ping_receive_mmap_obj.memrange_len;
453  ping_thread_arg.send_addr = ping_send_buf_dev_ptr;
454  ping_thread_arg.send_addr_mmap_handle = ping_send_mmap_obj.dpa_mmap_handle;
455  ping_thread_arg.send_addr_length = ping_send_mmap_obj.memrange_len;
456  ping_thread_arg.comp_sync_event_handle = ping_comp_se_handle;
457  ping_thread_arg.comp_sync_event_val = wait_sync_ev_threshold + 1;
458  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
459  ping_thread_arg_dev_ptr,
460  &ping_thread_arg,
461  sizeof(struct dpa_thread_arg));
462  if (doca_err != DOCA_SUCCESS) {
463  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
464  goto destroy_pong_send_mmap_obj;
465  }
466 
467  pong_thread_arg.dpa_ctx_handle = resources->rdma_dpa_ctx_handle;
468  pong_thread_arg.dpa_comp_handle = pong_dpa_completion_obj.handle;
469  pong_thread_arg.rdma_handle = (doca_dpa_dev_uintptr_t)pong_rdma_obj.dpa_rdma;
470  pong_thread_arg.recv_addr = pong_receive_buf_dev_ptr;
471  pong_thread_arg.recv_addr_mmap_handle = pong_receive_mmap_obj.dpa_mmap_handle;
472  pong_thread_arg.recv_addr_length = pong_receive_mmap_obj.memrange_len;
473  pong_thread_arg.send_addr = pong_send_buf_dev_ptr;
474  pong_thread_arg.send_addr_mmap_handle = pong_send_mmap_obj.dpa_mmap_handle;
475  pong_thread_arg.send_addr_length = pong_send_mmap_obj.memrange_len;
476  pong_thread_arg.comp_sync_event_handle = pong_comp_se_handle;
477  pong_thread_arg.comp_sync_event_val = wait_sync_ev_threshold + 1;
478  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
479  pong_thread_arg_dev_ptr,
480  &pong_thread_arg,
481  sizeof(struct dpa_thread_arg));
482  if (doca_err != DOCA_SUCCESS) {
483  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
484  goto destroy_pong_send_mmap_obj;
485  }
486 
487  doca_err = doca_dpa_rpc(resources->rdma_dpa_ctx,
489  &retval,
490  resources->rdma_dpa_ctx_handle,
491  ping_thread_arg,
492  pong_thread_arg);
493  if (doca_err != DOCA_SUCCESS) {
494  DOCA_LOG_ERR("Function doca_dpa_rpc failed (%s)", doca_error_get_descr(doca_err));
495  goto destroy_pong_send_mmap_obj;
496  }
497 
498  doca_err = doca_sync_event_wait_gt(ping_comp_se, wait_sync_ev_threshold, SYNC_EVENT_MASK_FFS);
499  if (doca_err != DOCA_SUCCESS) {
500  DOCA_LOG_ERR("Function doca_sync_event_wait_gt failed (%s)", doca_error_get_descr(doca_err));
501  goto destroy_pong_send_mmap_obj;
502  }
503 
504  doca_err = doca_sync_event_wait_gt(pong_comp_se, wait_sync_ev_threshold, SYNC_EVENT_MASK_FFS);
505  if (doca_err != DOCA_SUCCESS) {
506  DOCA_LOG_ERR("Function doca_sync_event_wait_gt failed (%s)", doca_error_get_descr(doca_err));
507  goto destroy_pong_send_mmap_obj;
508  }
509 
510 destroy_pong_send_mmap_obj:
511  tmp_doca_err = doca_mmap_obj_destroy(&pong_send_mmap_obj);
512  if (tmp_doca_err != DOCA_SUCCESS) {
513  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
514  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
515  }
516 
517 destroy_pong_send_buf_dev_ptr:
518  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, pong_send_buf_dev_ptr);
519  if (tmp_doca_err != DOCA_SUCCESS) {
520  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
521  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
522  }
523 
524 destroy_ping_send_mmap_obj:
525  tmp_doca_err = doca_mmap_obj_destroy(&ping_send_mmap_obj);
526  if (tmp_doca_err != DOCA_SUCCESS) {
527  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
528  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
529  }
530 
531 destroy_ping_send_buf_dev_ptr:
532  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, ping_send_buf_dev_ptr);
533  if (tmp_doca_err != DOCA_SUCCESS) {
534  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
535  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
536  }
537 
538 destroy_pong_receive_mmap_obj:
539  tmp_doca_err = doca_mmap_obj_destroy(&pong_receive_mmap_obj);
540  if (tmp_doca_err != DOCA_SUCCESS) {
541  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
542  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
543  }
544 
545 destroy_pong_receive_buf_dev_ptr:
546  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, pong_receive_buf_dev_ptr);
547  if (tmp_doca_err != DOCA_SUCCESS) {
548  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
549  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
550  }
551 
552 destroy_ping_receive_mmap_obj:
553  tmp_doca_err = doca_mmap_obj_destroy(&ping_receive_mmap_obj);
554  if (tmp_doca_err != DOCA_SUCCESS) {
555  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
556  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
557  }
558 
559 destroy_ping_receive_buf_dev_ptr:
560  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, ping_receive_buf_dev_ptr);
561  if (tmp_doca_err != DOCA_SUCCESS) {
562  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
563  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
564  }
565 
566 destroy_pong_completion_sync_event:
567  tmp_doca_err = doca_sync_event_destroy(pong_comp_se);
568  if (tmp_doca_err != DOCA_SUCCESS) {
569  DOCA_LOG_ERR("Function doca_sync_event_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
570  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
571  }
572 
573 destroy_ping_completion_sync_event:
574  tmp_doca_err = doca_sync_event_destroy(ping_comp_se);
575  if (tmp_doca_err != DOCA_SUCCESS) {
576  DOCA_LOG_ERR("Function doca_sync_event_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
577  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
578  }
579 
580 destroy_rdma_objs:
581  tmp_doca_err = rdma_objs_destroy(&ping_rdma_obj, &pong_rdma_obj);
582  if (tmp_doca_err != DOCA_SUCCESS) {
583  DOCA_LOG_ERR("Function rdma_objs_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
584  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
585  }
586 
587 destroy_pong_dpa_completion_obj:
588  tmp_doca_err = dpa_completion_obj_destroy(&pong_dpa_completion_obj);
589  if (tmp_doca_err != DOCA_SUCCESS) {
590  DOCA_LOG_ERR("Function dpa_completion_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
591  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
592  }
593 
594 destroy_ping_dpa_completion_obj:
595  tmp_doca_err = dpa_completion_obj_destroy(&ping_dpa_completion_obj);
596  if (tmp_doca_err != DOCA_SUCCESS) {
597  DOCA_LOG_ERR("Function dpa_completion_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
598  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
599  }
600 
601 destroy_pong_thread_obj:
602  tmp_doca_err = dpa_thread_obj_destroy(&pong_thread_obj);
603  if (tmp_doca_err != DOCA_SUCCESS) {
604  DOCA_LOG_ERR("Function dpa_thread_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
605  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
606  }
607 
608 destroy_ping_thread_obj:
609  tmp_doca_err = dpa_thread_obj_destroy(&ping_thread_obj);
610  if (tmp_doca_err != DOCA_SUCCESS) {
611  DOCA_LOG_ERR("Function dpa_thread_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
612  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
613  }
614 
615 destroy_pong_recv_arr_dev_ptr:
616  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, pong_recv_arr_dev_ptr);
617  if (tmp_doca_err != DOCA_SUCCESS) {
618  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
619  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
620  }
621 
622 destroy_pong_tls_dev_ptr:
623  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, pong_tls_dev_ptr);
624  if (tmp_doca_err != DOCA_SUCCESS) {
625  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
626  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
627  }
628 
629 destroy_pong_thread_arg_dev_ptr:
630  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, pong_thread_arg_dev_ptr);
631  if (tmp_doca_err != DOCA_SUCCESS) {
632  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
633  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
634  }
635 
636 destroy_ping_recv_arr_dev_ptr:
637  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, ping_recv_arr_dev_ptr);
638  if (tmp_doca_err != DOCA_SUCCESS) {
639  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
640  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
641  }
642 
643 destroy_ping_tls_dev_ptr:
644  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, ping_tls_dev_ptr);
645  if (tmp_doca_err != DOCA_SUCCESS) {
646  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
647  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
648  }
649 
650 destroy_ping_thread_arg_dev_ptr:
651  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, ping_thread_arg_dev_ptr);
652  if (tmp_doca_err != DOCA_SUCCESS) {
653  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
654  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
655  }
656 
657 exit:
658  return doca_err;
659 }
#define NULL
Definition: __stddef_null.h:26
static doca_error_t create_doca_dpa_completion_sync_event(struct doca_dpa *doca_dpa, struct doca_dev *doca_device, struct doca_sync_event **comp_event)
#define SYNC_EVENT_MASK_FFS
doca_error_t dpa_rdma_obj_destroy(struct dpa_rdma_obj *dpa_rdma_obj)
Destroy DPA RDMA.
Definition: dpa_common.c:1107
doca_error_t dpa_rdma_obj_start(struct dpa_rdma_obj *dpa_rdma_obj)
Start DPA RDMA.
Definition: dpa_common.c:1058
doca_error_t dpa_thread_obj_init(struct dpa_thread_obj *dpa_thread_obj)
Initialize DPA thread.
Definition: dpa_common.c:817
doca_error_t doca_mmap_obj_destroy(struct doca_mmap_obj *doca_mmap_obj)
Destroy DOCA Mmap.
Definition: dpa_common.c:1209
doca_error_t dpa_completion_obj_init(struct dpa_completion_obj *dpa_completion_obj)
Initialize DPA completion.
Definition: dpa_common.c:877
doca_error_t dpa_rdma_obj_init(struct dpa_rdma_obj *dpa_rdma_obj)
Initialize DPA RDMA without starting it.
Definition: dpa_common.c:976
doca_error_t doca_mmap_obj_init(struct doca_mmap_obj *doca_mmap_obj)
Initialize DOCA Mmap.
Definition: dpa_common.c:1126
doca_error_t dpa_completion_obj_destroy(struct dpa_completion_obj *dpa_completion_obj)
Destroy DPA completion.
Definition: dpa_common.c:916
doca_error_t dpa_thread_obj_destroy(struct dpa_thread_obj *dpa_thread_obj)
Destroy DPA thread.
Definition: dpa_common.c:864
#define RDMA_DEVICE_DEFAULT_GID_INDEX
default RDMA device GID index
Definition: dpa_common.h:65
#define RDMA_DEFAULT_BUF_LIST_LEN
default RDMA connection receive buffer length
Definition: dpa_common.h:70
@ MMAP_TYPE_DPA
Definition: dpa_common.h:172
#define EXPECTED_NUM_RECEIVES
Number of expected receive completions.
static doca_error_t rdma_objs_destroy(struct dpa_rdma_obj *ping_dpa_rdma_obj, struct dpa_rdma_obj *pong_dpa_rdma_obj)
Destroy DPA RDMA objects.
doca_dpa_func_t thread_kernel
static doca_error_t rdma_objs_init(struct dpa_resources *resources, struct dpa_completion_obj *ping_dpa_completion_obj, struct dpa_completion_obj *pong_dpa_completion_obj, struct dpa_rdma_obj *ping_dpa_rdma_obj, struct dpa_rdma_obj *pong_dpa_rdma_obj)
Create, attach, start and connect DPA RDMA objects.
DOCA_LOG_REGISTER(DPA_PING_PONG::SAMPLE)
doca_dpa_func_t trigger_first_iteration_rpc
doca_error_t dpa_ping_pong(struct dpa_resources *resources)
Sample's Logic.
struct rdma_resources resources
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_run(struct doca_dpa_thread *dpa_thread)
Run DPA thread.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_mem_alloc(struct doca_dpa *dpa, size_t size, doca_dpa_dev_uintptr_t *dev_ptr)
Allocate DPA heap memory.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_mem_free(struct doca_dpa *dpa, doca_dpa_dev_uintptr_t dev_ptr)
Free the previously allocated DPA memory.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_rpc(struct doca_dpa *dpa, doca_dpa_func_t *func, uint64_t *retval,...)
RPC to run DPA kernel.
void() doca_dpa_func_t(void)
Generic function pointer type.
Definition: doca_dpa.h:118
DOCA_EXPERIMENTAL doca_error_t doca_dpa_h2d_memcpy(struct doca_dpa *dpa, doca_dpa_dev_uintptr_t dst_ptr, void *src_ptr, size_t size)
Copy from host memory to DPA Heap.
uint64_t doca_dpa_dev_uintptr_t
DPA pointer type definition.
Definition: doca_dpa.h:78
DOCA_EXPERIMENTAL doca_error_t doca_dpa_memset(struct doca_dpa *dpa, doca_dpa_dev_uintptr_t dev_ptr, int value, size_t size)
Set DPA Heap memory to a value.
#define DOCA_ERROR_PROPAGATE(r, t)
Save the first encountered doca_error_t.
Definition: doca_error.h:83
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_SUCCESS
Definition: doca_error.h:38
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
Definition: doca_log.h:466
DOCA_EXPERIMENTAL doca_error_t doca_rdma_connect(struct doca_rdma *rdma, const void *remote_rdma_conn_details, size_t remote_rdma_conn_details_size, struct doca_rdma_connection *rdma_connection)
Connect to remote doca_rdma peer. Can only be called when the ctx is in DOCA_CTX_STATE_STARTING state...
uint64_t doca_dpa_dev_sync_event_t
DOCA Sync Event DPA handle.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_wait_gt(struct doca_sync_event *event, uint64_t value, uint64_t mask)
Wait for the value of a Sync Event to be grater than some threshold value synchronously in a polling ...
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_destroy(struct doca_sync_event *event)
Destroy a Sync Event instance.
@ DOCA_ACCESS_FLAG_LOCAL_READ_WRITE
Definition: doca_types.h:83
@ DOCA_ACCESS_FLAG_RDMA_READ
Definition: doca_types.h:84
@ DOCA_ACCESS_FLAG_RDMA_WRITE
Definition: doca_types.h:85
A struct that includes all the resources needed for DOCA Mmap.
Definition: dpa_common.h:178
size_t memrange_len
Definition: dpa_common.h:184
enum mmap_type mmap_type
Definition: dpa_common.h:179
uint32_t permissions
Definition: dpa_common.h:182
struct doca_dev * doca_device
Definition: dpa_common.h:180
struct doca_dpa * doca_dpa
Definition: dpa_common.h:181
doca_dpa_dev_mmap_t dpa_mmap_handle
Definition: dpa_common.h:186
void * memrange_addr
Definition: dpa_common.h:183
A struct that includes all the resources needed for DPA completion.
Definition: dpa_common.h:123
struct doca_dpa_thread * thread
Definition: dpa_common.h:126
doca_dpa_dev_completion_t handle
Definition: dpa_common.h:128
struct doca_dpa_completion * dpa_comp
Definition: dpa_common.h:127
struct doca_dpa * doca_dpa
Definition: dpa_common.h:124
unsigned int queue_size
Definition: dpa_common.h:125
DPA Thread local storage struct.
A struct that includes all the resources needed for DPA RDMA.
Definition: dpa_common.h:144
doca_dpa_dev_rdma_t dpa_rdma
Definition: dpa_common.h:155
struct doca_rdma_connection * connection
Definition: dpa_common.h:158
uint32_t permissions
Definition: dpa_common.h:147
uint32_t gid_index
Definition: dpa_common.h:151
size_t conn_det_len
Definition: dpa_common.h:157
uint32_t recv_queue_size
Definition: dpa_common.h:149
struct doca_dev * doca_device
Definition: dpa_common.h:145
uint32_t buf_list_len
Definition: dpa_common.h:148
struct doca_dpa_completion * dpa_comp
Definition: dpa_common.h:152
struct doca_rdma * rdma
Definition: dpa_common.h:153
struct doca_dpa * doca_dpa
Definition: dpa_common.h:146
const void * connection_details
Definition: dpa_common.h:156
A struct that includes all the resources needed for DPA.
Definition: dpa_common.h:85
DPA thread device argument struct.
A struct that includes all the resources needed for DPA thread.
Definition: dpa_common.h:111
struct doca_dpa_thread * thread
Definition: dpa_common.h:116
uint64_t arg
Definition: dpa_common.h:114
doca_dpa_dev_uintptr_t tls_dev_ptr
Definition: dpa_common.h:115
struct doca_dpa * doca_dpa
Definition: dpa_common.h:112
doca_dpa_func_t * func
Definition: dpa_common.h:113