NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
dpa_nvqual_sample.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2025 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 <sys/time.h>
27 #include <signal.h>
28 
29 #include <dpa_common.h>
30 #include <dpa_nvqual_common_defs.h>
31 #include <doca_dpa.h>
32 #include <doca_dev.h>
33 
34 DOCA_LOG_REGISTER(DPA_NVQUAL);
35 
41 
42 struct doca_log_backend *stdout_logger = NULL;
43 
44 static bool interrupted = false;
45 
53 static void sigint_handler(int signum)
54 {
55  (void)signum;
56  DOCA_LOG_ERR("Got external interrupt, the program will terminate shortly, please wait");
57  interrupted = true;
58 }
59 
71 static doca_error_t get_available_eus(struct doca_dpa *dpa,
72  unsigned int total_num_eus,
73  bool *available_eus,
74  unsigned int *available_eus_size)
75 {
76  struct doca_dpa_eu_affinity *affinity = NULL;
77 
78  doca_error_t doca_err = DOCA_SUCCESS;
79  doca_err = doca_dpa_eu_affinity_create(dpa, &affinity);
80  if (doca_err != DOCA_SUCCESS) {
81  DOCA_LOG_ERR("Failed to create DPA affinity: %s", (doca_error_get_name(doca_err)));
82  return doca_err;
83  }
84 
85  for (unsigned int eu_id = 1; eu_id < total_num_eus; ++eu_id) {
86  doca_err = doca_dpa_eu_affinity_set(affinity, eu_id);
87  if (doca_err != DOCA_SUCCESS) {
88  (void)doca_dpa_eu_affinity_destroy(affinity);
89  DOCA_LOG_ERR("Failed to set EU affinity: %s", (doca_error_get_name(doca_err)));
90  return doca_err;
91  }
92 
93  struct doca_dpa_thread *thread = NULL;
94 
95  doca_err = doca_dpa_thread_create(dpa, &thread);
96  if (doca_err != DOCA_SUCCESS) {
97  (void)doca_dpa_eu_affinity_destroy(affinity);
98  DOCA_LOG_ERR("Failed to create thread: %s", (doca_error_get_name(doca_err)));
99  return doca_err;
100  }
101 
102  doca_err = doca_dpa_thread_set_affinity(thread, affinity);
103  if (doca_err != DOCA_SUCCESS) {
104  (void)doca_dpa_eu_affinity_destroy(affinity);
105  (void)doca_dpa_thread_destroy(thread);
106  DOCA_LOG_ERR("Failed to set thread affinity: %s", (doca_error_get_name(doca_err)));
107  return doca_err;
108  }
109 
110  doca_err = doca_dpa_thread_set_func_arg(thread, dpa_nvqual_kernel, 0);
111  if (doca_err != DOCA_SUCCESS) {
112  (void)doca_dpa_eu_affinity_destroy(affinity);
113  (void)doca_dpa_thread_destroy(thread);
114  DOCA_LOG_ERR("Failed to set thread kernel: %s", (doca_error_get_name(doca_err)));
115  return doca_err;
116  }
117 
118  /* Suppress stderr prints temporarily to avoid FlexIO prints, as we allow thread failures on setup */
119  FILE *orig_stderr = stderr;
120  stderr = fopen("/dev/null", "w");
121 
122  /* Suppress DOCA SDK error prints temporarily as well */
124 
125  doca_err = doca_dpa_thread_start(thread);
126  if (doca_err == DOCA_SUCCESS) {
127  available_eus[eu_id] = true;
128  *available_eus_size = *available_eus_size + 1;
129  }
130 
131  /* Restore stderr */
132  fclose(stderr);
133  stderr = orig_stderr;
134 
135  /* Restore DOCA SDK error prints */
137 
138  (void)doca_dpa_thread_stop(thread);
139  (void)doca_dpa_thread_destroy(thread);
140  }
141 
142  (void)doca_dpa_eu_affinity_destroy(affinity);
143 
144  return DOCA_SUCCESS;
145 }
146 
157 static size_t get_num_used_eus(bool *available_eus, bool *excluded_eus, unsigned int total_num_eus)
158 {
159  size_t ret = 0;
160  for (unsigned int eu_id = 1; eu_id < total_num_eus; eu_id++) {
161  if ((available_eus[eu_id] == true) && (excluded_eus[eu_id] == false)) {
162  ++ret;
163  }
164  }
165  return ret;
166 }
167 
177 static doca_error_t iteration_complete_cb(struct dpa_nvqual *nvq, uint64_t ret_val)
178 {
179  float avg = ret_val / (float)(nvq->buffers_size * nvq->num_ops * DPA_NVQUAL_DPA_FREQ);
180  nvq->avg_latency_single_op = (nvq->data_size * (float)nvq->avg_latency_single_op + avg) / (nvq->data_size + 1);
181  nvq->data_size++;
182  return DOCA_SUCCESS;
183 }
184 
192 static doca_error_t dev_name_param_callback(void *param, void *config)
193 {
194  struct dpa_nvqual_config *dpa_cfg = (struct dpa_nvqual_config *)config;
195  char *device_name = (char *)param;
196  int len;
197 
198  len = strnlen(device_name, DOCA_DEVINFO_IBDEV_NAME_SIZE);
200  DOCA_LOG_ERR("Entered device name exceeding the maximum size of %d", DOCA_DEVINFO_IBDEV_NAME_SIZE - 1);
202  }
203  strncpy(dpa_cfg->dev_name, device_name, len + 1);
204 
205  return DOCA_SUCCESS;
206 }
207 
215 static doca_error_t test_duration_sec_param_callback(void *param, void *config)
216 {
217  struct dpa_nvqual_config *dpa_cfg = (struct dpa_nvqual_config *)config;
218  unsigned long err = strtoul((char *)param, NULL, 10);
219  if (err == 0) {
220  DOCA_LOG_ERR("Failed to convert ARGP param duration seconds to unsigned long");
222  }
223  dpa_cfg->test_duration_sec = err;
224  return DOCA_SUCCESS;
225 }
226 
234 static doca_error_t user_factor_param_callback(void *param, void *config)
235 {
236  struct dpa_nvqual_config *dpa_cfg = (struct dpa_nvqual_config *)config;
237  float user_factor = strtof((char *)param, NULL);
238  if (user_factor == (float)0) {
239  DOCA_LOG_ERR("Failed to convert ARGP param user factor to float");
241  }
242  memcpy(&dpa_cfg->user_factor, &user_factor, sizeof(dpa_cfg->user_factor));
243  return DOCA_SUCCESS;
244 }
245 
253 static doca_error_t excluded_eus_param_callback(void *param, void *config)
254 {
255  struct dpa_nvqual_config *dpa_cfg = (struct dpa_nvqual_config *)config;
256  char *input = (char *)param;
257  int len;
258 
261  DOCA_LOG_ERR("Entered excluded EUs exceeding the maximum size of %d",
264  }
265 
266  char *token = strtok(input, ",");
267  while (token != NULL) {
268  unsigned int eu_id = (unsigned int)strtoul(token, NULL, 0);
269  if (eu_id < DPA_NVQUAL_MAX_EUS) {
270  dpa_cfg->excluded_eus[eu_id] = true;
271  dpa_cfg->excluded_eus_size = dpa_cfg->excluded_eus_size + 1;
272  }
273  token = strtok(NULL, ",");
274  }
275 
276  return DOCA_SUCCESS;
277 }
278 
285 {
286  doca_error_t err;
287  struct doca_argp_param *dev_name, *test_duration_sec, *user_factor, *excluded_eus;
288 
289  err = doca_argp_param_create(&dev_name);
290  if (err != DOCA_SUCCESS) {
291  DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(err));
292  return err;
293  }
294  doca_argp_param_set_short_name(dev_name, "pf_dev");
295  doca_argp_param_set_long_name(dev_name, "pf-device");
296  doca_argp_param_set_arguments(dev_name, "<PF DOCA device name>");
297  doca_argp_param_set_description(dev_name, "PF device name that supports DPA (mandatory).");
301  err = doca_argp_register_param(dev_name);
302  if (err != DOCA_SUCCESS) {
303  DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(err));
304  return err;
305  }
306 
307  err = doca_argp_param_create(&test_duration_sec);
308  if (err != DOCA_SUCCESS) {
309  DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(err));
310  return err;
311  }
312  doca_argp_param_set_short_name(test_duration_sec, "test_dur");
313  doca_argp_param_set_long_name(test_duration_sec, "test-duration-sec");
314  doca_argp_param_set_arguments(test_duration_sec, "<test duration sec>");
315  doca_argp_param_set_description(test_duration_sec, "test duration seconds (mandatory).");
318  doca_argp_param_set_mandatory(test_duration_sec);
319  err = doca_argp_register_param(test_duration_sec);
320  if (err != DOCA_SUCCESS) {
321  DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(err));
322  return err;
323  }
324 
325  err = doca_argp_param_create(&user_factor);
326  if (err != DOCA_SUCCESS) {
327  DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(err));
328  return err;
329  }
330  doca_argp_param_set_short_name(user_factor, "user_fac");
331  doca_argp_param_set_long_name(user_factor, "user-factor");
332  doca_argp_param_set_arguments(user_factor, "[user factor]");
334  user_factor,
335  "user factor from type float (optional). If not provided then 0.75f be chosen.");
338  err = doca_argp_register_param(user_factor);
339  if (err != DOCA_SUCCESS) {
340  DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(err));
341  return err;
342  }
343 
344  err = doca_argp_param_create(&excluded_eus);
345  if (err != DOCA_SUCCESS) {
346  DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(err));
347  return err;
348  }
349  doca_argp_param_set_short_name(excluded_eus, "ex_eu");
350  doca_argp_param_set_long_name(excluded_eus, "excluded-eus");
351  doca_argp_param_set_arguments(excluded_eus, "[excluded eus]");
353  excluded_eus,
354  "excluded eus list, devided by ',' with no spaced (optional). If not provided then no eu will be excluded.");
357  err = doca_argp_register_param(excluded_eus);
358  if (err != DOCA_SUCCESS) {
359  DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(err));
360  return err;
361  }
362 
363  return DOCA_SUCCESS;
364 }
365 
376 {
377  char stream[DPA_NVQUAL_PRINT_BUFFER_SIZE];
378  stream[0] = '\0';
379  bool used_eus[DPA_NVQUAL_MAX_EUS] = {false};
380  unsigned int size_used_eus = 0;
381  bool unused_eus[DPA_NVQUAL_MAX_EUS] = {false};
382  unsigned int size_unused_eus = 0;
383  bool unreachable_eus[DPA_NVQUAL_MAX_EUS] = {false};
384 
385  unsigned int size_unreachable_eus = output->total_num_eus - 1;
386  for (unsigned int eu_id = 1; eu_id < output->total_num_eus; ++eu_id)
387  unreachable_eus[eu_id] = true;
388 
389  strcat(stream, "{\"data\": {\n");
390  snprintf(stream + strlen(stream),
391  DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream),
392  "\t\"device\": \"%s\",\n",
393  flow_cfg->dev_name);
394  snprintf(stream + strlen(stream),
395  DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream),
396  "\t\"total_harts\": %d,\n",
397  output->total_num_eus);
398 
399  strcat(stream, "\t\"available_harts\": [");
400  for (unsigned int eu_id = 1; eu_id < output->total_num_eus; ++eu_id) {
401  if (output->available_eus[eu_id] == true) {
402  output->available_eus_size--;
403  unreachable_eus[eu_id] = false;
404  size_unreachable_eus--;
405  snprintf(stream + strlen(stream), DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream), "%d", eu_id);
406  if (output->available_eus_size > 0) {
407  strcat(stream, ",");
408  }
409  if (flow_cfg->excluded_eus[eu_id] == false) {
410  used_eus[eu_id] = true;
411  size_used_eus++;
412  } else {
413  unused_eus[eu_id] = true;
414  size_unused_eus++;
415  }
416  }
417  }
418  strcat(stream, "],\n");
419 
420  strcat(stream, "\t\"unreachable_harts\": [");
421  for (unsigned int eu_id = 1; eu_id < output->total_num_eus; ++eu_id) {
422  if (unreachable_eus[eu_id] == true) {
423  size_unreachable_eus--;
424  snprintf(stream + strlen(stream), DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream), "%d", eu_id);
425  if (size_unreachable_eus > 0) {
426  strcat(stream, ",");
427  }
428  }
429  }
430  strcat(stream, "],\n");
431 
432  strcat(stream, "\t\"used_harts\": [");
433  for (unsigned int eu_id = 1; eu_id < output->total_num_eus; ++eu_id) {
434  if (used_eus[eu_id] == true) {
435  size_used_eus--;
436  snprintf(stream + strlen(stream), DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream), "%d", eu_id);
437  if (size_used_eus > 0) {
438  strcat(stream, ",");
439  }
440  }
441  }
442  strcat(stream, "],\n");
443 
444  strcat(stream, "\t\"unused_harts\": [");
445  for (unsigned int eu_id = 1; eu_id < output->total_num_eus; ++eu_id) {
446  if (unused_eus[eu_id] == true) {
447  size_unused_eus--;
448  snprintf(stream + strlen(stream), DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream), "%d", eu_id);
449  if (size_unused_eus > 0) {
450  strcat(stream, ",");
451  }
452  }
453  }
454  strcat(stream, "],\n");
455 
456  snprintf(stream + strlen(stream),
457  DPA_NVQUAL_PRINT_BUFFER_SIZE - strlen(stream),
458  "\t\"total_dpa_run_time\": \"%ld [sec]\"\n}}\n",
459  output->total_dpa_run_time_sec);
460  DOCA_LOG_INFO("\n\n%s\n", stream);
461 
462  return DOCA_SUCCESS;
463 }
464 
474 static doca_error_t setup(struct dpa_nvqual_config *nvqual_argp_cfg, struct dpa_nvqual *nvq)
475 {
476  float float_user_factor;
477  memcpy(&float_user_factor, &nvqual_argp_cfg->user_factor, sizeof(float_user_factor));
478 
479  struct dpa_nvqual_flow_config flow_cfg;
480  uint64_t iteration_duration_sec_var = DPA_NVQUAL_ITERATION_DURATION_SEC;
481  if (float_user_factor != (float)0) {
482  iteration_duration_sec_var = DPA_NVQUAL_WATCHDOG_TIME_SEC * float_user_factor;
483  }
484  for (int i = 0; i < DPA_NVQUAL_MAX_EUS; i++) {
485  flow_cfg.excluded_eus[i] = nvqual_argp_cfg->excluded_eus[i];
486  }
487  flow_cfg.excluded_eus_size = nvqual_argp_cfg->excluded_eus_size;
488  flow_cfg.dev_name = nvqual_argp_cfg->dev_name;
489  flow_cfg.test_duration_sec = nvqual_argp_cfg->test_duration_sec;
490  flow_cfg.iteration_duration_sec = iteration_duration_sec_var;
492 
493  nvq->flow_cfg = flow_cfg;
494  nvq->dev_list = NULL;
495  nvq->dev = NULL;
496  nvq->dpa = NULL;
497  nvq->affinity = NULL;
498  nvq->se = NULL;
499  nvq->num_threads = 0;
500  nvq->available_eus_size = 0;
501  nvq->total_num_eus = 0;
502  nvq->buffers_size = 0;
503  nvq->num_ops = 0;
504  nvq->total_dpa_run_time_usec = 0;
505  nvq->avg_latency_single_op = 0;
506  nvq->data_size = 0;
507  for (unsigned int eu_id = 0; eu_id < DPA_NVQUAL_MAX_EUS; eu_id++) {
508  memset(&nvq->tlss[eu_id], 0, sizeof(struct dpa_nvqual_tls));
509  nvq->dev_tlss[eu_id] = 0;
510  nvq->threads[eu_id] = NULL;
511  nvq->notification_completions[eu_id] = NULL;
512  nvq->available_eus[eu_id] = false;
513  }
514 
515  struct sigaction sa;
516  sa.sa_handler = sigint_handler;
517  sigemptyset(&sa.sa_mask);
518  sa.sa_flags = 0;
519 
520  if (sigaction(SIGINT, &sa, NULL) == -1) {
521  DOCA_LOG_ERR("Failed to set SIGINT handler: %s", (doca_error_get_name(DOCA_ERROR_OPERATING_SYSTEM)));
523  }
524 
525  uint32_t num_devs = 0;
526  char ibdev_name[DOCA_DEVINFO_IBDEV_NAME_SIZE] = {0};
527 
528  doca_error_t doca_err = DOCA_SUCCESS;
529  doca_err = doca_devinfo_create_list(&nvq->dev_list, &num_devs);
530  if (doca_err != DOCA_SUCCESS) {
531  DOCA_LOG_ERR("Failed to create DOCA device list: %s", (doca_error_get_name(doca_err)));
532  return doca_err;
533  }
534 
535  /* Search device with same dev name*/
536  for (uint32_t i = 0; i < num_devs; i++) {
537  doca_err = doca_devinfo_get_ibdev_name(nvq->dev_list[i], ibdev_name, sizeof(ibdev_name));
538  if (doca_err != DOCA_SUCCESS) {
539  DOCA_LOG_ERR("Failed to get ibdev name: %s", (doca_error_get_name(doca_err)));
540  return doca_err;
541  }
542 
543  if (strlen(nvq->flow_cfg.dev_name) && strcmp(ibdev_name, nvq->flow_cfg.dev_name) != 0)
544  continue;
545 
547  continue;
548 
549  doca_err = doca_dev_open(nvq->dev_list[i], &nvq->dev);
550  if (doca_err != DOCA_SUCCESS) {
551  DOCA_LOG_ERR("Failed to open doca device: %s", (doca_error_get_name(doca_err)));
552  return doca_err;
553  }
554 
555  DOCA_LOG_INFO("Using device %s", ibdev_name);
556  break;
557  }
558 
559  if (nvq->dev == NULL) {
560  DOCA_LOG_ERR("No device with DPA capabilities: %s", (doca_error_get_name(DOCA_ERROR_NOT_FOUND)));
561  return DOCA_ERROR_NOT_FOUND;
562  }
563 
564  doca_err = doca_dpa_create(nvq->dev, &nvq->dpa);
565  if (doca_err != DOCA_SUCCESS) {
566  DOCA_LOG_ERR("Failed to create DOCA DPA context: %s", (doca_error_get_name(doca_err)));
567  return doca_err;
568  }
569 
570  doca_err = doca_dpa_set_app(nvq->dpa, dpa_sample_app);
571  if (doca_err != DOCA_SUCCESS) {
572  DOCA_LOG_ERR("Failed to set DPA application: %s", (doca_error_get_name(doca_err)));
573  return doca_err;
574  }
575 
576  doca_err = doca_dpa_start(nvq->dpa);
577  if (doca_err != DOCA_SUCCESS) {
578  DOCA_LOG_ERR("Failed to start DPA context: %s", (doca_error_get_name(doca_err)));
579  return doca_err;
580  }
581 
582  doca_err = doca_sync_event_create(&nvq->se);
583  if (doca_err != DOCA_SUCCESS) {
584  DOCA_LOG_ERR("Failed to create Sync Event: %s", (doca_error_get_name(doca_err)));
585  return doca_err;
586  }
587 
588  doca_err = doca_sync_event_add_publisher_location_cpu(nvq->se, nvq->dev);
589  if (doca_err != DOCA_SUCCESS) {
590  DOCA_LOG_ERR("Failed to config Sync Event publisher: %s", (doca_error_get_name(doca_err)));
591  return doca_err;
592  }
593 
594  doca_err = doca_sync_event_add_subscriber_location_dpa(nvq->se, nvq->dpa);
595  if (doca_err != DOCA_SUCCESS) {
596  DOCA_LOG_ERR("Failed to config Sync Event subscriber: %s", (doca_error_get_name(doca_err)));
597  return doca_err;
598  }
599 
600  doca_err = doca_sync_event_start(nvq->se);
601  if (doca_err != DOCA_SUCCESS) {
602  DOCA_LOG_ERR("Failed to start Sync Event: %s", (doca_error_get_name(doca_err)));
603  return doca_err;
604  }
605 
606  doca_err = doca_sync_event_get_dpa_handle(nvq->se, nvq->dpa, &nvq->dev_se);
607  if (doca_err != DOCA_SUCCESS) {
608  DOCA_LOG_ERR("Failed to get Sync Event device handle: %s", (doca_error_get_name(doca_err)));
609  return doca_err;
610  }
611 
613  if (doca_err != DOCA_SUCCESS) {
614  DOCA_LOG_ERR("Failed to get total number of DPA EUs: %s", (doca_error_get_name(doca_err)));
615  return doca_err;
616  }
617 
618  doca_err = get_available_eus(nvq->dpa, nvq->total_num_eus, nvq->available_eus, &nvq->available_eus_size);
619  if (doca_err != DOCA_SUCCESS) {
620  DOCA_LOG_ERR("Failed to get total number of available DPA EUs: %s", (doca_error_get_name(doca_err)));
621  return doca_err;
622  }
623 
624  size_t num_used_eus = get_num_used_eus(nvq->available_eus, nvq->flow_cfg.excluded_eus, nvq->total_num_eus);
625  if (num_used_eus == 0) {
626  DOCA_LOG_ERR("Failed to find any available DPA EUs with the current excluded EUs configuration");
627  return DOCA_ERROR_BAD_CONFIG;
628  }
629 
630  nvq->buffers_size = (size_t)((nvq->flow_cfg.allocated_dpa_heap_size / num_used_eus) / 2);
631 
634 
635  doca_err = doca_dpa_mem_alloc(nvq->dpa,
639  if (doca_err != DOCA_SUCCESS) {
640  DOCA_LOG_ERR("Failed to alloc notification completions array: %s", (doca_error_get_name(doca_err)));
641  return doca_err;
642  }
643 
644  doca_err = doca_dpa_mem_alloc(nvq->dpa,
645  sizeof(struct dpa_nvqual_thread_ret) *
647  &nvq->thread_rets);
648  if (doca_err != DOCA_SUCCESS) {
649  DOCA_LOG_ERR("Failed to alloc notification completions array: %s", (doca_error_get_name(doca_err)));
650  return doca_err;
651  }
652 
653  doca_err = doca_dpa_eu_affinity_create(nvq->dpa, &nvq->affinity);
654  if (doca_err != DOCA_SUCCESS) {
655  DOCA_LOG_ERR("Failed to create DPA affinity: %s", (doca_error_get_name(doca_err)));
656  return doca_err;
657  }
658 
659  for (unsigned int eu_id = 1; eu_id < nvq->total_num_eus; eu_id++) {
660  /* Check if current EU ID is unavailable */
661  if (nvq->available_eus[eu_id] == false) {
662  DOCA_LOG_WARN("Skipping unavailable HART #%d, you may use dpaeumgmt tool to enable it", eu_id);
663  continue;
664  }
665 
666  /* Check if current EU ID is excluded by the user */
667  if (nvq->flow_cfg.excluded_eus[eu_id] == true) {
668  DOCA_LOG_INFO("Skipping excluded HART #%d", eu_id);
669  continue;
670  }
671 
672  DOCA_LOG_INFO("Setting HART #%d", eu_id);
673 
674  doca_err = doca_dpa_eu_affinity_set(nvq->affinity, eu_id);
675  if (doca_err != DOCA_SUCCESS) {
676  DOCA_LOG_ERR("Failed to set EU affinity: %s", (doca_error_get_name(doca_err)));
677  return doca_err;
678  }
679 
680  struct doca_dpa_thread *thread = NULL;
681 
682  doca_err = doca_dpa_thread_create(nvq->dpa, &thread);
683  if (doca_err != DOCA_SUCCESS) {
684  DOCA_LOG_ERR("Failed to create thread: %s", (doca_error_get_name(doca_err)));
685  return doca_err;
686  }
687 
688  doca_err = doca_dpa_thread_set_affinity(thread, nvq->affinity);
689  if (doca_err != DOCA_SUCCESS) {
690  DOCA_LOG_ERR("Failed to set thread affinity: %s", (doca_error_get_name(doca_err)));
691  return doca_err;
692  }
693 
694  doca_dpa_dev_uintptr_t src_buf;
695 
696  doca_err = doca_dpa_mem_alloc(nvq->dpa, nvq->buffers_size, &src_buf);
697  if (doca_err != DOCA_SUCCESS) {
698  DOCA_LOG_ERR("Failed to alloc src buffer of size %lu : %s",
699  nvq->buffers_size,
700  (doca_error_get_name(doca_err)));
701  return doca_err;
702  }
703 
704  doca_dpa_dev_uintptr_t dst_buf;
705 
706  doca_err = doca_dpa_mem_alloc(nvq->dpa, nvq->buffers_size, &dst_buf);
707  if (doca_err != DOCA_SUCCESS) {
708  DOCA_LOG_ERR("Failed to alloc dst buffer of size %lu : %s",
709  nvq->buffers_size,
710  (doca_error_get_name(doca_err)));
711  return doca_err;
712  }
713 
715 
716  doca_err = doca_dpa_mem_alloc(nvq->dpa, sizeof(struct dpa_nvqual_tls), &dtls);
717  if (doca_err != DOCA_SUCCESS) {
718  DOCA_LOG_ERR("Failed to alloc thread TLS: %s", (doca_error_get_name(doca_err)));
719  return doca_err;
720  }
721 
722  struct dpa_nvqual_tls htls;
723  htls.eu = eu_id;
724  htls.thread_ret = nvq->thread_rets + (nvq->num_threads * sizeof(struct dpa_nvqual_thread_ret));
725  htls.src_buf = src_buf;
726  htls.dst_buf = dst_buf;
727  htls.buffers_size = nvq->buffers_size;
728  htls.num_ops = nvq->num_ops;
729  htls.dev_se = nvq->dev_se;
730 
731  doca_err = doca_dpa_h2d_memcpy(nvq->dpa, dtls, (void *)(&htls), sizeof(struct dpa_nvqual_tls));
732  if (doca_err != DOCA_SUCCESS) {
733  DOCA_LOG_ERR("Failed to initialize thread TLS: %s", (doca_error_get_name(doca_err)));
734  return doca_err;
735  }
736 
737  nvq->tlss[eu_id] = htls;
738  nvq->dev_tlss[eu_id] = dtls;
739 
740  doca_err = doca_dpa_thread_set_func_arg(thread, dpa_nvqual_kernel, 0);
741  if (doca_err != DOCA_SUCCESS) {
742  DOCA_LOG_ERR("Failed to set thread kernel: %s", (doca_error_get_name(doca_err)));
743  return doca_err;
744  }
745 
746  doca_err = doca_dpa_thread_set_local_storage(thread, dtls);
747  if (doca_err != DOCA_SUCCESS) {
748  DOCA_LOG_ERR("Failed to set thread TLS: %s", (doca_error_get_name(doca_err)));
749  return doca_err;
750  }
751 
752  doca_err = doca_dpa_thread_start(thread);
753  if (doca_err != DOCA_SUCCESS) {
754  DOCA_LOG_ERR("Failed to start DPA thread: %s", (doca_error_get_name(doca_err)));
755  return doca_err;
756  }
757 
758  struct doca_dpa_notification_completion *notify_comp = NULL;
759 
760  doca_err = doca_dpa_notification_completion_create(nvq->dpa, thread, &notify_comp);
761  if (doca_err != DOCA_SUCCESS) {
762  DOCA_LOG_ERR("Failed to create notification completion: %s", (doca_error_get_name(doca_err)));
763  return doca_err;
764  }
765 
766  doca_err = doca_dpa_notification_completion_start(notify_comp);
767  if (doca_err != DOCA_SUCCESS) {
768  DOCA_LOG_ERR("Failed to start notification completion: %s", (doca_error_get_name(doca_err)));
769  return doca_err;
770  }
771 
773 
774  doca_err = doca_dpa_notification_completion_get_dpa_handle(notify_comp, &dev_notify_comp);
775  if (doca_err != DOCA_SUCCESS) {
776  DOCA_LOG_ERR("Failed to get notification completion device handle: %s",
777  (doca_error_get_name(doca_err)));
778  return doca_err;
779  }
780 
781  doca_err =
785  (void *)(&dev_notify_comp),
787  if (doca_err != DOCA_SUCCESS) {
788  DOCA_LOG_ERR("Failed to initialize thread TLS: %s", (doca_error_get_name(doca_err)));
789  return doca_err;
790  }
791 
792  nvq->notification_completions[eu_id] = notify_comp;
793 
794  doca_err = doca_dpa_thread_run(thread);
795  if (doca_err != DOCA_SUCCESS) {
796  DOCA_LOG_ERR("Failed to run thread: %s", (doca_error_get_name(doca_err)));
797  return doca_err;
798  }
799 
800  nvq->threads[eu_id] = thread;
801  nvq->num_threads++;
802  }
803  return DOCA_SUCCESS;
804 }
805 
814 static doca_error_t tear_down(struct dpa_nvqual *nvq)
815 {
816  for (unsigned int i = 1; i < nvq->total_num_eus; i++) {
817  if (nvq->notification_completions[i] != NULL) {
820  }
821  }
822 
823  for (unsigned int i = 1; i < nvq->total_num_eus; i++) {
824  if (memcmp(&nvq->tlss[i], &(struct dpa_nvqual_tls){0}, sizeof(struct dpa_nvqual_tls)) != 0) {
825  (void)doca_dpa_mem_free(nvq->dpa, nvq->tlss[i].src_buf);
826  (void)doca_dpa_mem_free(nvq->dpa, nvq->tlss[i].dst_buf);
827  }
828  }
829 
830  for (unsigned int i = 1; i < nvq->total_num_eus; i++) {
831  if (nvq->dev_tlss[i] != 0) {
832  (void)doca_dpa_mem_free(nvq->dpa, nvq->dev_tlss[i]);
833  }
834  }
835 
836  for (unsigned int i = 1; i < nvq->total_num_eus; i++) {
837  if (nvq->threads[i] != NULL) {
838  (void)doca_dpa_thread_stop(nvq->threads[i]);
839  (void)doca_dpa_thread_destroy(nvq->threads[i]);
840  }
841  }
842 
843  if (nvq->thread_rets)
844  (void)doca_dpa_mem_free(nvq->dpa, nvq->thread_rets);
845 
848 
849  if (nvq->affinity)
851 
852  if (nvq->se) {
853  (void)doca_sync_event_stop(nvq->se);
854  (void)doca_sync_event_destroy(nvq->se);
855  }
856 
857  if (nvq->dpa) {
858  (void)doca_dpa_stop(nvq->dpa);
859  (void)doca_dpa_destroy(nvq->dpa);
860  }
861 
862  if (nvq->dev)
863  (void)doca_dev_close(nvq->dev);
864 
865  if (nvq->dev_list)
867 
868  return DOCA_SUCCESS;
869 }
870 
879 static doca_error_t run_flow(struct dpa_nvqual *nvq)
880 {
881  uint64_t iter = 1;
882  doca_error_t doca_err = DOCA_SUCCESS;
883 
884  long long time_left = nvq->flow_cfg.test_duration_sec * DPA_NVQUAL_SEC_TO_USEC;
885 
886  while (time_left > 0) {
887  if (interrupted) {
888  DOCA_LOG_INFO("Terminating...");
889  break;
890  }
891 
892  int h = time_left / ((unsigned int)DPA_NVQUAL_SEC_IN_HOUR * (unsigned int)DPA_NVQUAL_SEC_TO_USEC);
895  DOCA_LOG_INFO("Estimated time left: %02d:%02d:%02d", h, m, s);
896 
897  DOCA_LOG_INFO("Starting iteration #%ld", iter);
898 
899  uint64_t ret = 1;
900 
901  struct timeval start;
902  gettimeofday(&start, NULL);
903 
904  DOCA_LOG_INFO("Dispatching kernel threads on all HARTs");
905  doca_err = doca_dpa_rpc(nvq->dpa,
907  &ret,
909  nvq->num_threads);
910  if (doca_err != DOCA_SUCCESS && ret != 0) {
911  DOCA_LOG_ERR("Failed to run RPC for waking up all threads: %s",
912  (doca_error_get_name(doca_err)));
913  return doca_err;
914  }
915 
916  DOCA_LOG_INFO("Waiting for all threads...");
918  if (doca_err != DOCA_SUCCESS) {
919  DOCA_LOG_ERR("Failed to wait for all threads: %s", (doca_error_get_name(doca_err)));
920  return doca_err;
921  }
922 
923  struct timeval current;
924  gettimeofday(&current, NULL);
925 
926  long long start_time = start.tv_sec * DPA_NVQUAL_SEC_TO_USEC + start.tv_usec;
927  long long current_time = current.tv_sec * DPA_NVQUAL_SEC_TO_USEC + current.tv_usec;
928  long long elapsed = current_time - start_time;
929 
930  time_left -= elapsed;
931  nvq->total_dpa_run_time_usec = nvq->total_dpa_run_time_usec + elapsed;
932 
933  DOCA_LOG_INFO("Retrieving kernel returned values");
934  struct dpa_nvqual_thread_ret thread_rets_host[nvq->num_threads];
935  doca_err = doca_dpa_d2h_memcpy(nvq->dpa,
936  (void *)(thread_rets_host),
937  nvq->thread_rets,
938  sizeof(struct dpa_nvqual_thread_ret) * nvq->num_threads);
939  if (doca_err != DOCA_SUCCESS) {
940  DOCA_LOG_ERR("Failed to copy thread rets from DPA heap: %s", (doca_error_get_name(doca_err)));
941  return doca_err;
942  }
943 
944  DOCA_LOG_INFO("Reporting interation errs");
945  for (unsigned int thread_idx = 0; thread_idx < nvq->num_threads; thread_idx++)
946  iteration_complete_cb(nvq, thread_rets_host[thread_idx].val);
947 
948  DOCA_LOG_INFO("Preparing for next iteration");
949  doca_err = doca_sync_event_update_set(nvq->se, 0);
950  if (doca_err != DOCA_SUCCESS) {
951  DOCA_LOG_ERR("Failed to clear se: %s", (doca_error_get_name(doca_err)));
952  return doca_err;
953  }
954  ++iter;
955  }
956 
957  DOCA_LOG_INFO("DPA run has completed.");
958 
959  return DOCA_SUCCESS;
960 }
961 
970 doca_error_t dpa_nvqual(struct dpa_nvqual_config *nvqual_argp_cfg)
971 {
972  doca_error_t doca_err = DOCA_SUCCESS;
973 
975  if (doca_err != DOCA_SUCCESS) {
976  DOCA_LOG_ERR("Failed to create logging backend for SDK messages: %s", (doca_error_get_name(doca_err)));
977  return doca_err;
978  }
979 
981  if (doca_err != DOCA_SUCCESS) {
982  DOCA_LOG_ERR("Failed to set logging backend log level for SDK messages: %s",
983  (doca_error_get_name(doca_err)));
984  return doca_err;
985  }
986 
987 #ifdef DOCA_DEBUG
989  if (doca_err != DOCA_SUCCESS) {
990  DOCA_LOG_ERR("Failed to set logging backend log level for SDK messages: %s",
991  (doca_error_get_name(doca_err)));
992  return doca_err;
993  }
994 #endif
995  struct dpa_nvqual *nvq = (struct dpa_nvqual *)malloc(sizeof(struct dpa_nvqual));
996  doca_err = setup(nvqual_argp_cfg, nvq);
997  if (doca_err != DOCA_SUCCESS) {
998  tear_down(nvq);
999  free(nvq);
1000  return doca_err;
1001  }
1002 
1003  if (!nvq->dpa) {
1004  DOCA_LOG_ERR(
1005  "DPA context member hasn't been initialized during the setup phase. Please initialize it in the setup method.");
1006  return DOCA_ERROR_BAD_STATE;
1007  }
1008 
1009  doca_err = run_flow(nvq);
1010  if (doca_err != DOCA_SUCCESS) {
1011  tear_down(nvq);
1012  free(nvq);
1013  return doca_err;
1014  }
1015 
1016  struct dpa_nvqual_run_output ret;
1017  memcpy(ret.available_eus, nvq->available_eus, sizeof(nvq->available_eus));
1020  ret.total_num_eus = nvq->total_num_eus;
1021 
1022  print_sample_data(&ret, &(nvq->flow_cfg));
1023 
1024  tear_down(nvq);
1025 
1026  free(nvq);
1027 
1028  return DOCA_SUCCESS;
1029 }
#define NULL
Definition: __stddef_null.h:26
__SIZE_TYPE__ size_t
uint64_t len
struct doca_dpa_app * dpa_sample_app
#define DPA_NVQUAL_DPA_FREQ
#define DPA_NVQUAL_MAX_EUS
#define DPA_NVQUAL_SEC_IN_HOUR
#define DPA_NVQUAL_SEC_IN_MINUTE
#define DPA_NVQUAL_ALLOCATED_DPA_HEAP_SIZE
#define DPA_NVQUAL_COPY_BYTE_LATENCY_USEC
#define DPA_NVQUAL_SEC_TO_USEC
#define DPA_NVQUAL_WATCHDOG_TIME_SEC
#define DPA_NVQUAL_MAX_INPUT_EXCLUDED_EUS_SIZE
#define DPA_NVQUAL_PRINT_BUFFER_SIZE
#define DPA_NVQUAL_ITERATION_DURATION_SEC
#define DPA_NVQUAL_SYNC_EVENT_MASK
static doca_error_t user_factor_param_callback(void *param, void *config)
ARGP Callback - Handle user factor parameter.
static void sigint_handler(int signum)
Signal interrupt handler.
static size_t get_num_used_eus(bool *available_eus, bool *excluded_eus, unsigned int total_num_eus)
Get number of used EUs.
DOCA_LOG_REGISTER(DPA_NVQUAL)
doca_dpa_func_t dpa_nvqual_entry_point
static doca_error_t iteration_complete_cb(struct dpa_nvqual *nvq, uint64_t ret_val)
Iteration complete updates.
static doca_error_t get_available_eus(struct doca_dpa *dpa, unsigned int total_num_eus, bool *available_eus, unsigned int *available_eus_size)
Get available EUs.
struct doca_log_backend * stdout_logger
static doca_error_t setup(struct dpa_nvqual_config *nvqual_argp_cfg, struct dpa_nvqual *nvq)
Setup sample's configuration.
static doca_error_t test_duration_sec_param_callback(void *param, void *config)
ARGP Callback - Handle duration seconds parameter.
doca_dpa_func_t dpa_nvqual_kernel
static doca_error_t dev_name_param_callback(void *param, void *config)
ARGP Callback - Handle device name parameter.
doca_error_t dpa_nvqual(struct dpa_nvqual_config *nvqual_argp_cfg)
Run DPA nvqual sample.
static doca_error_t run_flow(struct dpa_nvqual *nvq)
Run sample's flow.
static doca_error_t excluded_eus_param_callback(void *param, void *config)
ARGP Callback - Handle excluded eus parameter.
doca_error_t dpa_nvqual_register_params(void)
Register DPA nvqual parameters.
static doca_error_t tear_down(struct dpa_nvqual *nvq)
Tear down sample's configuration.
static doca_error_t print_sample_data(struct dpa_nvqual_run_output *output, struct dpa_nvqual_flow_config *flow_cfg)
Print sample's data.
static bool interrupted
DOCA_EXPERIMENTAL void doca_argp_param_set_description(struct doca_argp_param *param, const char *description)
Set the description of the program param, used during program usage.
DOCA_EXPERIMENTAL void doca_argp_param_set_long_name(struct doca_argp_param *param, const char *name)
Set the long name of the program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_arguments(struct doca_argp_param *param, const char *arguments)
Set the description of the expected arguments of the program param, used during program usage.
DOCA_EXPERIMENTAL void doca_argp_param_set_callback(struct doca_argp_param *param, doca_argp_param_cb_t callback)
Set the callback function of the program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_mandatory(struct doca_argp_param *param)
Mark the program param as mandatory.
DOCA_EXPERIMENTAL doca_error_t doca_argp_param_create(struct doca_argp_param **param)
Create new program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_type(struct doca_argp_param *param, enum doca_argp_type type)
Set the type of the param arguments.
DOCA_EXPERIMENTAL void doca_argp_param_set_short_name(struct doca_argp_param *param, const char *name)
Set the short name of the program param.
DOCA_EXPERIMENTAL doca_error_t doca_argp_register_param(struct doca_argp_param *input_param)
Register a program flag.
@ DOCA_ARGP_TYPE_STRING
Definition: doca_argp.h:56
DOCA_STABLE doca_error_t doca_devinfo_create_list(struct doca_devinfo ***dev_list, uint32_t *nb_devs)
Creates list of all available local devices.
DOCA_STABLE doca_error_t doca_devinfo_get_ibdev_name(const struct doca_devinfo *devinfo, char *ibdev_name, uint32_t size)
Get the name of the IB device represented by a DOCA devinfo.
#define DOCA_DEVINFO_IBDEV_NAME_SIZE
Buffer size to hold Infiniband/RoCE device name. Including a null terminator.
Definition: doca_dev.h:309
DOCA_STABLE doca_error_t doca_devinfo_destroy_list(struct doca_devinfo **dev_list)
Destroy list of local device info structures.
DOCA_STABLE doca_error_t doca_dev_open(struct doca_devinfo *devinfo, struct doca_dev **dev)
Initialize local device for use.
DOCA_STABLE doca_error_t doca_dev_close(struct doca_dev *dev)
Destroy allocated local device instance.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_notification_completion_start(struct doca_dpa_notification_completion *notify_comp)
Start DPA notification completion context.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_stop(struct doca_dpa *dpa)
Stop a DPA context.
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_thread_create(struct doca_dpa *dpa, struct doca_dpa_thread **dpa_thread)
Create DPA thread.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_create(struct doca_dev *dev, struct doca_dpa **dpa)
Create a DOCA DPA Context.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_notification_completion_destroy(struct doca_dpa_notification_completion *notify_comp)
Destroy DPA notification completion context.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_notification_completion_create(struct doca_dpa *dpa, struct doca_dpa_thread *dpa_thread, struct doca_dpa_notification_completion **notify_comp)
Create DPA notification completion context.
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_destroy(struct doca_dpa *dpa)
Destroy a DOCA DPA context.
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.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_set_local_storage(struct doca_dpa_thread *dpa_thread, doca_dpa_dev_uintptr_t dev_ptr)
Set DPA thread local storage.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_notification_completion_get_dpa_handle(struct doca_dpa_notification_completion *notify_comp, doca_dpa_dev_notification_completion_t *handle)
Get DPA notification completion context handle.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_eu_affinity_create(struct doca_dpa *dpa, struct doca_dpa_eu_affinity **affinity)
Create DPA EU affinity.
void() doca_dpa_func_t(void)
Generic function pointer type.
Definition: doca_dpa.h:118
DOCA_EXPERIMENTAL doca_error_t doca_dpa_notification_completion_stop(struct doca_dpa_notification_completion *notify_comp)
Stop DPA notification completion context.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_start(struct doca_dpa *dpa)
Start a DPA context.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_set_func_arg(struct doca_dpa_thread *dpa_thread, doca_dpa_func_t *func, uint64_t arg)
Set DPA thread entry point and its argument.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_d2h_memcpy(struct doca_dpa *dpa, void *dst_ptr, doca_dpa_dev_uintptr_t src_ptr, size_t size)
Copy from DPA Heap to host memory.
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.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_cap_is_supported(const struct doca_devinfo *devinfo)
Get whether the DOCA device supports DPA.
uint64_t doca_dpa_dev_uintptr_t
DPA pointer type definition.
Definition: doca_dpa.h:78
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_set_affinity(struct doca_dpa_thread *dpa_thread, const struct doca_dpa_eu_affinity *affinity)
Set DPA thread affinity.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_eu_affinity_destroy(struct doca_dpa_eu_affinity *affinity)
Destroy DPA EU affinity.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_get_total_num_eus_available(struct doca_dpa *dpa, unsigned int *total_num_eus)
Retrieve the total number of EUs available to the application.
uint64_t doca_dpa_dev_notification_completion_t
DPA notification completion handle type definition.
Definition: doca_dpa.h:98
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_start(struct doca_dpa_thread *dpa_thread)
Start DPA thread.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_stop(struct doca_dpa_thread *dpa_thread)
Stop DPA thread.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_eu_affinity_set(struct doca_dpa_eu_affinity *affinity, unsigned int eu_id)
Set EU ID in DPA EU affinity.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_thread_destroy(struct doca_dpa_thread *dpa_thread)
Destroy DPA thread.
DOCA_EXPERIMENTAL doca_error_t doca_dpa_set_app(struct doca_dpa *dpa, struct doca_dpa_app *app)
Set program app for DPA context.
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_name(doca_error_t error)
Returns the string representation of an error code name.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_ERROR_INVALID_VALUE
Definition: doca_error.h:44
@ DOCA_ERROR_OPERATING_SYSTEM
Definition: doca_error.h:58
@ DOCA_ERROR_NOT_FOUND
Definition: doca_error.h:54
@ DOCA_ERROR_BAD_STATE
Definition: doca_error.h:56
@ DOCA_SUCCESS
Definition: doca_error.h:38
@ DOCA_ERROR_BAD_CONFIG
Definition: doca_error.h:67
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
Definition: doca_log.h:466
#define DOCA_LOG_WARN(format,...)
Generates a WARNING application log message.
Definition: doca_log.h:476
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
Definition: doca_log.h:486
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_with_file_sdk(FILE *fptr, struct doca_log_backend **backend)
Create a logging backend with a FILE* stream for SDK messages.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_set_sdk_level(struct doca_log_backend *backend, uint32_t level)
Set the log level limit for SDK logging backends.
@ DOCA_LOG_LEVEL_WARNING
Definition: doca_log.h:47
@ DOCA_LOG_LEVEL_DEBUG
Definition: doca_log.h:49
@ DOCA_LOG_LEVEL_CRIT
Definition: doca_log.h:45
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_start(struct doca_sync_event *event)
Start a Sync Event to be operate as stand-alone DOCA Core object only.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_create(struct doca_sync_event **event)
Create a Sync Event handle.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_add_subscriber_location_dpa(struct doca_sync_event *event, struct doca_dpa *dpa)
Associate a DOCA DPA context as the Sync Event subscriber.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_update_set(struct doca_sync_event *event, uint64_t value)
Set the value of a Sync Event to some value synchronously.
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_stop(struct doca_sync_event *event)
Stop a Sync Event which has been previously started with 'doca_sync_event_start'.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_get_dpa_handle(struct doca_sync_event *event, struct doca_dpa *dpa, doca_dpa_dev_sync_event_t *dpa_dev_se_handle)
Export Sync Event to be shared with the DPA.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_destroy(struct doca_sync_event *event)
Destroy a Sync Event instance.
DOCA_EXPERIMENTAL doca_error_t doca_sync_event_add_publisher_location_cpu(struct doca_sync_event *event, struct doca_dev *dev)
Associate a CPU device context as the Sync Event publisher.
char dev_name[DPA_NVQUAL_DOCA_DEVINFO_IBDEV_NAME_SIZE]
bool excluded_eus[DPA_NVQUAL_MAX_EUS]
bool excluded_eus[DPA_NVQUAL_MAX_EUS]
bool available_eus[DPA_NVQUAL_MAX_EUS]
doca_dpa_dev_uintptr_t dst_buf
doca_dpa_dev_uintptr_t src_buf
doca_dpa_dev_sync_event_t dev_se
doca_dpa_dev_uintptr_t thread_ret
struct doca_dpa_thread * threads[DPA_NVQUAL_MAX_EUS]
struct doca_dpa_eu_affinity * affinity
struct doca_dpa * dpa
doca_dpa_dev_uintptr_t thread_rets
doca_dpa_dev_uintptr_t dev_tlss[DPA_NVQUAL_MAX_EUS]
uint32_t avg_latency_single_op
unsigned int total_num_eus
doca_dpa_dev_uintptr_t dev_notification_completions
bool available_eus[DPA_NVQUAL_MAX_EUS]
struct doca_dpa_notification_completion * notification_completions[DPA_NVQUAL_MAX_EUS]
struct doca_sync_event * se
struct doca_devinfo ** dev_list
unsigned int available_eus_size
struct doca_dev * dev
struct dpa_nvqual_flow_config flow_cfg
doca_dpa_dev_sync_event_t dev_se
struct dpa_nvqual_tls tlss[DPA_NVQUAL_MAX_EUS]
uint64_t total_dpa_run_time_usec