From: Stephen Hemminger <stephen@networkplumber.org>
To: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
Cc: rsanford@akamai.com, jerin.jacob@caviumnetworks.com,
pbhagavatula@caviumnetworks.com, dev@dpdk.org
Subject: Re: [PATCH v2 1/2] timer: allow timer management in shared memory
Date: Fri, 7 Dec 2018 10:10:11 -0800 [thread overview]
Message-ID: <20181207101011.4e0275b2@xeon-e3> (raw)
In-Reply-To: <1544205180-31546-2-git-send-email-erik.g.carrillo@intel.com>
On Fri, 7 Dec 2018 11:52:59 -0600
Erik Gabriel Carrillo <erik.g.carrillo@intel.com> wrote:
> Currently, the timer library uses a per-process table of structures to
> manage skiplists of timers presumably because timers contain arbitrary
> function pointers whose value may not resolve properly in other
> processes.
>
> However, if the same callback is used handle all timers, and that
> callback is only invoked in one process, then it woud be safe to allow
> the data structures to be allocated in shared memory, and to allow
> secondary processes to modify the timer lists. This would let timers be
> used in more multi-process scenarios.
>
> The library's global variables are wrapped with a struct, and an array
> of these structures is created in shared memory. The original APIs
> are updated to reference the zeroth entry in the array. This maintains
> the original behavior for both primary and secondary processes since
> the set intersection of their coremasks should be empty [1]. New APIs
> are introduced to enable the allocation/deallocation of other entries
> in the array.
>
> New variants of the APIs used to start and stop timers are introduced;
> they allow a caller to specify which array entry should be used to
> locate the timer list to insert into or delete from.
>
> Finally, a new variant of rte_timer_manage() is introduced, which
> allows a caller to specify which array entry should be used to locate
> the timer lists to process; it can also process multiple timer lists per
> invocation.
>
> [1] https://doc.dpdk.org/guides/prog_guide/multi_proc_support.html#multi-process-limitations
>
> Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
Makes sense but it looks to me like an ABI breakage. Experimental isn't going to
work for this.
> +static uint32_t default_data_id; // id set to zero automatically
C++ style comments are not allowed per DPDK coding style.
Best to just drop the comment, it is stating the obvious.
> -/* Init the timer library. */
> +static inline int
> +timer_data_valid(uint32_t id)
> +{
> + return !!(rte_timer_data_arr[id].internal_flags & FL_ALLOCATED);
> +}
Don't need inline on static functions.
...
> +MAP_STATIC_SYMBOL(int rte_timer_manage(void), rte_timer_manage_v1902);
> +BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1902, 19.02);
> +
> +int __rte_experimental
> +rte_timer_alt_manage(uint32_t timer_data_id,
> + unsigned int *poll_lcores,
> + int nb_poll_lcores,
> + rte_timer_alt_manage_cb_t f)
> +{
> + union rte_timer_status status;
> + struct rte_timer *tim, *next_tim, **pprev;
> + struct rte_timer *run_first_tims[RTE_MAX_LCORE];
> + unsigned int runlist_lcore_ids[RTE_MAX_LCORE];
> + unsigned int this_lcore = rte_lcore_id();
> + struct rte_timer *prev[MAX_SKIPLIST_DEPTH + 1];
> + uint64_t cur_time;
> + int i, j, ret;
> + int nb_runlists = 0;
> + struct rte_timer_data *data;
> + struct priv_timer *privp;
> + uint32_t poll_lcore;
> +
> + TIMER_DATA_VALID_GET_OR_ERR_RET(timer_data_id, data, -EINVAL);
> +
> + /* timer manager only runs on EAL thread with valid lcore_id */
> + assert(this_lcore < RTE_MAX_LCORE);
> +
> + __TIMER_STAT_ADD(data->priv_timer, manage, 1);
> +
> + if (poll_lcores == NULL) {
> + poll_lcores = (unsigned int []){rte_lcore_id()};
This isn't going to be safe. It assigns poll_lcores to an array
allocated on the stack.
> +
> + for (i = 0, poll_lcore = poll_lcores[i]; i < nb_poll_lcores;
> + poll_lcore = poll_lcores[++i]) {
> + privp = &data->priv_timer[poll_lcore];
> +
> + /* optimize for the case where per-cpu list is empty */
> + if (privp->pending_head.sl_next[0] == NULL)
> + continue;
> + cur_time = rte_get_timer_cycles();
> +
> +#ifdef RTE_ARCH_64
> + /* on 64-bit the value cached in the pending_head.expired will
> + * be updated atomically, so we can consult that for a quick
> + * check here outside the lock
> + */
> + if (likely(privp->pending_head.expire > cur_time))
> + continue;
> +#endif
This code needs to be optimized so that application can call this at a very
high rate without performance impact.
next prev parent reply other threads:[~2018-12-07 18:10 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-29 23:35 [PATCH 0/3] new software event timer adapter Erik Gabriel Carrillo
2018-11-29 23:35 ` [PATCH 1/3] timer: allow timer management in shared memory Erik Gabriel Carrillo
2018-11-29 23:35 ` [PATCH 2/3] timer: add function to stop all timers in a list Erik Gabriel Carrillo
2018-11-29 23:35 ` [PATCH 3/3] eventdev: add new software event timer adapter Erik Gabriel Carrillo
2018-11-30 7:26 ` [PATCH 0/3] " Pavan Nikhilesh
2018-11-30 19:07 ` Carrillo, Erik G
2018-12-07 17:52 ` [PATCH v2 0/2] Timer library changes Erik Gabriel Carrillo
2018-12-07 17:52 ` [PATCH v2 1/2] timer: allow timer management in shared memory Erik Gabriel Carrillo
2018-12-07 18:10 ` Stephen Hemminger [this message]
2018-12-07 19:21 ` Carrillo, Erik G
2018-12-07 17:53 ` [PATCH v2 2/2] timer: add function to stop all timers in a list Erik Gabriel Carrillo
2018-12-13 22:26 ` [PATCH v3 0/2] Timer library changes Erik Gabriel Carrillo
2018-12-13 22:26 ` [PATCH v3 1/2] timer: allow timer management in shared memory Erik Gabriel Carrillo
2018-12-13 22:26 ` [PATCH v3 2/2] timer: add function to stop all timers in a list Erik Gabriel Carrillo
2018-12-19 3:35 ` [PATCH v3 0/2] Timer library changes Thomas Monjalon
2018-12-19 7:33 ` Mattias Rönnblom
2019-03-05 22:41 ` Carrillo, Erik G
2019-03-05 22:58 ` [dpdk-techboard] " Thomas Monjalon
2019-03-06 18:54 ` Carrillo, Erik G
2019-03-06 20:17 ` Thomas Monjalon
2019-03-06 2:39 ` Varghese, Vipin
2019-03-06 15:15 ` Carrillo, Erik G
2019-03-07 2:33 ` Varghese, Vipin
2019-03-06 17:20 ` [PATCH v4 " Erik Gabriel Carrillo
2019-03-06 17:20 ` [PATCH v4 1/2] timer: allow timer management in shared memory Erik Gabriel Carrillo
2019-03-20 13:52 ` Sanford, Robert
2019-03-21 1:01 ` Carrillo, Erik G
2019-03-27 14:03 ` Thomas Monjalon
2019-03-28 12:42 ` Carrillo, Erik G
2019-04-15 21:49 ` [dpdk-dev] " Carrillo, Erik G
2019-03-06 17:20 ` [PATCH v4 2/2] timer: add function to stop all timers in a list Erik Gabriel Carrillo
2019-04-15 21:41 ` [dpdk-dev] [PATCH v5 0/2] Timer library changes Erik Gabriel Carrillo
2019-04-15 21:41 ` [dpdk-dev] [PATCH v5 1/2] timer: allow timer management in shared memory Erik Gabriel Carrillo
2019-04-17 17:09 ` Thomas Monjalon
2019-04-15 21:41 ` [dpdk-dev] [PATCH v5 2/2] timer: add function to stop all timers in a list Erik Gabriel Carrillo
2019-04-17 19:54 ` [dpdk-dev] [PATCH v5 0/2] Timer library changes Thomas Monjalon
2018-12-07 20:34 ` [PATCH v2 0/1] New software event timer adapter Erik Gabriel Carrillo
2018-12-07 20:34 ` [PATCH v2 1/1] eventdev: add new " Erik Gabriel Carrillo
2018-12-09 19:17 ` Mattias Rönnblom
2018-12-10 17:17 ` Carrillo, Erik G
2018-12-14 15:45 ` [PATCH v3 0/1] New " Erik Gabriel Carrillo
2018-12-14 15:45 ` [PATCH v3 1/1] eventdev: add new " Erik Gabriel Carrillo
2018-12-14 21:15 ` Mattias Rönnblom
2018-12-14 23:04 ` Carrillo, Erik G
2018-12-14 23:15 ` [PATCH v4 0/1] New " Erik Gabriel Carrillo
2018-12-14 23:15 ` [PATCH v4 1/1] eventdev: add new " Erik Gabriel Carrillo
2018-12-18 20:11 ` [EXT] [PATCH v4 0/1] New " Jerin Jacob Kollanukkaran
2018-12-18 20:14 ` Carrillo, Erik G
2019-04-22 14:57 ` [dpdk-dev] [PATCH v5 " Erik Gabriel Carrillo
2019-04-22 14:57 ` [dpdk-dev] [PATCH v5 1/1] eventdev: add new " Erik Gabriel Carrillo
2019-04-26 15:14 ` [dpdk-dev] [PATCH v6 0/1] New " Erik Gabriel Carrillo
2019-04-26 15:14 ` [dpdk-dev] [PATCH v6 1/1] eventdev: add new " Erik Gabriel Carrillo
2019-04-26 18:51 ` Honnappa Nagarahalli
2019-04-26 18:58 ` Carrillo, Erik G
2019-06-05 13:34 ` Jerin Jacob Kollanukkaran
2019-06-19 15:14 ` [dpdk-dev] [PATCH v7 0/1] New " Erik Gabriel Carrillo
2019-06-19 15:14 ` [dpdk-dev] [PATCH v7 1/1] eventdev: add new " Erik Gabriel Carrillo
2019-06-19 16:25 ` [dpdk-dev] [PATCH v8 0/1] New " Erik Gabriel Carrillo
2019-06-19 16:25 ` [dpdk-dev] [PATCH v8 1/1] eventdev: add new " Erik Gabriel Carrillo
2019-06-24 6:12 ` Jerin Jacob Kollanukkaran
2019-06-25 6:06 ` Jerin Jacob Kollanukkaran
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=20181207101011.4e0275b2@xeon-e3 \
--to=stephen@networkplumber.org \
--cc=dev@dpdk.org \
--cc=erik.g.carrillo@intel.com \
--cc=jerin.jacob@caviumnetworks.com \
--cc=pbhagavatula@caviumnetworks.com \
--cc=rsanford@akamai.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.