From: Olivier MATZ <olivier.matz@6wind.com>
To: Lazaros Koromilas <l@nofutznetworks.com>, dev@dpdk.org
Subject: Re: [PATCH v2 1/2] mempool: allow for user-owned mempool caches
Date: Wed, 11 May 2016 11:56:00 +0200 [thread overview]
Message-ID: <573301B0.5000205@6wind.com> (raw)
In-Reply-To: <1459784610-14008-1-git-send-email-l@nofutznetworks.com>
Hi Lazaros,
Sorry for the late review. Please find some comments,
in addition to what Konstantin already said.
On 04/04/2016 05:43 PM, Lazaros Koromilas wrote:
> --- a/app/test/test_mempool.c
> +++ b/app/test/test_mempool.c
> @@ -79,6 +79,7 @@
>
> static struct rte_mempool *mp;
> static struct rte_mempool *mp_cache, *mp_nocache;
> +static int use_external_cache;
>
> static rte_atomic32_t synchro;
>
> @@ -107,19 +108,33 @@ test_mempool_basic(void)
> char *obj_data;
> int ret = 0;
> unsigned i, j;
> + struct rte_mempool_cache *cache;
> +
> + if (use_external_cache)
> + /* Create a user-owned mempool cache. */
> + cache = rte_mempool_cache_create(RTE_MEMPOOL_CACHE_MAX_SIZE,
> + SOCKET_ID_ANY);
> + else
> + cache = rte_mempool_default_cache(mp, rte_lcore_id());
Shouldn't we return an error if rte_mempool_default_cache()
failed? Even if the cache can be NULL for get/put, it would
crash on the flush() operation, so it's better to return an
error if the cache cannot be allocated.
I also think the resource should be freed on error, maybe
by doing "goto fail" instead of "return -1" in the subsequent
checks. Note that I also reworked this test in my patchset, see:
http://dpdk.org/dev/patchwork/patch/12069/
I think the "use_external_cache" parameter should be a parameter
instead of a global variable, like I've done for the mempool pointer.
> --- a/app/test/test_mempool_perf.c
> +++ b/app/test/test_mempool_perf.c
> @@ -98,6 +101,8 @@
>
> static struct rte_mempool *mp;
> static struct rte_mempool *mp_cache, *mp_nocache;
> +static int use_external_cache;
> +static unsigned external_cache_size = RTE_MEMPOOL_CACHE_MAX_SIZE;
>
> static rte_atomic32_t synchro;
>
The same comment (global vs parameter) could apply here, but it would
require to rework the full test file... so maybe it's off topic.
> @@ -137,6 +142,14 @@ per_lcore_mempool_test(__attribute__((unused)) void *arg)
> int ret;
> uint64_t start_cycles, end_cycles;
> uint64_t time_diff = 0, hz = rte_get_timer_hz();
> + struct rte_mempool_cache *cache;
> +
> + if (use_external_cache)
> + /* Create a user-owned mempool cache. */
> + cache = rte_mempool_cache_create(external_cache_size,
> + SOCKET_ID_ANY);
> + else
> + cache = rte_mempool_default_cache(mp, lcore_id);
>
> /* n_get_bulk and n_put_bulk must be divisors of n_keep */
> if (((n_keep / n_get_bulk) * n_get_bulk) != n_keep)
Same comments than above (check return value != NULL).
The cache creation could be moved some lines below to avoid
to free the resource on error.
> --- a/lib/librte_eal/common/eal_common_log.c
> +++ b/lib/librte_eal/common/eal_common_log.c
> @@ -125,7 +125,7 @@ rte_log_add_in_history(const char *buf, size_t size)
> }
> }
> else {
> - if (rte_mempool_mc_get(log_history_mp, &obj) < 0)
> + if (rte_mempool_get(log_history_mp, &obj) < 0)
> obj = NULL;
> hist_buf = obj;
> }
After seeing many changes like this, I wonder if it's possible
to move these in a separate commit:
"mempool: deprecate specific get/put functions"
It would remove some noise in the "interesting" part. I suggest
the following order:
mempool: deprecate specific get/put functions
mempool: use bit flags instead of is_mp and is_mc
mempool: allow for user-owned mempool caches
What do you think?
> static inline void __attribute__((always_inline))
> -__mempool_put_bulk(struct rte_mempool *mp, void * const *obj_table,
> - unsigned n, int is_mp)
> +__mempool_generic_put(struct rte_mempool *mp, void * const *obj_table,
> + unsigned n, struct rte_mempool_cache *cache, int is_mp)
> {
> - struct rte_mempool_cache *cache;
> uint32_t index;
> void **cache_objs;
> - unsigned lcore_id = rte_lcore_id();
> - uint32_t cache_size = mp->cache_size;
> - uint32_t flushthresh = mp->cache_flushthresh;
>
> /* increment stat now, adding in mempool always success */
> __MEMPOOL_STAT_ADD(mp, put, n);
>
> - /* cache is not enabled or single producer or non-EAL thread */
> - if (unlikely(cache_size == 0 || is_mp == 0 ||
> - lcore_id >= RTE_MAX_LCORE))
> + /* No cache provided or cache is not enabled or single producer */
> + if (unlikely(cache == NULL || cache->size == 0 || is_mp == 0))
> goto ring_enqueue;
Is it possible that cache->size == 0?
I suggest to remove that test and ensure that size != 0 at cache
creation.
> -__mempool_put_bulk(struct rte_mempool *mp, void * const *obj_table,
> - unsigned n, int is_mp)
> +__mempool_generic_put(struct rte_mempool *mp, void * const *obj_table,
> + unsigned n, struct rte_mempool_cache *cache, int is_mp)
> -rte_mempool_mp_put_bulk(struct rte_mempool *mp, void * const *obj_table,
> - unsigned n)
> -rte_mempool_sp_put_bulk(struct rte_mempool *mp, void * const *obj_table,
> - unsigned n)
> +rte_mempool_generic_put(struct rte_mempool *mp, void * const *obj_table,
> + unsigned n, struct rte_mempool_cache *cache, int is_mp)
> -rte_mempool_mp_put(struct rte_mempool *mp, void *obj)
> -rte_mempool_sp_put(struct rte_mempool *mp, void *obj)
> -__mempool_get_bulk(struct rte_mempool *mp, void **obj_table,
> - unsigned n, int is_mc)
> +__mempool_generic_get(struct rte_mempool *mp, void **obj_table,
> + unsigned n, struct rte_mempool_cache *cache, int is_mc)
> -rte_mempool_mc_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned n)
> -rte_mempool_sc_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned n)
> +rte_mempool_generic_get(struct rte_mempool *mp, void **obj_table,
> -rte_mempool_mc_get(struct rte_mempool *mp, void **obj_p)
> -rte_mempool_sc_get(struct rte_mempool *mp, void **obj_p)
I think removing the mp/mc/sp/sc functions (or deprecate them for now,
as suggested by Konstantin/Thomas) is a good thing for code readability
in rte_mempool.h. Thanks for doing this!
Regards,
Olivier
next prev parent reply other threads:[~2016-05-11 9:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-04 15:43 [PATCH v2 1/2] mempool: allow for user-owned mempool caches Lazaros Koromilas
2016-04-04 15:43 ` [PATCH v2 2/2] mempool: use bit flags instead of is_mp and is_mc Lazaros Koromilas
2016-04-05 9:24 ` [PATCH v2 1/2] mempool: allow for user-owned mempool caches Lazaros Koromilas
2016-04-18 13:17 ` Ananyev, Konstantin
2016-04-19 15:39 ` Lazaros Koromilas
2016-04-19 15:56 ` Thomas Monjalon
2016-05-11 9:56 ` Olivier MATZ [this message]
2016-06-13 12:21 ` Olivier Matz
2016-06-14 8:55 ` Lazaros Koromilas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=573301B0.5000205@6wind.com \
--to=olivier.matz@6wind.com \
--cc=dev@dpdk.org \
--cc=l@nofutznetworks.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.