DPDK patches and discussions
 help / color / mirror / Atom feed
From: Phil Yang <phil.yang@arm.com>
To: erik.g.carrillo@intel.com, dev@dpdk.org
Cc: jerinj@marvell.com, Honnappa.Nagarahalli@arm.com,
	drc@linux.vnet.ibm.com, Ruifeng.Wang@arm.com,
	Dharmik.Thakkar@arm.com, nd@arm.com
Subject: [dpdk-dev] [PATCH v2 2/4] eventdev: use c11 atomics for lcore timer armed flag
Date: Thu,  2 Jul 2020 13:26:42 +0800	[thread overview]
Message-ID: <1593667604-12029-2-git-send-email-phil.yang@arm.com> (raw)
In-Reply-To: <1593667604-12029-1-git-send-email-phil.yang@arm.com>

The in_use flag is a per core variable which is not shared between
lcores in the normal case and the access of this variable should be
ordered on the same core. However, if non-EAL thread pick the highest
lcore to insert timers into, there is the possibility of conflicts
on this flag between threads. Then the atomic CAS operation is needed.

Use the c11 atomic CAS instead of the generic rte_atomic operations
to avoid the unnecessary barrier on aarch64.

Signed-off-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Dharmik Thakkar <dharmik.thakkar@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
v2:
1. Make the code comments more accurate. (Erik)
2. Define the in_use flag as an unsigned type. (Stephen)

 lib/librte_eventdev/rte_event_timer_adapter.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/librte_eventdev/rte_event_timer_adapter.c
index a36d3d2..7cc334c 100644
--- a/lib/librte_eventdev/rte_event_timer_adapter.c
+++ b/lib/librte_eventdev/rte_event_timer_adapter.c
@@ -554,7 +554,7 @@ struct swtim {
 	uint32_t timer_data_id;
 	/* Track which cores have actually armed a timer */
 	struct {
-		rte_atomic16_t v;
+		uint16_t v;
 	} __rte_cache_aligned in_use[RTE_MAX_LCORE];
 	/* Track which cores' timer lists should be polled */
 	unsigned int poll_lcores[RTE_MAX_LCORE];
@@ -606,7 +606,8 @@ swtim_callback(struct rte_timer *tim)
 				      "with immediate expiry value");
 		}
 
-		if (unlikely(rte_atomic16_test_and_set(&sw->in_use[lcore].v))) {
+		if (unlikely(sw->in_use[lcore].v == 0)) {
+			sw->in_use[lcore].v = 1;
 			n_lcores = __atomic_fetch_add(&sw->n_poll_lcores, 1,
 						     __ATOMIC_RELAXED);
 			__atomic_store_n(&sw->poll_lcores[n_lcores], lcore,
@@ -834,7 +835,7 @@ swtim_init(struct rte_event_timer_adapter *adapter)
 
 	/* Initialize the variables that track in-use timer lists */
 	for (i = 0; i < RTE_MAX_LCORE; i++)
-		rte_atomic16_init(&sw->in_use[i].v);
+		sw->in_use[i].v = 0;
 
 	/* Initialize the timer subsystem and allocate timer data instance */
 	ret = rte_timer_subsystem_init();
@@ -1017,6 +1018,8 @@ __swtim_arm_burst(const struct rte_event_timer_adapter *adapter,
 	struct rte_timer *tim, *tims[nb_evtims];
 	uint64_t cycles;
 	int n_lcores;
+	/* Timer list for this lcore is not in use. */
+	uint16_t exp_state = 0;
 
 #ifdef RTE_LIBRTE_EVENTDEV_DEBUG
 	/* Check that the service is running. */
@@ -1035,8 +1038,12 @@ __swtim_arm_burst(const struct rte_event_timer_adapter *adapter,
 	/* If this is the first time we're arming an event timer on this lcore,
 	 * mark this lcore as "in use"; this will cause the service
 	 * function to process the timer list that corresponds to this lcore.
+	 * The atomic CAS operation can prevent the race condition on in_use
+	 * flag between multiple non-EAL threads.
 	 */
-	if (unlikely(rte_atomic16_test_and_set(&sw->in_use[lcore_id].v))) {
+	if (unlikely(__atomic_compare_exchange_n(&sw->in_use[lcore_id].v,
+			&exp_state, 1, 0,
+			__ATOMIC_RELAXED, __ATOMIC_RELAXED))) {
 		EVTIM_LOG_DBG("Adding lcore id = %u to list of lcores to poll",
 			      lcore_id);
 		n_lcores = __atomic_fetch_add(&sw->n_poll_lcores, 1,
-- 
2.7.4


  reply	other threads:[~2020-07-02  5:28 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-12 11:19 [dpdk-dev] [PATCH 1/3] eventdev: fix race condition on timer list counter Phil Yang
2020-06-12 11:19 ` [dpdk-dev] [PATCH 2/3] eventdev: use c11 atomics for lcore timer armed flag Phil Yang
2020-06-23 21:01   ` Carrillo, Erik G
2020-06-28 16:12     ` Phil Yang
2020-06-23 21:20   ` Stephen Hemminger
2020-06-23 21:31     ` Carrillo, Erik G
2020-06-28 16:32       ` Phil Yang
2020-06-12 11:19 ` [dpdk-dev] [PATCH 3/3] eventdev: relax smp barriers with c11 atomics Phil Yang
2020-06-22 10:12   ` Phil Yang
2020-06-23 19:38     ` Carrillo, Erik G
2020-06-28 17:33       ` Phil Yang
2020-06-29 18:07         ` Carrillo, Erik G
2020-06-18 15:17 ` [dpdk-dev] [PATCH 1/3] eventdev: fix race condition on timer list counter Carrillo, Erik G
2020-06-18 18:25   ` Honnappa Nagarahalli
2020-06-22  9:48     ` Phil Yang
2020-07-01 11:22       ` Jerin Jacob
2020-07-02  3:28         ` Phil Yang
2020-07-02  3:26     ` Phil Yang
2020-07-02  3:56       ` Honnappa Nagarahalli
2020-07-02 21:15         ` Carrillo, Erik G
2020-07-02 21:30           ` Honnappa Nagarahalli
2020-06-22  9:09   ` Phil Yang
2020-07-02  5:26 ` [dpdk-dev] [PATCH v2 1/4] " Phil Yang
2020-07-02  5:26   ` Phil Yang [this message]
2020-07-02 20:21     ` [dpdk-dev] [PATCH v2 2/4] eventdev: use c11 atomics for lcore timer armed flag Carrillo, Erik G
2020-07-02  5:26   ` [dpdk-dev] [PATCH v2 3/4] eventdev: remove redundant code Phil Yang
2020-07-03  3:35     ` Dharmik Thakkar
2020-07-02  5:26   ` [dpdk-dev] [PATCH v2 4/4] eventdev: relax smp barriers with c11 atomics Phil Yang
2020-07-02 20:30     ` Carrillo, Erik G
2020-07-03 10:50       ` Jerin Jacob
2020-07-06 10:04     ` Thomas Monjalon
2020-07-06 15:32       ` Phil Yang
2020-07-06 15:40         ` Thomas Monjalon
2020-07-07 11:13   ` [dpdk-dev] [PATCH v3 1/4] eventdev: fix race condition on timer list counter Phil Yang
2020-07-07 11:13     ` [dpdk-dev] [PATCH v3 2/4] eventdev: use C11 atomics for lcore timer armed flag Phil Yang
2020-07-07 11:13     ` [dpdk-dev] [PATCH v3 3/4] eventdev: remove redundant code Phil Yang
2020-07-07 11:13     ` [dpdk-dev] [PATCH v3 4/4] eventdev: relax smp barriers with C11 atomics Phil Yang
2020-07-07 14:29       ` Jerin Jacob
2020-07-07 15:56         ` Phil Yang
2020-07-07 15:54     ` [dpdk-dev] [PATCH v4 1/4] eventdev: fix race condition on timer list counter Phil Yang
2020-07-07 15:54       ` [dpdk-dev] [PATCH v4 2/4] eventdev: use C11 atomics for lcore timer armed flag Phil Yang
2020-07-07 15:54       ` [dpdk-dev] [PATCH v4 3/4] eventdev: remove redundant code Phil Yang
2020-07-07 15:54       ` [dpdk-dev] [PATCH v4 4/4] eventdev: relax smp barriers with C11 atomics Phil Yang
2020-07-08 13:30       ` [dpdk-dev] [PATCH v4 1/4] eventdev: fix race condition on timer list counter Jerin Jacob
2020-07-08 15:01         ` Thomas Monjalon

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=1593667604-12029-2-git-send-email-phil.yang@arm.com \
    --to=phil.yang@arm.com \
    --cc=Dharmik.Thakkar@arm.com \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=Ruifeng.Wang@arm.com \
    --cc=dev@dpdk.org \
    --cc=drc@linux.vnet.ibm.com \
    --cc=erik.g.carrillo@intel.com \
    --cc=jerinj@marvell.com \
    --cc=nd@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).