DPDK patches and discussions
 help / color / mirror / Atom feed
From: Steven Lariau <steven.lariau@arm.com>
To: Gage Eads <gage.eads@intel.com>, Olivier Matz <olivier.matz@6wind.com>
Cc: dev@dpdk.org, nd@arm.com, Steven Lariau <steven.lariau@arm.com>
Subject: [dpdk-dev] [PATCH v2 5/5] lib/stack: remove pop cas release ordering
Date: Fri, 25 Sep 2020 18:43:39 +0100
Message-ID: <20200925174340.10014-6-steven.lariau@arm.com> (raw)
In-Reply-To: <20200925174340.10014-1-steven.lariau@arm.com>

Replace the store-release by relaxed for the CAS success at the end of
pop. Release isn't needed, because there is not write to data that need
to be synchronized.
The only preceding write is when the length is decreased, but the length
CAS loop already ensures the right synchronization.
The situation to avoid is when a thread sees the old length but the new
list, that doesn't have enough items for pop to success.
But the CAS success on length before the pop loop ensures any core reads
and updates the latest length, preventing this situation.

The store-release is also used to make sure that the items are read
before the head is updated, in order to prevent a core in pop to read an
incorrect value because another core rewrites it with push.
But this isn't needed, because items are read only when removed from the
used list. Right after this, they are pushed to the free list, and the
store-release in push makes sure the items are read before they are
visible in the free list.

Signed-off-by: Steven Lariau <steven.lariau@arm.com>
Reviewed-by: Dharmik Thakkar <dharmik.thakkar@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 lib/librte_stack/rte_stack_lf_c11.h | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/lib/librte_stack/rte_stack_lf_c11.h b/lib/librte_stack/rte_stack_lf_c11.h
index adb9f590d..8403196d5 100644
--- a/lib/librte_stack/rte_stack_lf_c11.h
+++ b/lib/librte_stack/rte_stack_lf_c11.h
@@ -141,11 +141,25 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
 		new_head.top = tmp;
 		new_head.cnt = old_head.cnt + 1;
 
+		/*
+		 * The CAS should have release semantics to ensure that
+		 * items are read before the head is updated.
+		 * But this function is internal, and items are read
+		 * only when __rte_stack_lf_pop calls this function to
+		 * pop items from used list.
+		 * Then, those items are pushed to the free list.
+		 * Push uses a CAS store-release on head, which makes
+		 * sure that items are read before they are pushed to
+		 * the free list, without need for a CAS release here.
+		 * This CAS could also be used to ensure that the new
+		 * length is visible before the head update, but
+		 * acquire semantics on the length update is enough.
+		 */
 		success = rte_atomic128_cmp_exchange(
 				(rte_int128_t *)&list->head,
 				(rte_int128_t *)&old_head,
 				(rte_int128_t *)&new_head,
-				0, __ATOMIC_RELEASE,
+				0, __ATOMIC_RELAXED,
 				__ATOMIC_RELAXED);
 	} while (success == 0);
 
-- 
2.17.1


  parent reply	other threads:[~2020-09-25 17:45 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-11 15:29 [dpdk-dev] [PATCH 0/5] lib/stack: improve lockfree C11 implementation Steven Lariau
2020-09-11 15:29 ` [dpdk-dev] [PATCH 1/5] lib/stack: fix inconsistent weak / strong cas Steven Lariau
2020-09-21 17:16   ` Eads, Gage
2020-09-11 15:29 ` [dpdk-dev] [PATCH 2/5] lib/stack: remove push acquire fence Steven Lariau
2020-09-21 17:16   ` Eads, Gage
2020-09-11 15:29 ` [dpdk-dev] [PATCH 3/5] lib/stack: remove redundant orderings for list->len Steven Lariau
2020-09-21 17:16   ` Eads, Gage
2020-09-11 15:29 ` [dpdk-dev] [PATCH 4/5] lib/stack: reload head when pop fails Steven Lariau
2020-09-21 17:16   ` Eads, Gage
2020-09-11 15:29 ` [dpdk-dev] [PATCH 5/5] lib/stack: remove pop cas release ordering Steven Lariau
2020-09-21 17:17   ` Eads, Gage
2020-09-25 14:27     ` David Marchand
2020-09-25 17:43 ` [dpdk-dev] [PATCH v2 0/5] lib/stack: improve lockfree C11 implementation Steven Lariau
2020-09-25 17:43   ` [dpdk-dev] [PATCH v2 1/5] lib/stack: fix inconsistent weak / strong cas Steven Lariau
2020-09-28 10:22     ` David Marchand
2020-09-28 15:58       ` Eads, Gage
2020-09-25 17:43   ` [dpdk-dev] [PATCH v2 2/5] lib/stack: remove push acquire fence Steven Lariau
2020-09-25 17:43   ` [dpdk-dev] [PATCH v2 3/5] lib/stack: remove redundant orderings for list->len Steven Lariau
2020-09-25 17:43   ` [dpdk-dev] [PATCH v2 4/5] lib/stack: reload head when pop fails Steven Lariau
2020-09-25 17:43   ` Steven Lariau [this message]
2020-09-25 17:57     ` [dpdk-dev] [PATCH v2 5/5] lib/stack: remove pop cas release ordering Eads, Gage
2020-09-30 19:14   ` [dpdk-dev] [PATCH v2 0/5] lib/stack: improve lockfree C11 implementation David Marchand

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=20200925174340.10014-6-steven.lariau@arm.com \
    --to=steven.lariau@arm.com \
    --cc=dev@dpdk.org \
    --cc=gage.eads@intel.com \
    --cc=nd@arm.com \
    --cc=olivier.matz@6wind.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

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git