From 2c06d0339fa477951f4a65df8bed606de1a2ec5e Mon Sep 17 00:00:00 2001 From: "Daniel M. Crowell" Date: Fri, 11 Jul 2014 20:27:33 -0500 Subject: Revert "Resolve deadlock conditions in deferred work queue." This reverts commit aaadc0e5955551542ddc5fc84cc54dd32f8d9788. Change-Id: Ia92dcb307efbacea6a7afbee00b1e881f995cfa2 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/12181 Reviewed-by: Daniel M. Crowell Tested-by: Daniel M. Crowell --- src/kernel/deferred.C | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) (limited to 'src/kernel/deferred.C') diff --git a/src/kernel/deferred.C b/src/kernel/deferred.C index 2e77a125d..ffa16d742 100644 --- a/src/kernel/deferred.C +++ b/src/kernel/deferred.C @@ -31,20 +31,10 @@ reinterpret_cast((item)->iv_cpus_and_next & 0xFFFFFFFF) /** Set the DeferredWork pointer part of a iv_cpus_and_next instance var. */ -#define DEFERRED_QUEUE_SET_NEXT_PTR(tail,item) \ - { \ - uint64_t old_value = 0; \ - uint64_t new_value = 0; \ - do \ - { \ - old_value = (tail)->iv_cpus_and_next; \ - new_value = (old_value & 0xFFFFFFFF00000000ull) | \ - reinterpret_cast(item); \ - } \ - while (!__sync_bool_compare_and_swap(&(tail)->iv_cpus_and_next, \ - old_value, \ - new_value)); \ - } +#define DEFERRED_QUEUE_SET_NEXT_PTR(item) \ + (item)->iv_cpus_and_next = \ + ((item)->iv_cpus_and_next & 0xFFFFFFFF00000000ull) | \ + reinterpret_cast(item) /** Extract the CPU count portion of a iv_cpus_and_next instance var. */ #define DEFERRED_QUEUE_GET_CPU_COUNT(item) (item)->iv_cpus_and_next >> 32 @@ -89,7 +79,7 @@ void DeferredQueue::_insert(DeferredWork* i_work) } // Add work item to the end of the list. - DEFERRED_QUEUE_SET_NEXT_PTR(tail, i_work); + DEFERRED_QUEUE_SET_NEXT_PTR(i_work); } lock.unlock(); @@ -135,9 +125,6 @@ void DeferredQueue::_complete(DeferredWork* i_work) old_ptr = iv_cpus_and_next; } while(!__sync_bool_compare_and_swap(&iv_cpus_and_next, old_ptr, new_ptr)); - // Clean up our own queue pointer. - DEFERRED_QUEUE_SET_NEXT_PTR(i_work, (DeferredWork*)NULL); - // Get the CPU count from the old object pointer and wait until those // CPUs get into i_work. old_ptr >>= 32; -- cgit v1.2.3