Mesa (master): radv: Replace pthread mutex with mtx_t
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Dec 2 11:36:38 UTC 2020
Module: Mesa
Branch: master
Commit: 63dc2a53afee76934c131ee0faa935530a8aa75c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=63dc2a53afee76934c131ee0faa935530a8aa75c
Author: James Park <jpark37 at lagfreegames.com>
Date: Thu Nov 26 19:30:47 2020 -0800
radv: Replace pthread mutex with mtx_t
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
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;
More information about the mesa-commit
mailing list