X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_timer%2Frte_timer.c;h=71dffd23bfca01dab8f2fd57c7e8916df27d6fa3;hb=b869cbc955382d67aa2cc5318933a579099869b9;hp=9f2e921a8ae489b2ffa8830f55d15d88130bf98b;hpb=0efd46d7955de6a7b5d011fcac51bd42a8e6409b;p=dpdk.git diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c index 9f2e921a8a..71dffd23bf 100644 --- a/lib/librte_timer/rte_timer.c +++ b/lib/librte_timer/rte_timer.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #include "rte_timer.h" @@ -60,6 +62,8 @@ struct rte_timer_data { }; #define RTE_MAX_DATA_ELS 64 +static const struct rte_memzone *rte_timer_data_mz; +static int *volatile rte_timer_mz_refcnt; static struct rte_timer_data *rte_timer_data_arr; static const uint32_t default_data_id; static uint32_t rte_timer_subsystem_initialized; @@ -91,7 +95,7 @@ timer_data_valid(uint32_t id) timer_data = &rte_timer_data_arr[id]; \ } while (0) -int __rte_experimental +int rte_timer_data_alloc(uint32_t *id_ptr) { int i; @@ -115,7 +119,7 @@ rte_timer_data_alloc(uint32_t *id_ptr) return -ENOSPC; } -int __rte_experimental +int rte_timer_data_dealloc(uint32_t id) { struct rte_timer_data *timer_data; @@ -155,44 +159,50 @@ rte_timer_subsystem_init_v1905(void) struct rte_timer_data *data; int i, lcore_id; static const char *mz_name = "rte_timer_mz"; + const size_t data_arr_size = + RTE_MAX_DATA_ELS * sizeof(*rte_timer_data_arr); + const size_t mem_size = data_arr_size + sizeof(*rte_timer_mz_refcnt); + bool do_full_init = true; if (rte_timer_subsystem_initialized) return -EALREADY; - if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - mz = rte_memzone_lookup(mz_name); - if (mz == NULL) - return -EEXIST; - - rte_timer_data_arr = mz->addr; - - rte_timer_data_arr[default_data_id].internal_flags |= - FL_ALLOCATED; - - rte_timer_subsystem_initialized = 1; - - return 0; - } + rte_mcfg_timer_lock(); - mz = rte_memzone_reserve_aligned(mz_name, - RTE_MAX_DATA_ELS * sizeof(*rte_timer_data_arr), - SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE); - if (mz == NULL) - return -ENOMEM; + mz = rte_memzone_lookup(mz_name); + if (mz == NULL) { + mz = rte_memzone_reserve_aligned(mz_name, mem_size, + SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE); + if (mz == NULL) { + rte_mcfg_timer_unlock(); + return -ENOMEM; + } + do_full_init = true; + } else + do_full_init = false; + rte_timer_data_mz = mz; rte_timer_data_arr = mz->addr; - - for (i = 0; i < RTE_MAX_DATA_ELS; i++) { - data = &rte_timer_data_arr[i]; - - for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { - rte_spinlock_init( - &data->priv_timer[lcore_id].list_lock); - data->priv_timer[lcore_id].prev_lcore = lcore_id; + rte_timer_mz_refcnt = (void *)((char *)mz->addr + data_arr_size); + + if (do_full_init) { + for (i = 0; i < RTE_MAX_DATA_ELS; i++) { + data = &rte_timer_data_arr[i]; + + for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; + lcore_id++) { + rte_spinlock_init( + &data->priv_timer[lcore_id].list_lock); + data->priv_timer[lcore_id].prev_lcore = + lcore_id; + } } } rte_timer_data_arr[default_data_id].internal_flags |= FL_ALLOCATED; + (*rte_timer_mz_refcnt)++; + + rte_mcfg_timer_unlock(); rte_timer_subsystem_initialized = 1; @@ -202,11 +212,18 @@ MAP_STATIC_SYMBOL(int rte_timer_subsystem_init(void), rte_timer_subsystem_init_v1905); BIND_DEFAULT_SYMBOL(rte_timer_subsystem_init, _v1905, 19.05); -void __rte_experimental +void rte_timer_subsystem_finalize(void) { - if (rte_timer_data_arr) - rte_free(rte_timer_data_arr); + if (!rte_timer_subsystem_initialized) + return; + + rte_mcfg_timer_lock(); + + if (--(*rte_timer_mz_refcnt) == 0) + rte_memzone_free(rte_timer_data_mz); + + rte_mcfg_timer_unlock(); rte_timer_subsystem_initialized = 0; } @@ -571,7 +588,7 @@ MAP_STATIC_SYMBOL(int rte_timer_reset(struct rte_timer *tim, uint64_t ticks, rte_timer_reset_v1905); BIND_DEFAULT_SYMBOL(rte_timer_reset, _v1905, 19.05); -int __rte_experimental +int rte_timer_alt_reset(uint32_t timer_data_id, struct rte_timer *tim, uint64_t ticks, enum rte_timer_type type, unsigned int tim_lcore, rte_timer_cb_t fct, void *arg) @@ -655,7 +672,7 @@ MAP_STATIC_SYMBOL(int rte_timer_stop(struct rte_timer *tim), rte_timer_stop_v1905); BIND_DEFAULT_SYMBOL(rte_timer_stop, _v1905, 19.05); -int __rte_experimental +int rte_timer_alt_stop(uint32_t timer_data_id, struct rte_timer *tim) { struct rte_timer_data *timer_data; @@ -820,7 +837,7 @@ rte_timer_manage_v1905(void) MAP_STATIC_SYMBOL(int rte_timer_manage(void), rte_timer_manage_v1905); BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1905, 19.05); -int __rte_experimental +int rte_timer_alt_manage(uint32_t timer_data_id, unsigned int *poll_lcores, int nb_poll_lcores, @@ -993,7 +1010,7 @@ rte_timer_alt_manage(uint32_t timer_data_id, } /* Walk pending lists, stopping timers and calling user-specified function */ -int __rte_experimental +int rte_timer_stop_all(uint32_t timer_data_id, unsigned int *walk_lcores, int nb_walk_lcores, rte_timer_stop_all_cb_t f, void *f_arg) @@ -1072,7 +1089,7 @@ MAP_STATIC_SYMBOL(int rte_timer_dump_stats(FILE *f), rte_timer_dump_stats_v1905); BIND_DEFAULT_SYMBOL(rte_timer_dump_stats, _v1905, 19.05); -int __rte_experimental +int rte_timer_alt_dump_stats(uint32_t timer_data_id __rte_unused, FILE *f) { struct rte_timer_data *timer_data;