diff options
author | Zoltan Kiss <zoltan.kiss@linaro.org> | 2016-01-25 15:31:06 +0000 |
---|---|---|
committer | Zoltan Kiss <zoltan.kiss@linaro.org> | 2016-01-25 15:31:06 +0000 |
commit | 805f353637f2757857b2278e2c86682c356bde17 (patch) | |
tree | a297f2348ab12d56d40c52f30008ee4ab5d5f8cb | |
parent | 543d3052e12757ffcc2f3bd29967d0856731932f (diff) |
Port "67260075 linux-generic: init: handle local/global init/term cleanly"
Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r-- | platform/linux-dpdk/odp_init.c | 221 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_pool.c | 15 |
2 files changed, 184 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; diff --git a/platform/linux-dpdk/odp_pool.c b/platform/linux-dpdk/odp_pool.c index 98c83d395..9e5d06b51 100644 --- a/platform/linux-dpdk/odp_pool.c +++ b/platform/linux-dpdk/odp_pool.c @@ -87,6 +87,21 @@ int odp_pool_init_global(void) return 0; } +int odp_pool_init_local(void) +{ + return 0; +} + +int odp_pool_term_global(void) +{ + return 0; +} + +int odp_pool_term_local(void) +{ + return 0; +} + struct mbuf_ctor_arg { uint16_t seg_buf_offset; /* To skip the ODP buf/pkt/tmo header */ uint16_t seg_buf_size; /* size of user data */ |