diff options
author | Julian Brown <julian@codesourcery.com> | 2019-11-20 17:56:30 +0000 |
---|---|---|
committer | Julian Brown <jules@gcc.gnu.org> | 2019-11-20 17:56:30 +0000 |
commit | d88b27daa164c87af447cc2243bf18d9a3543ff3 (patch) | |
tree | 233fabd58e81614607b30bf5495b268343080f72 /libgomp/plugin | |
parent | 8d2f4ddfd70f2ad9829cdc404e9c382f6fc9b072 (diff) | |
download | gcc-d88b27daa164c87af447cc2243bf18d9a3543ff3.zip gcc-d88b27daa164c87af447cc2243bf18d9a3543ff3.tar.gz gcc-d88b27daa164c87af447cc2243bf18d9a3543ff3.tar.bz2 |
AMD GCN libgomp plugin queue-full condition locking fix
libgomp/
* plugin/plugin-gcn.c (wait_for_queue_nonfull): Don't lock/unlock
aq->mutex here.
(queue_push_launch): Lock aq->mutex before calling
wait_for_queue_nonfull.
(queue_push_callback): Likewise.
(queue_push_asyncwait): Likewise.
(queue_push_placeholder): Likewise.
Reviewed-by: Andrew Stubbs <ams@codesourcery.com>
From-SVN: r278517
Diffstat (limited to 'libgomp/plugin')
-rw-r--r-- | libgomp/plugin/plugin-gcn.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c index 392a0ee..9287e27 100644 --- a/libgomp/plugin/plugin-gcn.c +++ b/libgomp/plugin/plugin-gcn.c @@ -2725,20 +2725,17 @@ drain_queue_synchronous (struct goacc_asyncqueue *aq) pthread_mutex_unlock (&aq->mutex); } -/* Block the current thread until an async queue is writable. */ +/* Block the current thread until an async queue is writable. The aq->mutex + lock should be held on entry, and remains locked on exit. */ static void wait_for_queue_nonfull (struct goacc_asyncqueue *aq) { if (aq->queue_n == ASYNC_QUEUE_SIZE) { - pthread_mutex_lock (&aq->mutex); - /* Queue is full. Wait for it to not be full. */ while (aq->queue_n == ASYNC_QUEUE_SIZE) pthread_cond_wait (&aq->queue_cond_out, &aq->mutex); - - pthread_mutex_unlock (&aq->mutex); } } @@ -2752,10 +2749,10 @@ queue_push_launch (struct goacc_asyncqueue *aq, struct kernel_info *kernel, { assert (aq->agent == kernel->agent); - wait_for_queue_nonfull (aq); - pthread_mutex_lock (&aq->mutex); + wait_for_queue_nonfull (aq); + int queue_last = ((aq->queue_first + aq->queue_n) % ASYNC_QUEUE_SIZE); if (DEBUG_QUEUES) @@ -2785,10 +2782,10 @@ static void queue_push_callback (struct goacc_asyncqueue *aq, void (*fn)(void *), void *data) { - wait_for_queue_nonfull (aq); - pthread_mutex_lock (&aq->mutex); + wait_for_queue_nonfull (aq); + int queue_last = ((aq->queue_first + aq->queue_n) % ASYNC_QUEUE_SIZE); if (DEBUG_QUEUES) @@ -2818,10 +2815,10 @@ static void queue_push_asyncwait (struct goacc_asyncqueue *aq, struct placeholder *placeholderp) { - wait_for_queue_nonfull (aq); - pthread_mutex_lock (&aq->mutex); + wait_for_queue_nonfull (aq); + int queue_last = ((aq->queue_first + aq->queue_n) % ASYNC_QUEUE_SIZE); if (DEBUG_QUEUES) GCN_DEBUG ("queue_push_asyncwait %d:%d: at %i\n", aq->agent->device_id, @@ -2849,10 +2846,10 @@ queue_push_placeholder (struct goacc_asyncqueue *aq) { struct placeholder *placeholderp; - wait_for_queue_nonfull (aq); - pthread_mutex_lock (&aq->mutex); + wait_for_queue_nonfull (aq); + int queue_last = ((aq->queue_first + aq->queue_n) % ASYNC_QUEUE_SIZE); if (DEBUG_QUEUES) GCN_DEBUG ("queue_push_placeholder %d:%d: at %i\n", aq->agent->device_id, |