NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
dpa_initiator_target_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_initiator_target_common_defs.h"
28 
29 DOCA_LOG_REGISTER(DPA_INITIATOR_TARGET::SAMPLE);
30 
35 
42 
55  struct dpa_rdma_obj *dpa_rdma_obj)
56 {
57  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
58 
59  DOCA_LOG_INFO("Create DOCA RDMA");
60  dpa_rdma_obj->doca_device = resources->rdma_doca_device;
61  dpa_rdma_obj->doca_dpa = resources->rdma_dpa_ctx;
70  doca_err = dpa_rdma_obj_init(dpa_rdma_obj);
71  if (doca_err != DOCA_SUCCESS) {
72  DOCA_LOG_ERR("Function dpa_rdma_obj_init failed (%s)", doca_error_get_descr(doca_err));
73  goto exit;
74  }
75 
76  DOCA_LOG_INFO("Start DOCA RDMA");
77  doca_err = dpa_rdma_obj_start(dpa_rdma_obj);
78  if (doca_err != DOCA_SUCCESS) {
79  DOCA_LOG_ERR("Function dpa_rdma_obj_start failed (%s)", doca_error_get_descr(doca_err));
80  goto destroy_rdma_obj;
81  }
82 
83  return doca_err;
84 
85 destroy_rdma_obj:
86  tmp_doca_err = dpa_rdma_obj_destroy(dpa_rdma_obj);
87  if (tmp_doca_err != DOCA_SUCCESS) {
88  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
89  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
90  }
91 
92 exit:
93  return doca_err;
94 }
95 
103 static doca_error_t rdma_obj_destroy(struct dpa_rdma_obj *dpa_rdma_obj, uint8_t is_initiator)
104 {
105  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
106 
107  DOCA_LOG_INFO("Destroy %s DOCA RDMA", (is_initiator ? "Initiator" : "Target"));
108  tmp_doca_err = dpa_rdma_obj_destroy(dpa_rdma_obj);
109  if (tmp_doca_err != DOCA_SUCCESS) {
110  DOCA_LOG_ERR("Function dpa_rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
111  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
112  }
113 
114  return doca_err;
115 }
116 
126 static doca_error_t rdma_objs_connect(struct dpa_rdma_obj *initiator_rdma_obj, struct dpa_rdma_obj *target_rdma_obj)
127 {
128  doca_error_t doca_err = DOCA_SUCCESS;
129 
130  DOCA_LOG_INFO("Connect Initiator DOCA RDMA connection #1 to Target DOCA RDMA connection #1");
131  doca_err = doca_rdma_connect(initiator_rdma_obj->rdma,
132  target_rdma_obj->connection_details,
133  target_rdma_obj->conn_det_len,
134  initiator_rdma_obj->connection);
135  if (doca_err != DOCA_SUCCESS) {
136  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
137  return doca_err;
138  }
139 
140  DOCA_LOG_INFO("Connect Target DOCA RDMA connection #1 to Initiator DOCA RDMA connection #1");
141  doca_err = doca_rdma_connect(target_rdma_obj->rdma,
142  initiator_rdma_obj->connection_details,
143  initiator_rdma_obj->conn_det_len,
144  target_rdma_obj->connection);
145  if (doca_err != DOCA_SUCCESS) {
146  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
147  return doca_err;
148  }
149 
150  DOCA_LOG_INFO("Connect Initiator DOCA RDMA connection #2 to Target DOCA RDMA connection #2");
151  doca_err = doca_rdma_connect(initiator_rdma_obj->rdma,
152  target_rdma_obj->connection2_details,
153  target_rdma_obj->conn2_det_len,
154  initiator_rdma_obj->connection2);
155  if (doca_err != DOCA_SUCCESS) {
156  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
157  return doca_err;
158  }
159 
160  DOCA_LOG_INFO("Connect Target DOCA RDMA connection #2 to Initiator DOCA RDMA connection #2");
161  doca_err = doca_rdma_connect(target_rdma_obj->rdma,
162  initiator_rdma_obj->connection2_details,
163  initiator_rdma_obj->conn2_det_len,
164  target_rdma_obj->connection2);
165  if (doca_err != DOCA_SUCCESS) {
166  DOCA_LOG_ERR("Function doca_rdma_connect failed (%s)", doca_error_get_descr(doca_err));
167  return doca_err;
168  }
169 
170  return doca_err;
171 }
172 
180 {
181  doca_error_t doca_err = DOCA_SUCCESS, tmp_doca_err = DOCA_SUCCESS;
182  struct dpa_completion_obj initiator_dpa_completion_obj = {0};
183  struct dpa_rdma_obj initiator_rdma_obj = {0};
184  doca_dpa_dev_uintptr_t thread_arg_dev_ptr = 0;
185  struct dpa_thread_obj target_thread1_obj = {0};
186  struct dpa_completion_obj target_dpa_completion_obj = {0};
187  struct dpa_rdma_obj target_rdma_obj = {0};
188  doca_dpa_dev_uintptr_t thread2_arg_dev_ptr = 0;
189  struct dpa_thread_obj target_thread2_obj = {0};
190  struct dpa_notification_completion_obj target_notification_completion_obj = {0};
191  struct doca_sync_event *comp_event = NULL;
192  doca_dpa_dev_sync_event_t dpa_dev_se_handle = 0;
193  const uint64_t wait_sync_ev_threshold = 9;
194  struct dpa_thread2_arg thread2_arg = {0};
195  doca_dpa_dev_uintptr_t received_buf_dev_ptr = 0;
196  struct doca_mmap_obj dpa_mmap_obj = {0};
197  struct dpa_thread1_arg thread1_arg = {0};
198  uint64_t send_val = 1;
199  struct doca_mmap_obj host_mmap_obj = {0};
200  uint64_t retval = 0;
201  uint32_t imm_val = 10;
202  const uint32_t test_iter = 4;
203 
204  DOCA_LOG_INFO("Create Initiator DOCA DPA Completion");
205  initiator_dpa_completion_obj.doca_dpa = resources->rdma_dpa_ctx;
206  initiator_dpa_completion_obj.queue_size = 4;
207  doca_err = dpa_completion_obj_init(&initiator_dpa_completion_obj);
208  if (doca_err != DOCA_SUCCESS) {
209  DOCA_LOG_ERR("Function dpa_completion_obj_init failed (%s)", doca_error_get_descr(doca_err));
210  goto exit;
211  }
212 
213  DOCA_LOG_INFO("Initialize Initiator DOCA RDMA");
214  doca_err = rdma_obj_create(resources, &initiator_dpa_completion_obj, &initiator_rdma_obj);
215  if (doca_err != DOCA_SUCCESS) {
216  DOCA_LOG_ERR("Function rdma_obj_create failed (%s)", doca_error_get_descr(doca_err));
217  goto destroy_initiator_rdma_completion_obj;
218  }
219 
220  DOCA_LOG_INFO("Allocate Target DPA thread #1 device argument");
221  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_thread1_arg), &thread_arg_dev_ptr);
222  if (doca_err != DOCA_SUCCESS) {
223  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
224  goto destroy_initiator_rdma_obj;
225  }
226 
227  DOCA_LOG_INFO("Create Target DOCA DPA Thread #1");
228  target_thread1_obj.doca_dpa = resources->rdma_dpa_ctx;
229  target_thread1_obj.func = &thread1_kernel;
230  target_thread1_obj.arg = thread_arg_dev_ptr;
231  doca_err = dpa_thread_obj_init(&target_thread1_obj);
232  if (doca_err != DOCA_SUCCESS) {
233  DOCA_LOG_ERR("Function dpa_thread_obj_init failed (%s)", doca_error_get_descr(doca_err));
234  goto destroy_target_thread1_arg_dev_ptr;
235  }
236 
237  DOCA_LOG_INFO("Create Target DOCA DPA Completion");
238  target_dpa_completion_obj.doca_dpa = resources->rdma_dpa_ctx;
239  target_dpa_completion_obj.queue_size = 4;
240  target_dpa_completion_obj.thread = target_thread1_obj.thread;
241  doca_err = dpa_completion_obj_init(&target_dpa_completion_obj);
242  if (doca_err != DOCA_SUCCESS) {
243  DOCA_LOG_ERR("Function dpa_completion_obj_init failed (%s)", doca_error_get_descr(doca_err));
244  goto destroy_target_thread1_obj;
245  }
246 
247  DOCA_LOG_INFO("Initialize Target DOCA RDMA");
248  doca_err = rdma_obj_create(resources, &target_dpa_completion_obj, &target_rdma_obj);
249  if (doca_err != DOCA_SUCCESS) {
250  DOCA_LOG_ERR("Function rdma_obj_create failed (%s)", doca_error_get_descr(doca_err));
251  goto destroy_target_rdma_completion_obj;
252  }
253 
254  doca_err = rdma_objs_connect(&initiator_rdma_obj, &target_rdma_obj);
255  if (doca_err != DOCA_SUCCESS) {
256  DOCA_LOG_ERR("Function rdma_objs_connect failed (%s)", doca_error_get_descr(doca_err));
257  goto destroy_target_rdma_obj;
258  }
259 
260  DOCA_LOG_INFO("Run Target DOCA DPA Thread #1");
261  doca_err = doca_dpa_thread_run(target_thread1_obj.thread);
262  if (doca_err != DOCA_SUCCESS) {
263  DOCA_LOG_ERR("Function doca_dpa_thread_run failed (%s)", doca_error_get_descr(doca_err));
264  goto destroy_target_rdma_obj;
265  }
266 
267  DOCA_LOG_INFO("Allocate Target DPA thread #2 device argument");
268  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(struct dpa_thread2_arg), &thread2_arg_dev_ptr);
269  if (doca_err != DOCA_SUCCESS) {
270  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
271  goto destroy_target_rdma_obj;
272  }
273 
274  DOCA_LOG_INFO("Create Target DOCA DPA Thread #2");
275  target_thread2_obj.doca_dpa = resources->rdma_dpa_ctx;
276  target_thread2_obj.func = &thread2_kernel;
277  target_thread2_obj.arg = thread2_arg_dev_ptr;
278  doca_err = dpa_thread_obj_init(&target_thread2_obj);
279  if (doca_err != DOCA_SUCCESS) {
280  DOCA_LOG_ERR("Function dpa_thread_obj_init failed (%s)", doca_error_get_descr(doca_err));
281  goto destroy_target_thread2_arg_dev_ptr;
282  }
283 
284  DOCA_LOG_INFO("Create Target DOCA DPA Notification Completion");
285  target_notification_completion_obj.doca_dpa = resources->rdma_dpa_ctx;
286  target_notification_completion_obj.thread = target_thread2_obj.thread;
287  doca_err = dpa_notification_completion_obj_init(&target_notification_completion_obj);
288  if (doca_err != DOCA_SUCCESS) {
289  DOCA_LOG_ERR("Function dpa_notification_completion_obj_init failed (%s)",
290  doca_error_get_descr(doca_err));
291  goto destroy_target_thread2_obj;
292  }
293 
294  DOCA_LOG_INFO("Run Target DOCA DPA Thread #2");
295  doca_err = doca_dpa_thread_run(target_thread2_obj.thread);
296  if (doca_err != DOCA_SUCCESS) {
297  DOCA_LOG_ERR("Function doca_dpa_thread_run failed (%s)", doca_error_get_descr(doca_err));
298  goto destroy_target_notification_completion_obj;
299  }
300 
301  DOCA_LOG_INFO("Create completion DOCA sync event");
302  doca_err = create_doca_dpa_completion_sync_event(resources->pf_dpa_ctx,
303  resources->pf_doca_device,
304  &comp_event,
305  &dpa_dev_se_handle);
306  if (doca_err != DOCA_SUCCESS) {
307  DOCA_LOG_ERR("Function create_doca_dpa_completion_sync_event failed (%s)",
308  doca_error_get_descr(doca_err));
309  goto destroy_target_notification_completion_obj;
310  }
311 
312  DOCA_LOG_INFO("Update Target DPA thread #2 device argument");
313  thread2_arg.sync_event_handle = dpa_dev_se_handle;
314  thread2_arg.completion_count = wait_sync_ev_threshold + 1;
315  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
316  thread2_arg_dev_ptr,
317  &thread2_arg,
318  sizeof(struct dpa_thread2_arg));
319  if (doca_err != DOCA_SUCCESS) {
320  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
321  goto destroy_completion_sync_event;
322  }
323 
324  DOCA_LOG_INFO("Create Target DOCA MMAP on DPA for Target DOCA RDMA received buffer");
325  doca_err = doca_dpa_mem_alloc(resources->rdma_dpa_ctx, sizeof(uint64_t), &received_buf_dev_ptr);
326  if (doca_err != DOCA_SUCCESS) {
327  DOCA_LOG_ERR("Function doca_dpa_mem_alloc failed (%s)", doca_error_get_descr(doca_err));
328  goto destroy_completion_sync_event;
329  }
330 
331  doca_err = doca_dpa_memset(resources->rdma_dpa_ctx, received_buf_dev_ptr, 0, sizeof(uint64_t));
332  if (doca_err != DOCA_SUCCESS) {
333  DOCA_LOG_ERR("Function doca_dpa_memset failed (%s)", doca_error_get_descr(doca_err));
334  goto destroy_received_buf_dev_ptr;
335  }
336 
337  dpa_mmap_obj.mmap_type = MMAP_TYPE_DPA;
338  dpa_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
339  dpa_mmap_obj.doca_device = resources->rdma_doca_device;
342  dpa_mmap_obj.memrange_addr = (void *)received_buf_dev_ptr;
343  dpa_mmap_obj.memrange_len = sizeof(uint64_t);
344  doca_err = doca_mmap_obj_init(&dpa_mmap_obj);
345  if (doca_err != DOCA_SUCCESS) {
346  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
347  goto destroy_received_buf_dev_ptr;
348  }
349 
350  DOCA_LOG_INFO("Update Target DPA thread #1 device argument");
351  thread1_arg.dpa_ctx_handle = resources->rdma_dpa_ctx_handle;
352  thread1_arg.notification_comp_handle = target_notification_completion_obj.handle;
353  thread1_arg.dpa_comp_handle = target_dpa_completion_obj.handle;
354  thread1_arg.target_rdma_handle = (doca_dpa_dev_uintptr_t)target_rdma_obj.dpa_rdma;
355  thread1_arg.local_buf_addr = received_buf_dev_ptr;
356  thread1_arg.dpa_mmap_handle = dpa_mmap_obj.dpa_mmap_handle;
357  thread1_arg.length = dpa_mmap_obj.memrange_len;
358  doca_err = doca_dpa_h2d_memcpy(resources->rdma_dpa_ctx,
359  thread_arg_dev_ptr,
360  &thread1_arg,
361  sizeof(struct dpa_thread1_arg));
362  if (doca_err != DOCA_SUCCESS) {
363  DOCA_LOG_ERR("Function doca_dpa_h2d_memcpy failed (%s)", doca_error_get_descr(doca_err));
364  goto destroy_dpa_mmap_obj;
365  }
366 
367  DOCA_LOG_INFO("Create Initiator DOCA MMAP for send buffer on Host");
368  host_mmap_obj.mmap_type = MMAP_TYPE_CPU;
369  host_mmap_obj.doca_dpa = resources->rdma_dpa_ctx;
370  host_mmap_obj.doca_device = resources->rdma_doca_device;
373  host_mmap_obj.memrange_addr = (void *)&send_val;
374  host_mmap_obj.memrange_len = sizeof(uint64_t);
375  doca_err = doca_mmap_obj_init(&host_mmap_obj);
376  if (doca_err != DOCA_SUCCESS) {
377  DOCA_LOG_ERR("Function doca_mmap_obj_init failed (%s)", doca_error_get_descr(doca_err));
378  goto destroy_dpa_mmap_obj;
379  }
380 
381  DOCA_LOG_INFO("Trigger an RPC to prepare Target DPA receive memory");
382  doca_err = doca_dpa_rpc(resources->rdma_dpa_ctx,
384  &retval,
385  resources->rdma_dpa_ctx_handle,
386  (doca_dpa_dev_uintptr_t)target_rdma_obj.dpa_rdma,
387  received_buf_dev_ptr,
388  dpa_mmap_obj.dpa_mmap_handle,
389  sizeof(uint64_t));
390  if (doca_err != DOCA_SUCCESS) {
391  DOCA_LOG_ERR("Function doca_dpa_rpc failed (%s)", doca_error_get_descr(doca_err));
392  goto destroy_host_mmap_obj;
393  }
394 
395  for (uint32_t i = 0; i < test_iter; i++) {
397  "Trigger an RPC to post send on Initiator DOCA RDMA connection #%u with buffer %lu and immediate value %u",
398  (i % 2 == 0 ? initiator_rdma_obj.connection_id : initiator_rdma_obj.connection2_id),
399  send_val,
400  imm_val);
401  doca_err = doca_dpa_rpc(resources->rdma_dpa_ctx,
403  &retval,
404  resources->rdma_dpa_ctx_handle,
405  initiator_rdma_obj.dpa_rdma,
406  (i % 2 == 0 ? initiator_rdma_obj.connection_id :
407  initiator_rdma_obj.connection2_id),
408  &send_val,
409  host_mmap_obj.dpa_mmap_handle,
410  host_mmap_obj.memrange_len,
411  imm_val++);
412  if (doca_err != DOCA_SUCCESS) {
413  DOCA_LOG_ERR("Function doca_dpa_rpc failed (%s)", doca_error_get_descr(doca_err));
414  goto destroy_host_mmap_obj;
415  }
416 
417  // update mmap value
418  send_val++;
419  }
420 
421  DOCA_LOG_INFO("Waiting for Target Thread #2 to set completion Sync Event value to be greater than %lu",
422  wait_sync_ev_threshold);
423  doca_err = doca_sync_event_wait_gt(comp_event, wait_sync_ev_threshold, SYNC_EVENT_MASK_FFS);
424  if (doca_err != DOCA_SUCCESS) {
425  DOCA_LOG_ERR("Function doca_sync_event_wait_gt failed (%s)", doca_error_get_descr(doca_err));
426  goto destroy_host_mmap_obj;
427  }
428 
429  DOCA_LOG_INFO("Tear down");
430 
431 destroy_host_mmap_obj:
432  tmp_doca_err = doca_mmap_obj_destroy(&host_mmap_obj);
433  if (tmp_doca_err != DOCA_SUCCESS) {
434  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
435  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
436  }
437 
438 destroy_dpa_mmap_obj:
439  tmp_doca_err = doca_mmap_obj_destroy(&dpa_mmap_obj);
440  if (tmp_doca_err != DOCA_SUCCESS) {
441  DOCA_LOG_ERR("Function doca_mmap_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
442  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
443  }
444 
445 destroy_received_buf_dev_ptr:
446  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, received_buf_dev_ptr);
447  if (tmp_doca_err != DOCA_SUCCESS) {
448  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
449  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
450  }
451 
452 destroy_completion_sync_event:
453  tmp_doca_err = doca_sync_event_destroy(comp_event);
454  if (tmp_doca_err != DOCA_SUCCESS) {
455  DOCA_LOG_ERR("Function doca_sync_event_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
456  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
457  }
458 
459 destroy_target_notification_completion_obj:
460  tmp_doca_err = dpa_notification_completion_obj_destroy(&target_notification_completion_obj);
461  if (tmp_doca_err != DOCA_SUCCESS) {
462  DOCA_LOG_ERR("Function dpa_notification_completion_obj_destroy failed: %s",
463  doca_error_get_descr(tmp_doca_err));
464  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
465  }
466 
467 destroy_target_thread2_obj:
468  tmp_doca_err = dpa_thread_obj_destroy(&target_thread2_obj);
469  if (tmp_doca_err != DOCA_SUCCESS) {
470  DOCA_LOG_ERR("Function dpa_thread_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
471  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
472  }
473 
474 destroy_target_thread2_arg_dev_ptr:
475  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, thread2_arg_dev_ptr);
476  if (tmp_doca_err != DOCA_SUCCESS) {
477  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
478  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
479  }
480 
481 destroy_target_rdma_obj:
482  tmp_doca_err = rdma_obj_destroy(&target_rdma_obj, 0);
483  if (tmp_doca_err != DOCA_SUCCESS) {
484  DOCA_LOG_ERR("Function rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
485  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
486  }
487 
488 destroy_target_rdma_completion_obj:
489  tmp_doca_err = dpa_completion_obj_destroy(&target_dpa_completion_obj);
490  if (tmp_doca_err != DOCA_SUCCESS) {
491  DOCA_LOG_ERR("Function dpa_completion_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
492  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
493  }
494 
495 destroy_target_thread1_obj:
496  tmp_doca_err = dpa_thread_obj_destroy(&target_thread1_obj);
497  if (tmp_doca_err != DOCA_SUCCESS) {
498  DOCA_LOG_ERR("Function dpa_thread_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
499  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
500  }
501 
502 destroy_target_thread1_arg_dev_ptr:
503  tmp_doca_err = doca_dpa_mem_free(resources->rdma_dpa_ctx, thread_arg_dev_ptr);
504  if (tmp_doca_err != DOCA_SUCCESS) {
505  DOCA_LOG_ERR("Function doca_dpa_mem_free failed: %s", doca_error_get_descr(tmp_doca_err));
506  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
507  }
508 
509 destroy_initiator_rdma_obj:
510  tmp_doca_err = rdma_obj_destroy(&initiator_rdma_obj, 1);
511  if (tmp_doca_err != DOCA_SUCCESS) {
512  DOCA_LOG_ERR("Function rdma_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
513  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
514  }
515 
516 destroy_initiator_rdma_completion_obj:
517  tmp_doca_err = dpa_completion_obj_destroy(&initiator_dpa_completion_obj);
518  if (tmp_doca_err != DOCA_SUCCESS) {
519  DOCA_LOG_ERR("Function dpa_completion_obj_destroy failed: %s", doca_error_get_descr(tmp_doca_err));
520  DOCA_ERROR_PROPAGATE(doca_err, tmp_doca_err);
521  }
522 
523 exit:
524  return doca_err;
525 }
#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_notification_completion_obj_init(struct dpa_notification_completion_obj *notification_completion_obj)
Initialize DPA notification completion.
Definition: dpa_common.c:929
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 dpa_notification_completion_obj_destroy(struct dpa_notification_completion_obj *notification_completion_obj)
Destroy DPA notification completion.
Definition: dpa_common.c:962
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
@ MMAP_TYPE_CPU
Definition: dpa_common.h:171
#define EXPECTED_NUM_RECEIVES
Number of expected receive completions.
static doca_error_t rdma_obj_create(struct dpa_resources *resources, struct dpa_completion_obj *dpa_completion_obj, struct dpa_rdma_obj *dpa_rdma_obj)
Create, attach and start DPA RDMA object.
DOCA_LOG_REGISTER(DPA_INITIATOR_TARGET::SAMPLE)
doca_dpa_func_t rdma_post_receive_rpc
doca_dpa_func_t thread1_kernel
doca_error_t dpa_initiator_target(struct dpa_resources *resources)
Sample's Logic.
static doca_error_t rdma_obj_destroy(struct dpa_rdma_obj *dpa_rdma_obj, uint8_t is_initiator)
Destroy Initiator/Target DPA RDMA object.
doca_dpa_func_t rdma_post_send_imm_rpc
static doca_error_t rdma_objs_connect(struct dpa_rdma_obj *initiator_rdma_obj, struct dpa_rdma_obj *target_rdma_obj)
RDMA Connect Initiator & Target DPA RDMA connection objects.
doca_dpa_func_t thread2_kernel
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
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
Definition: doca_log.h:486
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_ATOMIC
Definition: doca_types.h:86
@ 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
A struct that includes all the resources needed for DPA notification completion.
Definition: dpa_common.h:134
struct doca_dpa_thread * thread
Definition: dpa_common.h:136
doca_dpa_dev_notification_completion_t handle
Definition: dpa_common.h:138
struct doca_dpa * doca_dpa
Definition: dpa_common.h:135
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 connection_id
Definition: dpa_common.h:159
uint32_t permissions
Definition: dpa_common.h:147
bool second_connection_needed
Definition: dpa_common.h:160
uint32_t max_connections_count
Definition: dpa_common.h:150
size_t conn2_det_len
Definition: dpa_common.h:162
uint32_t connection2_id
Definition: dpa_common.h:164
const void * connection2_details
Definition: dpa_common.h:161
uint32_t gid_index
Definition: dpa_common.h:151
struct doca_rdma_connection * connection2
Definition: dpa_common.h:163
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 #1 device argument struct.
DPA thread #2 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
struct doca_dpa * doca_dpa
Definition: dpa_common.h:112
doca_dpa_func_t * func
Definition: dpa_common.h:113