timer: allow first subsystem init from secondary
Checks
Commit Message
Since memzones can be reserved from secondary processes as well as
primary processes, if the first call to the timer subsystem init
function occurs in a secondary process, we should allow it to succeed.
Fixes: c0749f7096c7 ("timer: allow management in shared memory")
Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---
lib/librte_timer/rte_timer.c | 52 +++++++++++++++++++++++---------------------
1 file changed, 27 insertions(+), 25 deletions(-)
Comments
On 08-May-19 11:17 PM, Erik Gabriel Carrillo wrote:
> Since memzones can be reserved from secondary processes as well as
> primary processes, if the first call to the timer subsystem init
> function occurs in a secondary process, we should allow it to succeed.
>
> Fixes: c0749f7096c7 ("timer: allow management in shared memory")
>
> Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
> ---
> lib/librte_timer/rte_timer.c | 52 +++++++++++++++++++++++---------------------
> 1 file changed, 27 insertions(+), 25 deletions(-)
>
> diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
> index 9f2e921..c0f5b87 100644
> --- a/lib/librte_timer/rte_timer.c
> +++ b/lib/librte_timer/rte_timer.c
> @@ -25,6 +25,7 @@
> #include <rte_memzone.h>
> #include <rte_malloc.h>
> #include <rte_compat.h>
> +#include <rte_errno.h>
>
> #include "rte_timer.h"
>
> @@ -155,40 +156,41 @@ 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);
> + bool do_full_init;
>
> 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;
> +lookup:
> + mz = rte_memzone_lookup(mz_name);
Wouldn't it be better to attempt to reserve outright, and then do a
lookup on EEXIST?
> + if (mz == NULL) {
> + mz = rte_memzone_reserve_aligned(mz_name, data_arr_size,
> + SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE);
> + if (mz == NULL) {
> + if (rte_errno == EEXIST)
> + goto lookup;
>
<...snipped...>
> >
> > @@ -155,40 +156,41 @@ 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);
> > + bool do_full_init;
> >
> > 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;
> > +lookup:
> > + mz = rte_memzone_lookup(mz_name);
>
> Wouldn't it be better to attempt to reserve outright, and then do a lookup on
> EEXIST?
It's probably the expected order; I've made the change and submitted v2.
Thanks for the review,
Erik
>
> > + if (mz == NULL) {
> > + mz = rte_memzone_reserve_aligned(mz_name,
> data_arr_size,
> > + SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE);
> > + if (mz == NULL) {
> > + if (rte_errno == EEXIST)
> > + goto lookup;
> >
>
>
> --
> Thanks,
> Anatoly
@@ -25,6 +25,7 @@
#include <rte_memzone.h>
#include <rte_malloc.h>
#include <rte_compat.h>
+#include <rte_errno.h>
#include "rte_timer.h"
@@ -155,40 +156,41 @@ 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);
+ bool do_full_init;
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;
+lookup:
+ mz = rte_memzone_lookup(mz_name);
+ if (mz == NULL) {
+ mz = rte_memzone_reserve_aligned(mz_name, data_arr_size,
+ SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE);
+ if (mz == NULL) {
+ if (rte_errno == EEXIST)
+ goto lookup;
- rte_timer_data_arr = mz->addr;
-
- rte_timer_data_arr[default_data_id].internal_flags |=
- FL_ALLOCATED;
-
- rte_timer_subsystem_initialized = 1;
+ return -ENOMEM;
+ }
- return 0;
+ do_full_init = true;
}
- 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;
-
rte_timer_data_arr = mz->addr;
- for (i = 0; i < RTE_MAX_DATA_ELS; i++) {
- data = &rte_timer_data_arr[i];
+ 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;
+ 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;
+ }
}
}
@@ -205,8 +207,8 @@ BIND_DEFAULT_SYMBOL(rte_timer_subsystem_init, _v1905, 19.05);
void __rte_experimental
rte_timer_subsystem_finalize(void)
{
- if (rte_timer_data_arr)
- rte_free(rte_timer_data_arr);
+ if (!rte_timer_subsystem_initialized)
+ return;
rte_timer_subsystem_initialized = 0;
}