From 5c483e3b1c951c1509e7a061f88a15ad12787e5d Mon Sep 17 00:00:00 2001 From: Samy Al Bahra Date: Thu, 11 Apr 2013 23:54:16 -0400 Subject: [PATCH] ck_hp: hp_acquire patterns require strict fences under TSO. Several counter-examples were found which break in the presence of store-to-load re-ordering. Strict fence semantics are necessary. Thanks to Paul McKenney for helpful discussions. --- include/ck_hp_fifo.h | 12 ++++++------ include/ck_hp_stack.h | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/ck_hp_fifo.h b/include/ck_hp_fifo.h index e40e90e..12fa790 100644 --- a/include/ck_hp_fifo.h +++ b/include/ck_hp_fifo.h @@ -81,7 +81,7 @@ ck_hp_fifo_enqueue_mpmc(ck_hp_record_t *record, for (;;) { tail = ck_pr_load_ptr(&fifo->tail); ck_hp_set(record, 0, tail); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (tail != ck_pr_load_ptr(&fifo->tail)) continue; @@ -112,7 +112,7 @@ ck_hp_fifo_tryenqueue_mpmc(ck_hp_record_t *record, tail = ck_pr_load_ptr(&fifo->tail); ck_hp_set(record, 0, tail); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (tail != ck_pr_load_ptr(&fifo->tail)) return false; @@ -140,13 +140,13 @@ ck_hp_fifo_dequeue_mpmc(ck_hp_record_t *record, ck_pr_fence_load(); tail = ck_pr_load_ptr(&fifo->tail); ck_hp_set(record, 0, head); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (head != ck_pr_load_ptr(&fifo->head)) continue; next = ck_pr_load_ptr(&head->next); ck_hp_set(record, 1, next); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (head != ck_pr_load_ptr(&fifo->head)) continue; @@ -175,13 +175,13 @@ ck_hp_fifo_trydequeue_mpmc(ck_hp_record_t *record, ck_pr_fence_load(); tail = ck_pr_load_ptr(&fifo->tail); ck_hp_set(record, 0, head); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (head != ck_pr_load_ptr(&fifo->head)) return NULL; next = ck_pr_load_ptr(&head->next); ck_hp_set(record, 1, next); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (head != ck_pr_load_ptr(&fifo->head)) return NULL; diff --git a/include/ck_hp_stack.h b/include/ck_hp_stack.h index 412d8d5..6699d63 100644 --- a/include/ck_hp_stack.h +++ b/include/ck_hp_stack.h @@ -62,7 +62,7 @@ ck_hp_stack_pop_mpmc(ck_hp_record_t *record, struct ck_stack *target) return (NULL); ck_hp_set(record, 0, entry); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); } while (entry != ck_pr_load_ptr(&target->head)); while (ck_pr_cas_ptr_value(&target->head, entry, entry->next, &entry) == false) { @@ -70,11 +70,11 @@ ck_hp_stack_pop_mpmc(ck_hp_record_t *record, struct ck_stack *target) return (NULL); ck_hp_set(record, 0, entry); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); update = ck_pr_load_ptr(&target->head); while (entry != update) { ck_hp_set(record, 0, update); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); entry = update; update = ck_pr_load_ptr(&target->head); if (update == NULL) @@ -95,7 +95,7 @@ ck_hp_stack_trypop_mpmc(ck_hp_record_t *record, struct ck_stack *target, struct return false; ck_hp_set(record, 0, entry); - ck_pr_fence_memory(); + ck_pr_fence_strict_memory(); if (entry != ck_pr_load_ptr(&target->head)) goto leave;