From a5f58e5f8544492b5b060158a6644d358a4b67dd Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Tue, 29 Aug 2023 16:40:26 +0300 Subject: [PATCH] intel/ds: lock submissions to u_trace_context This allows for submissions to be outside the global anv_device mutex. Signed-off-by: Lionel Landwerlin Acked-by: Emma Anholt Part-of: --- src/gallium/drivers/iris/iris_fence.c | 3 +-- src/gallium/drivers/iris/iris_utrace.c | 2 +- src/intel/ds/intel_driver_ds.cc | 20 ++++++++++++++++++++ src/intel/ds/intel_driver_ds.h | 10 ++++++++++ src/intel/vulkan/anv_batch_chain.c | 4 ++-- src/intel/vulkan/anv_utrace.c | 17 ++++++++++------- src/intel/vulkan_hasvk/anv_utrace.c | 10 ++++++---- src/intel/vulkan_hasvk/anv_wsi.c | 2 +- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/iris/iris_fence.c b/src/gallium/drivers/iris/iris_fence.c index f8dd9da6990..c16edf30002 100644 --- a/src/gallium/drivers/iris/iris_fence.c +++ b/src/gallium/drivers/iris/iris_fence.c @@ -270,8 +270,7 @@ iris_fence_flush(struct pipe_context *ctx, iris_measure_frame_end(ice); } - u_trace_context_process(&ice->ds.trace_context, - flags & PIPE_FLUSH_END_OF_FRAME); + intel_ds_device_process(&ice->ds, flags & PIPE_FLUSH_END_OF_FRAME); if (!out_fence) return; diff --git a/src/gallium/drivers/iris/iris_utrace.c b/src/gallium/drivers/iris/iris_utrace.c index 7e746369e05..8700857b717 100644 --- a/src/gallium/drivers/iris/iris_utrace.c +++ b/src/gallium/drivers/iris/iris_utrace.c @@ -168,7 +168,7 @@ void iris_utrace_flush(struct iris_batch *batch, uint64_t submission_id) { struct intel_ds_flush_data *flush_data = malloc(sizeof(*flush_data)); intel_ds_flush_data_init(flush_data, &batch->ds, submission_id); - u_trace_flush(&batch->trace, flush_data, false); + intel_ds_queue_flush_data(&batch->ds, &batch->trace, flush_data, false); } void iris_utrace_init(struct iris_context *ice) diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc index e5916cee62c..395df676723 100644 --- a/src/intel/ds/intel_driver_ds.cc +++ b/src/intel/ds/intel_driver_ds.cc @@ -555,12 +555,14 @@ intel_ds_device_init(struct intel_ds_device *device, device->iid = get_iid(); device->api = api; list_inithead(&device->queues); + simple_mtx_init(&device->trace_context_mutex, mtx_plain); } void intel_ds_device_fini(struct intel_ds_device *device) { u_trace_context_fini(&device->trace_context); + simple_mtx_destroy(&device->trace_context_mutex); } struct intel_ds_queue * @@ -606,6 +608,24 @@ void intel_ds_flush_data_fini(struct intel_ds_flush_data *data) u_trace_fini(&data->trace); } +void intel_ds_queue_flush_data(struct intel_ds_queue *queue, + struct u_trace *ut, + struct intel_ds_flush_data *data, + bool free_data) +{ + simple_mtx_lock(&queue->device->trace_context_mutex); + u_trace_flush(ut, data, free_data); + simple_mtx_unlock(&queue->device->trace_context_mutex); +} + +void intel_ds_device_process(struct intel_ds_device *device, + bool eof) +{ + simple_mtx_lock(&device->trace_context_mutex); + u_trace_context_process(&device->trace_context, eof); + simple_mtx_unlock(&device->trace_context_mutex); +} + #ifdef __cplusplus } #endif diff --git a/src/intel/ds/intel_driver_ds.h b/src/intel/ds/intel_driver_ds.h index 507db2c276d..bc5f4a82e9d 100644 --- a/src/intel/ds/intel_driver_ds.h +++ b/src/intel/ds/intel_driver_ds.h @@ -112,6 +112,9 @@ struct intel_ds_device { */ uint64_t event_id; + /* Protects submissions of u_trace data to trace_context */ + simple_mtx_t trace_context_mutex; + struct u_trace_context trace_context; /* List of intel_ds_queue */ @@ -183,6 +186,13 @@ void intel_ds_flush_data_init(struct intel_ds_flush_data *data, void intel_ds_flush_data_fini(struct intel_ds_flush_data *data); +void intel_ds_queue_flush_data(struct intel_ds_queue *queue, + struct u_trace *ut, + struct intel_ds_flush_data *data, + bool free_data); + +void intel_ds_device_process(struct intel_ds_device *device, bool eof); + #ifdef HAVE_PERFETTO uint64_t intel_ds_begin_submit(struct intel_ds_queue *queue); diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 8da9aa84682..fec72e2b2e2 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1481,10 +1481,10 @@ anv_queue_submit(struct vk_queue *vk_queue, /* Take submission ID under lock */ intel_ds_end_submit(&queue->ds, start_ts); - u_trace_context_process(&device->ds.trace_context, true); - pthread_mutex_unlock(&device->mutex); + intel_ds_device_process(&device->ds, true); + return result; } diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c index 834c3c025e8..042d36c700b 100644 --- a/src/intel/vulkan/anv_utrace.c +++ b/src/intel/vulkan/anv_utrace.c @@ -232,7 +232,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, &submit->batch); for (uint32_t i = 0; i < cmd_buffer_count; i++) { if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) { - u_trace_flush(&cmd_buffers[i]->trace, submit, false); + intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace, + &submit->ds, false); } else { u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace), u_trace_end_iterator(&cmd_buffers[i]->trace), @@ -258,7 +259,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, for (uint32_t i = 0; i < cmd_buffer_count; i++) { if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) { - u_trace_flush(&cmd_buffers[i]->trace, submit, false); + intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace, + &submit->ds, false); } else { u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace), u_trace_end_iterator(&cmd_buffers[i]->trace), @@ -271,7 +273,7 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, anv_genX(device->info, emit_simple_shader_end)(&submit->simple_state); } - u_trace_flush(&submit->ds.trace, submit, true); + intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds, true); if (submit->batch.status != VK_SUCCESS) { result = submit->batch.status; @@ -280,7 +282,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, } else { for (uint32_t i = 0; i < cmd_buffer_count; i++) { assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - u_trace_flush(&cmd_buffers[i]->trace, submit, i == (cmd_buffer_count - 1)); + intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace, + &submit->ds, i == (cmd_buffer_count - 1)); } } @@ -445,7 +448,7 @@ anv_device_utrace_init(struct anv_device *device) void anv_device_utrace_finish(struct anv_device *device) { - u_trace_context_process(&device->ds.trace_context, true); + intel_ds_device_process(&device->ds, true); intel_ds_device_fini(&device->ds); anv_bo_pool_finish(&device->utrace_bo_pool); } @@ -574,7 +577,7 @@ anv_queue_trace(struct anv_queue *queue, const char *label, bool frame, bool beg goto error_reloc_list; } - u_trace_flush(&submit->ds.trace, submit, true); + intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds, true); pthread_mutex_lock(&device->mutex); device->kmd_backend->queue_exec_trace(queue, submit); @@ -617,7 +620,7 @@ anv_QueueEndDebugUtilsLabelEXT(VkQueue _queue) anv_queue_trace(queue, label->pLabelName, false /* frame */, false /* begin */); - u_trace_context_process(&queue->device->ds.trace_context, true); + intel_ds_device_process(&queue->device->ds, true); } vk_common_QueueEndDebugUtilsLabelEXT(_queue); diff --git a/src/intel/vulkan_hasvk/anv_utrace.c b/src/intel/vulkan_hasvk/anv_utrace.c index 5b2289d2871..18da81b5d03 100644 --- a/src/intel/vulkan_hasvk/anv_utrace.c +++ b/src/intel/vulkan_hasvk/anv_utrace.c @@ -148,7 +148,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, &flush->batch); for (uint32_t i = 0; i < cmd_buffer_count; i++) { if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) { - u_trace_flush(&cmd_buffers[i]->trace, flush, false); + intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace, + &flush->ds, false); } else { u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace), u_trace_end_iterator(&cmd_buffers[i]->trace), @@ -159,7 +160,7 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, } anv_genX(device->info, emit_so_memcpy_fini)(&flush->memcpy_state); - u_trace_flush(&flush->ds.trace, flush, true); + intel_ds_queue_flush_data(&queue->ds, &flush->ds.trace, &flush->ds, true); if (flush->batch.status != VK_SUCCESS) { result = flush->batch.status; @@ -168,7 +169,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue, } else { for (uint32_t i = 0; i < cmd_buffer_count; i++) { assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - u_trace_flush(&cmd_buffers[i]->trace, flush, i == (cmd_buffer_count - 1)); + intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace, + &flush->ds, i == (cmd_buffer_count - 1)); } } @@ -293,7 +295,7 @@ anv_device_utrace_init(struct anv_device *device) void anv_device_utrace_finish(struct anv_device *device) { - u_trace_context_process(&device->ds.trace_context, true); + intel_ds_device_process(&device->ds, true); intel_ds_device_fini(&device->ds); anv_bo_pool_finish(&device->utrace_bo_pool); } diff --git a/src/intel/vulkan_hasvk/anv_wsi.c b/src/intel/vulkan_hasvk/anv_wsi.c index 9ba7b32f356..0c807371316 100644 --- a/src/intel/vulkan_hasvk/anv_wsi.c +++ b/src/intel/vulkan_hasvk/anv_wsi.c @@ -112,7 +112,7 @@ VkResult anv_QueuePresentKHR( _queue, 0, pPresentInfo); - u_trace_context_process(&device->ds.trace_context, true); + intel_ds_device_process(&device->ds, true); return result; }