[dpdk-dev] [PATCH 1/2] ring: fix declaration after code

Gavin Hu Gavin.Hu at arm.com
Mon May 28 10:15:11 CEST 2018


Hi Andy,

See my inline comments.

-Gavin

-----Original Message-----
From: dev <dev-bounces at dpdk.org> On Behalf Of Andy Green
Sent: Monday, May 28, 2018 10:29 AM
To: dev at dpdk.org
Subject: [dpdk-dev] [PATCH 1/2] ring: fix declaration after code

On gcc 5.4.0 / native aarch64 from Ubuntu 16.04:

/home/agreen/lagopus/src/dpdk/build/include/
rte_ring_c11_mem.h: In function
'__rte_ring_move_prod_head':
/home/agreen/lagopus/src/dpdk/build/include/
rte_ring_c11_mem.h:69:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   const uint32_t cons_tail = r->cons.tail;
   ^
/home/agreen/lagopus/src/dpdk/build/include/
rte_ring_c11_mem.h: In function
'__rte_ring_move_cons_head':
/home/agreen/lagopus/src/dpdk/build/include/
rte_ring_c11_mem.h:136:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   const uint32_t prod_tail = r->prod.tail;
   ^

Signed-off-by: Andy Green <andy at warmcat.com>
Fixes: 39368ebfc6 ("ring: introduce C11 memory model barrier option")
---
 lib/librte_ring/rte_ring_c11_mem.h |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/librte_ring/rte_ring_c11_mem.h b/lib/librte_ring/rte_ring_c11_mem.h
index cb3f82b1a..3cc339558 100644
--- a/lib/librte_ring/rte_ring_c11_mem.h
+++ b/lib/librte_ring/rte_ring_c11_mem.h
@@ -61,12 +61,14 @@ __rte_ring_move_prod_head(struct rte_ring *r, unsigned int is_sp,
 int success;

 do {
+const uint32_t cons_tail = r->cons.tail;
+
 /* Reset n to the initial burst count */
 n = max;

 *old_head = __atomic_load_n(&r->prod.head,
 __ATOMIC_ACQUIRE);
-const uint32_t cons_tail = r->cons.tail;
+
[Gavin Hu] The ACQUIRE and RELEASE pair protects anything that between the two must be visible to other threads when they perform an acquire operation on the same memory address. Your changes broke this semantics.  I advise to move the declaration before and keep the assignment in the old place.
 /*
  *  The subtraction is done between two unsigned 32bits value
  * (the result is always modulo 32 bits even if we have @@ -129,11 +131,13 @@ __rte_ring_move_cons_head(struct rte_ring *r, int is_sc,

 /* move cons.head atomically */
 do {
+const uint32_t prod_tail = r->prod.tail;
+
 /* Restore n as it may change every loop */
 n = max;
 *old_head = __atomic_load_n(&r->cons.head,
 __ATOMIC_ACQUIRE);
-const uint32_t prod_tail = r->prod.tail;
+
 /* The subtraction is done between two unsigned 32bits value
  * (the result is always modulo 32 bits even if we have
  * cons_head > prod_tail). So 'entries' is always between 0

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


More information about the dev mailing list