[ovs-dev] [PATCH v13 4/5] dpif-netdev: Refactor generic implementation
Van Haaren, Harry
harry.van.haaren at intel.com
Thu Jul 18 12:32:42 UTC 2019
> -----Original Message-----
> From: Ilya Maximets [mailto:i.maximets at samsung.com]
> Sent: Thursday, July 18, 2019 12:34 PM
> To: Van Haaren, Harry <harry.van.haaren at intel.com>; dev at openvswitch.org
> Cc: echaudro at redhat.com; malvika.gupta at arm.com; Stokes, Ian
> <ian.stokes at intel.com>
> Subject: Re: [PATCH v13 4/5] dpif-netdev: Refactor generic implementation
>
> On 17.07.2019 21:21, Harry van Haaren wrote:
<snip>
> > +/* Per thread data to store the blocks cache. The 'blocks_cache_count'
> variable
> > + * stores the size of the allocated space in uint64_t blocks (so * 8 to
> get the
> > + * size in bytes).
> > + */
> > +DEFINE_STATIC_PER_THREAD_DATA(uint64_t *, blocks_scratch_ptr, 0);
> > +DEFINE_STATIC_PER_THREAD_DATA(uint32_t, blocks_scratch_count_ptr, 0);
>
>
> Since you have a malloced data stored here it will be leaked on thread
> destruction.
> You need to use DEFINE_PER_THREAD_MALLOCED_DATA instead that will free the
> memory
> in this case.
Yes correct - I had (wrongly) assumed this was the way to do this, nice to
see that OVS has methods to handle cleanup of per-thread malloced data too.
> Please, consider following incremental:
Thanks - I've spotted a number of fixes/changes below, I'll list them.
I'll rework the v14 based on your suggested code.
> diff --git a/lib/dpif-netdev-lookup-generic.c b/lib/dpif-netdev-lookup-
> generic.c
> index 50edc483c..0addbad61 100644
> --- a/lib/dpif-netdev-lookup-generic.c
> +++ b/lib/dpif-netdev-lookup-generic.c
> @@ -36,12 +36,34 @@ VLOG_DEFINE_THIS_MODULE(dpif_lookup_generic);
<snip>
> +struct array {
> + uint32_t allocated; /* Number of elements allocated in 'elems'. */
> + uint64_t elems[];
> +};
> +
> +/* Per thread data to store the blocks cache. */
> +DEFINE_PER_THREAD_MALLOCED_DATA(struct array *, blocks_scratch_array);
This is the cleanup magic - on pthread_exit(),the handlers registered with
pthread_cleanup_push() will get called? Or is there a different mechanism
at play here?
> +static inline uint64_t *
> +get_blocks_scratch(uint32_t count)
> +{
> + struct array *darray = blocks_scratch_array_get();
> +
> + /* Check if this thread already has a large enough array allocated.
> + * This is a predictable UNLIKLEY branch as it will only occur once at
> + * startup, or if a subtable with higher blocks count is added.
> + */
> + if (OVS_UNLIKELY(!darray || darray->allocated < count)) {
> + /* Allocate new memory for blocks_scratch, and store new size. */
> + darray = xrealloc(darray,
Nice - xrealloc handles NULL correctly and saves use manually handling free().
> + darray->allocated = count;
> + blocks_scratch_array_set_unsafe(darray);
Clean way to set the data - nice, didn’t know of that function.
> + VLOG_DBG("Block scratch array resized to %"PRIu32, count);
And a PRIu32 fixup, thanks.
I'll push v14 shortly, appreciate the input. -Harry
More information about the dev
mailing list