aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTuomas Taipale <tuomas.taipale@nokia.com>2022-11-24 07:52:03 +0000
committerPetri Savolainen <petri.savolainen@nokia.com>2022-11-25 09:19:15 +0200
commitf5007f1ac803f80775daf5830613d92ed64cb6e0 (patch)
tree3d1db7b9362da84ab455a64188a618fa29aeac46 /test
parent94ca3d0a68583ab7ef1bcc712349cae3f7186e93 (diff)
test: dma_perf: add maximum retries for operations
Add maximum retries for synchronous and asynchronous transfers and transfer starts as well as asynchronous polling to make program eventually exit in case of it cannot be directly interrupted. Signed-off-by: Tuomas Taipale <tuomas.taipale@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Diffstat (limited to 'test')
-rw-r--r--test/performance/odp_dma_perf.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/test/performance/odp_dma_perf.c b/test/performance/odp_dma_perf.c
index 3b0c01e73..62899f913 100644
--- a/test/performance/odp_dma_perf.c
+++ b/test/performance/odp_dma_perf.c
@@ -44,6 +44,8 @@
#define MEGAS 1000000
#define KILOS 1000
+#define RETRIES 1000U
+
typedef struct test_config_t {
int trs_type;
int trs_grn;
@@ -677,7 +679,7 @@ static void print_humanised_speed(uint64_t speed)
printf("%" PRIu64 " B/s\n", speed);
}
-static void print_results(const test_config_t *config, uint64_t time)
+static void print_results(const test_config_t *config, uint64_t time, uint32_t retries)
{
const int is_sync = config->trs_type == TRS_TYPE_SYNC;
const uint64_t avg_time = time / config->num_rounds;
@@ -714,6 +716,7 @@ static void print_results(const test_config_t *config, uint64_t time)
" average transfer speed: ",
config->num_rounds, avg_time);
print_humanised_speed(avg_speed);
+ printf(" retries with usec sleep: %u\n", retries);
printf("\n=============================================\n");
}
@@ -722,7 +725,7 @@ static int run_dma_sync(test_config_t *config)
odp_dma_transfer_param_t trs_params[config->dma_rounds];
uint32_t trs_lengths[config->dma_rounds];
odp_time_t start, end;
- uint32_t num_rounds = config->num_rounds, offset;
+ uint32_t num_rounds = config->num_rounds, offset, retries = 0U;
int done = 0;
config->test_case_api.trs_base_fn(config, trs_params, trs_lengths);
@@ -741,8 +744,10 @@ static int run_dma_sync(test_config_t *config)
if (done > 0)
break;
- if (done == 0)
+ if (done == 0 && retries++ < RETRIES) {
+ odp_time_wait_ns(1000U);
continue;
+ }
ODPH_ERR("Error starting a sync DMA transfer.\n");
return -1;
@@ -753,7 +758,7 @@ static int run_dma_sync(test_config_t *config)
}
end = odp_time_local_strict();
- print_results(config, odp_time_diff_ns(end, start));
+ print_results(config, odp_time_diff_ns(end, start), retries);
return 0;
}
@@ -873,6 +878,7 @@ static inline int wait_dma_transfers_ready(test_config_t *config, compl_wait_ent
{
odp_event_t ev;
const uint64_t wait_time = odp_schedule_wait_time(config->wait_ns);
+ uint64_t start, end;
int done = 0;
for (int i = 0; i < config->dma_rounds; ++i) {
@@ -884,6 +890,9 @@ static inline int wait_dma_transfers_ready(test_config_t *config, compl_wait_ent
return -1;
}
} else {
+ start = odp_time_local_ns();
+ end = start + ODP_TIME_SEC_IN_NS;
+
while (1) {
done = odp_dma_transfer_done(config->dma_config.handle, list[i].id,
NULL);
@@ -891,7 +900,7 @@ static inline int wait_dma_transfers_ready(test_config_t *config, compl_wait_ent
if (done > 0)
break;
- if (done == 0)
+ if (done == 0 && odp_time_local_ns() < end)
continue;
ODPH_ERR("Error waiting poll completion.\n");
@@ -928,7 +937,7 @@ static int run_dma_async_transfer(test_config_t *config)
int ret = 0, started;
compl_wait_entry_t compl_wait_list[config->dma_rounds];
odp_time_t start, end;
- uint32_t num_rounds = config->num_rounds, offset;
+ uint32_t num_rounds = config->num_rounds, offset, retries = 0U;
config->test_case_api.trs_base_fn(config, trs_params, trs_lengths);
@@ -953,8 +962,10 @@ static int run_dma_async_transfer(test_config_t *config)
if (started > 0)
break;
- if (started == 0)
+ if (started == 0 && retries++ < RETRIES) {
+ odp_time_wait_ns(1000U);
continue;
+ }
ODPH_ERR("Error starting an async DMA transfer.\n");
ret = -1;
@@ -972,7 +983,7 @@ static int run_dma_async_transfer(test_config_t *config)
}
end = odp_time_local_strict();
- print_results(config, odp_time_diff_ns(end, start));
+ print_results(config, odp_time_diff_ns(end, start), retries);
out_compl_evs:
free_dma_completion_events(config, compl_params);