]> git.droids-corp.org - dpdk.git/commitdiff
stack: fix inconsistent weak/strong CAS
authorSteven Lariau <steven.lariau@arm.com>
Fri, 25 Sep 2020 17:43:35 +0000 (18:43 +0100)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 30 Sep 2020 19:08:39 +0000 (21:08 +0200)
Fix cmpexchange usage of weak / strong.
The generated code is the same on x86 and ARM (there is no weak
cmpexchange), but the old usage was inconsistent.
For push and pop update size, weak is used because cmpexchange is inside
a loop.
For pop update root, strong is used even though cmpexchange is inside a
loop, because there may be a lot of operations to do in a loop iteration
(locate the new head).

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>
Acked-by: Gage Eads <gage.eads@intel.com>
lib/librte_stack/rte_stack_lf_c11.h

index 999359f0810e1644426501b10481ce72f31a7c06..1e0ea0bef469bdf13d7a34c324aee148b76b7ee3 100644 (file)
@@ -96,7 +96,7 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
                /* len is updated on failure */
                if (__atomic_compare_exchange_n(&list->len,
                                                &len, len - num,
-                                               0, __ATOMIC_ACQUIRE,
+                                               1, __ATOMIC_ACQUIRE,
                                                __ATOMIC_ACQUIRE))
                        break;
        }
@@ -149,7 +149,7 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
                                (rte_int128_t *)&list->head,
                                (rte_int128_t *)&old_head,
                                (rte_int128_t *)&new_head,
-                               1, __ATOMIC_RELEASE,
+                               0, __ATOMIC_RELEASE,
                                __ATOMIC_RELAXED);
        } while (success == 0);