Module: Mesa Branch: master Commit: 63dc2a53afee76934c131ee0faa935530a8aa75c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=63dc2a53afee76934c131ee0faa935530a8aa75c
Author: James Park <[email protected]> Date: Thu Nov 26 19:30:47 2020 -0800 radv: Replace pthread mutex with mtx_t Reviewed-by: Samuel Pitoiset <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7866> --- src/amd/vulkan/radv_device.c | 86 ++++++++++++++++++------------------ src/amd/vulkan/radv_pipeline_cache.c | 8 ++-- src/amd/vulkan/radv_private.h | 11 +++-- 3 files changed, 52 insertions(+), 53 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index bb12574473e..05eeee3a094 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -2356,9 +2356,9 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue, return vk_error(device->instance, result); list_inithead(&queue->pending_submissions); - pthread_mutex_init(&queue->pending_mutex, NULL); + mtx_init(&queue->pending_mutex, mtx_plain); - pthread_mutex_init(&queue->thread_mutex, NULL); + mtx_init(&queue->thread_mutex, mtx_plain); if (u_cnd_monotonic_init(&queue->thread_cond)) { result = VK_ERROR_INITIALIZATION_FAILED; return vk_error(device->instance, result); @@ -2382,8 +2382,8 @@ radv_queue_finish(struct radv_queue *queue) u_cnd_monotonic_destroy(&queue->thread_cond); } - pthread_mutex_destroy(&queue->pending_mutex); - pthread_mutex_destroy(&queue->thread_mutex); + mtx_destroy(&queue->pending_mutex); + mtx_destroy(&queue->thread_mutex); queue->device->ws->ctx_destroy(queue->hw_ctx); } @@ -2594,7 +2594,7 @@ static VkResult radv_device_init_border_color(struct radv_device *device) device->ws->buffer_map(device->border_color_data.bo); if (!device->border_color_data.colors_gpu_ptr) return vk_error(device->physical_device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY); - pthread_mutex_init(&device->border_color_data.mutex, NULL); + mtx_init(&device->border_color_data.mutex, mtx_plain); return VK_SUCCESS; } @@ -2604,7 +2604,7 @@ static void radv_device_finish_border_color(struct radv_device *device) if (device->border_color_data.bo) { device->ws->buffer_destroy(device->border_color_data.bo); - pthread_mutex_destroy(&device->border_color_data.mutex); + mtx_destroy(&device->border_color_data.mutex); } } @@ -4047,7 +4047,7 @@ static VkResult radv_alloc_sem_counts(struct radv_device *device, counts->sem[sem_idx++] = sems[i]->ws_sem; break; case RADV_SEMAPHORE_TIMELINE: { - pthread_mutex_lock(&sems[i]->timeline.mutex); + mtx_lock(&sems[i]->timeline.mutex); struct radv_timeline_point *point = NULL; if (is_signal) { point = radv_timeline_add_point_locked(device, &sems[i]->timeline, timeline_values[i]); @@ -4055,7 +4055,7 @@ static VkResult radv_alloc_sem_counts(struct radv_device *device, point = radv_timeline_find_point_at_least_locked(device, &sems[i]->timeline, timeline_values[i]); } - pthread_mutex_unlock(&sems[i]->timeline.mutex); + mtx_unlock(&sems[i]->timeline.mutex); if (point) { counts->syncobj[non_reset_idx++] = point->syncobj; @@ -4148,23 +4148,23 @@ radv_finalize_timelines(struct radv_device *device, { for (uint32_t i = 0; i < num_wait_sems; ++i) { if (wait_sems[i] && wait_sems[i]->kind == RADV_SEMAPHORE_TIMELINE) { - pthread_mutex_lock(&wait_sems[i]->timeline.mutex); + mtx_lock(&wait_sems[i]->timeline.mutex); struct radv_timeline_point *point = radv_timeline_find_point_at_least_locked(device, &wait_sems[i]->timeline, wait_values[i]); point->wait_count -= 2; - pthread_mutex_unlock(&wait_sems[i]->timeline.mutex); + mtx_unlock(&wait_sems[i]->timeline.mutex); } } for (uint32_t i = 0; i < num_signal_sems; ++i) { if (signal_sems[i] && signal_sems[i]->kind == RADV_SEMAPHORE_TIMELINE) { - pthread_mutex_lock(&signal_sems[i]->timeline.mutex); + mtx_lock(&signal_sems[i]->timeline.mutex); struct radv_timeline_point *point = radv_timeline_find_point_at_least_locked(device, &signal_sems[i]->timeline, signal_values[i]); signal_sems[i]->timeline.highest_submitted = MAX2(signal_sems[i]->timeline.highest_submitted, point->value); point->wait_count -= 2; radv_timeline_trigger_waiters_locked(&signal_sems[i]->timeline, processing_list); - pthread_mutex_unlock(&signal_sems[i]->timeline.mutex); + mtx_unlock(&signal_sems[i]->timeline.mutex); } else if (signal_sems[i] && signal_sems[i]->kind == RADV_SEMAPHORE_TIMELINE_SYNCOBJ) { signal_sems[i]->timeline_syncobj.max_point = MAX2(signal_sems[i]->timeline_syncobj.max_point, signal_values[i]); @@ -4438,7 +4438,7 @@ radv_queue_enqueue_submission(struct radv_deferred_queue_submission *submission, struct radv_timeline_waiter *waiter = submission->wait_nodes; for (uint32_t i = 0; i < submission->wait_semaphore_count; ++i) { if (submission->wait_semaphores[i]->kind == RADV_SEMAPHORE_TIMELINE) { - pthread_mutex_lock(&submission->wait_semaphores[i]->timeline.mutex); + mtx_lock(&submission->wait_semaphores[i]->timeline.mutex); if (submission->wait_semaphores[i]->timeline.highest_submitted < submission->wait_values[i]) { ++wait_cnt; waiter->value = submission->wait_values[i]; @@ -4446,16 +4446,16 @@ radv_queue_enqueue_submission(struct radv_deferred_queue_submission *submission, list_addtail(&waiter->list, &submission->wait_semaphores[i]->timeline.waiters); ++waiter; } - pthread_mutex_unlock(&submission->wait_semaphores[i]->timeline.mutex); + mtx_unlock(&submission->wait_semaphores[i]->timeline.mutex); } } - pthread_mutex_lock(&submission->queue->pending_mutex); + mtx_lock(&submission->queue->pending_mutex); bool is_first = list_is_empty(&submission->queue->pending_submissions); list_addtail(&submission->queue_pending_list, &submission->queue->pending_submissions); - pthread_mutex_unlock(&submission->queue->pending_mutex); + mtx_unlock(&submission->queue->pending_mutex); /* If there is already a submission in the queue, that will decrement the counter by 1 when * submitted, but if the queue was empty, we decrement ourselves as there is no previous @@ -4474,7 +4474,7 @@ static void radv_queue_submission_update_queue(struct radv_deferred_queue_submission *submission, struct list_head *processing_list) { - pthread_mutex_lock(&submission->queue->pending_mutex); + mtx_lock(&submission->queue->pending_mutex); list_del(&submission->queue_pending_list); /* trigger the next submission in the queue. */ @@ -4485,7 +4485,7 @@ radv_queue_submission_update_queue(struct radv_deferred_queue_submission *submis queue_pending_list); radv_queue_trigger_submission(next_submission, 1, processing_list); } - pthread_mutex_unlock(&submission->queue->pending_mutex); + mtx_unlock(&submission->queue->pending_mutex); u_cnd_monotonic_broadcast(&submission->queue->device->timeline_cond); } @@ -4723,7 +4723,7 @@ static void* radv_queue_submission_thread_run(void *q) { struct radv_queue *queue = q; - pthread_mutex_lock(&queue->thread_mutex); + mtx_lock(&queue->thread_mutex); while (!p_atomic_read(&queue->thread_exit)) { struct radv_deferred_queue_submission *submission = queue->thread_submission; struct list_head processing_list; @@ -4732,7 +4732,7 @@ static void* radv_queue_submission_thread_run(void *q) u_cnd_monotonic_wait(&queue->thread_cond, &queue->thread_mutex); continue; } - pthread_mutex_unlock(&queue->thread_mutex); + mtx_unlock(&queue->thread_mutex); /* Wait at most 5 seconds so we have a chance to notice shutdown when * a semaphore never gets signaled. If it takes longer we just retry @@ -4740,7 +4740,7 @@ static void* radv_queue_submission_thread_run(void *q) result = wait_for_submission_timelines_available(submission, radv_get_absolute_timeout(5000000000)); if (result != VK_SUCCESS) { - pthread_mutex_lock(&queue->thread_mutex); + mtx_lock(&queue->thread_mutex); continue; } @@ -4752,9 +4752,9 @@ static void* radv_queue_submission_thread_run(void *q) list_addtail(&submission->processing_list, &processing_list); result = radv_process_submissions(&processing_list); - pthread_mutex_lock(&queue->thread_mutex); + mtx_lock(&queue->thread_mutex); } - pthread_mutex_unlock(&queue->thread_mutex); + mtx_unlock(&queue->thread_mutex); return NULL; } @@ -4773,7 +4773,7 @@ radv_queue_trigger_submission(struct radv_deferred_queue_submission *submission, return VK_SUCCESS; } - pthread_mutex_lock(&queue->thread_mutex); + mtx_lock(&queue->thread_mutex); /* A submission can only be ready for the thread if it doesn't have * any predecessors in the same queue, so there can only be one such @@ -4786,7 +4786,7 @@ radv_queue_trigger_submission(struct radv_deferred_queue_submission *submission, ret = pthread_create(&queue->submission_thread, NULL, radv_queue_submission_thread_run, queue); if (ret) { - pthread_mutex_unlock(&queue->thread_mutex); + mtx_unlock(&queue->thread_mutex); return vk_errorf(queue->device->instance, VK_ERROR_DEVICE_LOST, "Failed to start submission thread"); @@ -4795,7 +4795,7 @@ radv_queue_trigger_submission(struct radv_deferred_queue_submission *submission, } queue->thread_submission = submission; - pthread_mutex_unlock(&queue->thread_mutex); + mtx_unlock(&queue->thread_mutex); u_cnd_monotonic_signal(&queue->thread_cond); return VK_SUCCESS; @@ -4947,11 +4947,11 @@ VkResult radv_QueueWaitIdle( if (radv_device_is_lost(queue->device)) return VK_ERROR_DEVICE_LOST; - pthread_mutex_lock(&queue->pending_mutex); + mtx_lock(&queue->pending_mutex); while (!list_is_empty(&queue->pending_submissions)) { u_cnd_monotonic_wait(&queue->device->timeline_cond, &queue->pending_mutex); } - pthread_mutex_unlock(&queue->pending_mutex); + mtx_unlock(&queue->pending_mutex); if (!queue->device->ws->ctx_wait_idle(queue->hw_ctx, radv_queue_family_to_ring(queue->queue_family_index), @@ -5999,7 +5999,7 @@ radv_create_timeline(struct radv_timeline *timeline, uint64_t value) list_inithead(&timeline->points); list_inithead(&timeline->free_points); list_inithead(&timeline->waiters); - pthread_mutex_init(&timeline->mutex, NULL); + mtx_init(&timeline->mutex, mtx_plain); } static void @@ -6018,7 +6018,7 @@ radv_destroy_timeline(struct radv_device *device, device->ws->destroy_syncobj(device->ws, point->syncobj); free(point); } - pthread_mutex_destroy(&timeline->mutex); + mtx_destroy(&timeline->mutex); } static void @@ -6114,7 +6114,7 @@ radv_timeline_wait(struct radv_device *device, uint64_t value, uint64_t abs_timeout) { - pthread_mutex_lock(&timeline->mutex); + mtx_lock(&timeline->mutex); while(timeline->highest_submitted < value) { struct timespec abstime; @@ -6123,21 +6123,21 @@ radv_timeline_wait(struct radv_device *device, u_cnd_monotonic_timedwait(&device->timeline_cond, &timeline->mutex, &abstime); if (radv_get_current_time() >= abs_timeout && timeline->highest_submitted < value) { - pthread_mutex_unlock(&timeline->mutex); + mtx_unlock(&timeline->mutex); return VK_TIMEOUT; } } struct radv_timeline_point *point = radv_timeline_find_point_at_least_locked(device, timeline, value); - pthread_mutex_unlock(&timeline->mutex); + mtx_unlock(&timeline->mutex); if (!point) return VK_SUCCESS; bool success = device->ws->wait_syncobj(device->ws, &point->syncobj, 1, true, abs_timeout); - pthread_mutex_lock(&timeline->mutex); + mtx_lock(&timeline->mutex); point->wait_count--; - pthread_mutex_unlock(&timeline->mutex); + mtx_unlock(&timeline->mutex); return success ? VK_SUCCESS : VK_TIMEOUT; } @@ -6291,10 +6291,10 @@ radv_GetSemaphoreCounterValue(VkDevice _device, switch (part->kind) { case RADV_SEMAPHORE_TIMELINE: { - pthread_mutex_lock(&part->timeline.mutex); + mtx_lock(&part->timeline.mutex); radv_timeline_gc_locked(device, &part->timeline); *pValue = part->timeline.highest_signaled; - pthread_mutex_unlock(&part->timeline.mutex); + mtx_unlock(&part->timeline.mutex); return VK_SUCCESS; } case RADV_SEMAPHORE_TIMELINE_SYNCOBJ: { @@ -6384,7 +6384,7 @@ radv_SignalSemaphore(VkDevice _device, switch(part->kind) { case RADV_SEMAPHORE_TIMELINE: { - pthread_mutex_lock(&part->timeline.mutex); + mtx_lock(&part->timeline.mutex); radv_timeline_gc_locked(device, &part->timeline); part->timeline.highest_submitted = MAX2(part->timeline.highest_submitted, pSignalInfo->value); part->timeline.highest_signaled = MAX2(part->timeline.highest_signaled, pSignalInfo->value); @@ -6392,7 +6392,7 @@ radv_SignalSemaphore(VkDevice _device, struct list_head processing_list; list_inithead(&processing_list); radv_timeline_trigger_waiters_locked(&part->timeline, &processing_list); - pthread_mutex_unlock(&part->timeline.mutex); + mtx_unlock(&part->timeline.mutex); VkResult result = radv_process_submissions(&processing_list); @@ -7347,7 +7347,7 @@ static uint32_t radv_register_border_color(struct radv_device *device, { uint32_t slot; - pthread_mutex_lock(&device->border_color_data.mutex); + mtx_lock(&device->border_color_data.mutex); for (slot = 0; slot < RADV_BORDER_COLOR_COUNT; slot++) { if (!device->border_color_data.used[slot]) { @@ -7361,7 +7361,7 @@ static uint32_t radv_register_border_color(struct radv_device *device, } } - pthread_mutex_unlock(&device->border_color_data.mutex); + mtx_unlock(&device->border_color_data.mutex); return slot; } @@ -7369,11 +7369,11 @@ static uint32_t radv_register_border_color(struct radv_device *device, static void radv_unregister_border_color(struct radv_device *device, uint32_t slot) { - pthread_mutex_lock(&device->border_color_data.mutex); + mtx_lock(&device->border_color_data.mutex); device->border_color_data.used[slot] = false; - pthread_mutex_unlock(&device->border_color_data.mutex); + mtx_unlock(&device->border_color_data.mutex); } static void diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index afffb7d0077..67bb6cef541 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -49,7 +49,7 @@ radv_pipeline_cache_lock(struct radv_pipeline_cache *cache) if (cache->flags & VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT) return; - pthread_mutex_lock(&cache->mutex); + mtx_lock(&cache->mutex); } static void @@ -58,7 +58,7 @@ radv_pipeline_cache_unlock(struct radv_pipeline_cache *cache) if (cache->flags & VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT) return; - pthread_mutex_unlock(&cache->mutex); + mtx_unlock(&cache->mutex); } void @@ -66,7 +66,7 @@ radv_pipeline_cache_init(struct radv_pipeline_cache *cache, struct radv_device *device) { cache->device = device; - pthread_mutex_init(&cache->mutex, NULL); + mtx_init(&cache->mutex, mtx_plain); cache->flags = 0; cache->modified = false; @@ -98,7 +98,7 @@ radv_pipeline_cache_finish(struct radv_pipeline_cache *cache) } vk_free(&cache->alloc, cache->hash_table[i]); } - pthread_mutex_destroy(&cache->mutex); + mtx_destroy(&cache->mutex); free(cache->hash_table); } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 855865c1c7a..f7176f08e7b 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -373,7 +373,7 @@ struct cache_entry; struct radv_pipeline_cache { struct vk_object_base base; struct radv_device * device; - pthread_mutex_t mutex; + mtx_t mutex; VkPipelineCacheCreateFlags flags; uint32_t total_size; @@ -727,9 +727,9 @@ struct radv_queue { struct radeon_cmdbuf *continue_preamble_cs; struct list_head pending_submissions; - pthread_mutex_t pending_mutex; + mtx_t pending_mutex; - pthread_mutex_t thread_mutex; + mtx_t thread_mutex; struct u_cnd_monotonic thread_cond; struct radv_deferred_queue_submission *thread_submission; pthread_t submission_thread; @@ -760,7 +760,7 @@ struct radv_device_border_color_data { /* Mutex is required to guarantee vkCreateSampler thread safety * given that we are writing to a buffer and checking color occupation */ - pthread_mutex_t mutex; + mtx_t mutex; }; struct radv_device { @@ -2361,8 +2361,7 @@ struct radv_timeline_point { }; struct radv_timeline { - /* Using a pthread mutex to be compatible with condition variables. */ - pthread_mutex_t mutex; + mtx_t mutex; uint64_t highest_signaled; uint64_t highest_submitted; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
