aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk/odp_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-dpdk/odp_init.c')
-rw-r--r--platform/linux-dpdk/odp_init.c221
1 files changed, 169 insertions, 52 deletions
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index 1a0c22823..92c967925 100644
--- a/platform/linux-dpdk/odp_init.c
+++ b/platform/linux-dpdk/odp_init.c
@@ -237,6 +237,7 @@ struct odp_global_data_s odp_global_data;
int odp_init_global(const odp_init_t *params,
const odp_platform_init_t *platform_params)
{
+ enum init_stage stage = NO_INIT;
odp_global_data.log_fn = odp_override_log;
odp_global_data.abort_fn = odp_override_abort;
@@ -247,7 +248,17 @@ int odp_init_global(const odp_init_t *params,
odp_global_data.abort_fn = params->abort_fn;
}
- odp_system_info_init();
+ if (odp_time_init_global()) {
+ ODP_ERR("ODP time init failed.\n");
+ goto init_failed;
+ }
+ stage = TIME_INIT;
+
+ if (odp_system_info_init()) {
+ ODP_ERR("ODP system_info init failed.\n");
+ goto init_failed;
+ }
+ stage = SYSINFO_INIT;
if (odp_init_dpdk((const char *)platform_params)) {
ODP_ERR("ODP dpdk init failed.\n");
@@ -256,89 +267,156 @@ int odp_init_global(const odp_init_t *params,
if (odp_shm_init_global()) {
ODP_ERR("ODP shm init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = SHM_INIT;
if (odp_thread_init_global()) {
ODP_ERR("ODP thread init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = THREAD_INIT;
if (odp_pool_init_global()) {
ODP_ERR("ODP pool init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = POOL_INIT;
if (odp_queue_init_global()) {
ODP_ERR("ODP queue init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = QUEUE_INIT;
if (odp_schedule_init_global()) {
ODP_ERR("ODP schedule init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = SCHED_INIT;
if (odp_pktio_init_global()) {
ODP_ERR("ODP packet io init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = PKTIO_INIT;
if (odp_timer_init_global()) {
ODP_ERR("ODP timer init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = TIMER_INIT;
if (odp_crypto_init_global()) {
ODP_ERR("ODP crypto init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = CRYPTO_INIT;
if (odp_classification_init_global()) {
ODP_ERR("ODP classification init failed.\n");
- return -1;
+ goto init_failed;
}
+ stage = CLASSIFICATION_INIT;
return 0;
+
+init_failed:
+ _odp_term_global(stage);
+ return -1;
}
int odp_term_global(void)
{
+ return _odp_term_global(ALL_INIT);
+}
+
+int _odp_term_global(enum init_stage stage)
+{
int rc = 0;
- if (odp_classification_term_global()) {
- ODP_ERR("ODP classificatio term failed.\n");
- rc = -1;
- }
+ switch (stage) {
+ case ALL_INIT:
- if (odp_crypto_term_global()) {
- ODP_ERR("ODP crypto term failed.\n");
- rc = -1;
- }
+ case CLASSIFICATION_INIT:
+ if (odp_classification_term_global()) {
+ ODP_ERR("ODP classificatio term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
- if (odp_schedule_term_global()) {
- ODP_ERR("ODP schedule term failed.\n");
- rc = -1;
- }
+ case CRYPTO_INIT:
+ if (odp_crypto_term_global()) {
+ ODP_ERR("ODP crypto term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
- if (odp_pktio_term_global()) {
- ODP_ERR("ODP pktio term failed.\n");
- rc = -1;
- }
+ case TIMER_INIT:
+ if (odp_timer_term_global()) {
+ ODP_ERR("ODP timer term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
- if (odp_queue_term_global()) {
- ODP_ERR("ODP queue term failed.\n");
- rc = -1;
- }
+ case PKTIO_INIT:
+ if (odp_pktio_term_global()) {
+ ODP_ERR("ODP pktio term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
- if (odp_thread_term_global()) {
- ODP_ERR("ODP thread term failed.\n");
- rc = -1;
- }
+ case SCHED_INIT:
+ if (odp_schedule_term_global()) {
+ ODP_ERR("ODP schedule term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case QUEUE_INIT:
+ if (odp_queue_term_global()) {
+ ODP_ERR("ODP queue term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case POOL_INIT:
+ if (odp_pool_term_global()) {
+ ODP_ERR("ODP buffer pool term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case THREAD_INIT:
+ if (odp_thread_term_global()) {
+ ODP_ERR("ODP thread term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case SHM_INIT:
+ if (odp_shm_term_global()) {
+ ODP_ERR("ODP shm term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
- if (odp_shm_term_global()) {
- ODP_ERR("ODP shm term failed.\n");
- rc = -1;
+ case SYSINFO_INIT:
+ if (odp_system_info_term()) {
+ ODP_ERR("ODP system info term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case TIME_INIT:
+ if (odp_time_term_global()) {
+ ODP_ERR("ODP time term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case NO_INIT:
+ ;
}
return rc;
@@ -346,46 +424,85 @@ int odp_term_global(void)
int odp_init_local(odp_thread_type_t thr_type)
{
+ enum init_stage stage = NO_INIT;
+
if (odp_shm_init_local()) {
ODP_ERR("ODP shm local init failed.\n");
- return -1;
+ goto init_fail;
}
+ stage = SHM_INIT;
if (odp_thread_init_local(thr_type)) {
ODP_ERR("ODP thread local init failed.\n");
- return -1;
+ goto init_fail;
}
+ stage = THREAD_INIT;
if (odp_pktio_init_local()) {
ODP_ERR("ODP packet io local init failed.\n");
- return -1;
+ goto init_fail;
+ }
+ stage = PKTIO_INIT;
+
+ if (odp_pool_init_local()) {
+ ODP_ERR("ODP pool local init failed.\n");
+ goto init_fail;
}
+ stage = POOL_INIT;
if (odp_schedule_init_local()) {
ODP_ERR("ODP schedule local init failed.\n");
- return -1;
+ goto init_fail;
}
+ stage = SCHED_INIT;
return 0;
+
+init_fail:
+ _odp_term_local(stage);
+ return -1;
}
int odp_term_local(void)
{
+ return _odp_term_local(ALL_INIT);
+}
+
+int _odp_term_local(enum init_stage stage)
+{
int rc = 0;
int rc_thd = 0;
- if (odp_schedule_term_local()) {
- ODP_ERR("ODP schedule local term failed.\n");
- rc = -1;
- }
+ switch (stage) {
+ case ALL_INIT:
+
+ case SCHED_INIT:
+ if (odp_schedule_term_local()) {
+ ODP_ERR("ODP schedule local term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case POOL_INIT:
+ if (odp_pool_term_local()) {
+ ODP_ERR("ODP buffer pool local term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
+ case THREAD_INIT:
+ rc_thd = odp_thread_term_local();
+ if (rc_thd < 0) {
+ ODP_ERR("ODP thread local term failed.\n");
+ rc = -1;
+ } else {
+ if (!rc)
+ rc = rc_thd;
+ }
+ /* Fall through */
- rc_thd = odp_thread_term_local();
- if (rc_thd < 0) {
- ODP_ERR("ODP thread local term failed.\n");
- rc = -1;
- } else {
- if (!rc)
- rc = rc_thd;
+ default:
+ break;
}
return rc;