[dpdk-dev] [PATCH v2] timer: fix resource leak in finalize
Carrillo, Erik G
erik.g.carrillo at intel.com
Wed May 8 00:04:21 CEST 2019
Hi Anatoly,
Thanks for the review. Comments in-line:
<...snipped...>
> > #define RTE_MAX_DATA_ELS 64
> > +static const struct rte_memzone *rte_timer_data_mz; static
> > +rte_atomic16_t *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; @@ -155,6 +157,7 @@
> > rte_timer_subsystem_init_v1905(void)
> > struct rte_timer_data *data;
> > int i, lcore_id;
> > static const char *mz_name = "rte_timer_mz";
> > + size_t data_arr_size = RTE_MAX_DATA_ELS *
> > +sizeof(*rte_timer_data_arr);
>
> nitpicking, but... const?
>
No problem - I'll make this change if this line persists into the next version.
<...snipped...>
> >
> > @@ -205,8 +216,11 @@
> 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;
> > +
> > + if (rte_atomic16_dec_and_test(rte_timer_mz_refcnt))
> > + rte_memzone_free(rte_timer_data_mz);
>
> I think there's a race here. You may get preempted after test but before
> free, where another secondary could initialize. As far as i know, we also
Indeed, thanks for catching this.
> support a case when secondary initializes after primary stops running.
>
> Let's even suppose that we allow secondary processes to initialize the timer
> subsystem by reserving memzone and checking rte_errno. You would still
> have a chance of two init/deinit conflicting, because there's a hole between
> memzone allocation and atomic increment.
>
> I don't think this race can be resolved in a safe way, so we might just have to
> settle for a memory leak.
>
I don't see a solution here currently either. I'll look at removing the memzone_free()
call and possibly the rte_timer_subsystem_finalize() API, since it seems like
there's no reason for it to exist if it can't free the allocations.
Regards,
Erik
> >
> > rte_timer_subsystem_initialized = 0;
> > }
> >
>
>
> --
> Thanks,
> Anatoly
More information about the dev
mailing list