diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 22975ddc0c8..8da9aa84682 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1287,7 +1287,8 @@ anv_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass) + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit) { struct anv_device *device = queue->device; VkResult result = VK_SUCCESS; @@ -1311,7 +1312,8 @@ anv_queue_exec_locked(struct anv_queue *queue, cmd_buffer_count, cmd_buffers, needs_companion_sync ? 0 : signal_count, signals, perf_query_pool, - perf_query_pass); + perf_query_pass, + utrace_submit); if (result != VK_SUCCESS) return result; @@ -1328,7 +1330,8 @@ anv_queue_exec_locked(struct anv_queue *queue, 1, &companion_sync, 0, NULL, signal_count, signals, - NULL, 0); + NULL, 0, + NULL); } return result; @@ -1342,7 +1345,8 @@ can_chain_query_pools(struct anv_query_pool *p1, struct anv_query_pool *p2) static VkResult anv_queue_submit_locked(struct anv_queue *queue, - struct vk_queue_submit *submit) + struct vk_queue_submit *submit, + struct anv_utrace_submit *utrace_submit) { VkResult result; @@ -1363,7 +1367,8 @@ anv_queue_submit_locked(struct anv_queue *queue, NULL /* cmd_buffers */, submit->signal_count, submit->signals, NULL /* perf_query_pool */, - 0 /* perf_query_pass */); + 0 /* perf_query_pass */, + utrace_submit); if (result != VK_SUCCESS) return result; } else { @@ -1401,7 +1406,8 @@ anv_queue_submit_locked(struct anv_queue *queue, next == end ? submit->signal_count : 0, next == end ? submit->signals : NULL, perf_query_pool, - submit->perf_pass_index); + submit->perf_pass_index, + next == end ? utrace_submit : NULL); if (result != VK_SUCCESS) return result; if (next < end) { @@ -1456,10 +1462,22 @@ anv_queue_submit(struct vk_queue *vk_queue, return VK_SUCCESS; } + /* Flush the trace points first before taking the lock as the flushing + * might try to take that same lock. + */ + struct anv_utrace_submit *utrace_submit = NULL; + result = anv_device_utrace_flush_cmd_buffers( + queue, + submit->command_buffer_count, + (struct anv_cmd_buffer **)submit->command_buffers, + &utrace_submit); + if (result != VK_SUCCESS) + return result; + pthread_mutex_lock(&device->mutex); uint64_t start_ts = intel_ds_begin_submit(&queue->ds); - result = anv_queue_submit_locked(queue, submit); + result = anv_queue_submit_locked(queue, submit, utrace_submit); /* Take submission ID under lock */ intel_ds_end_submit(&queue->ds, start_ts); diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c index 9e6ab8c4847..a22491012c4 100644 --- a/src/intel/vulkan/anv_gem_stubs.c +++ b/src/intel/vulkan/anv_gem_stubs.c @@ -74,7 +74,8 @@ stub_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass) + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit) { return VK_ERROR_UNKNOWN; } diff --git a/src/intel/vulkan/anv_kmd_backend.h b/src/intel/vulkan/anv_kmd_backend.h index bf3e093162f..ff1e969a222 100644 --- a/src/intel/vulkan/anv_kmd_backend.h +++ b/src/intel/vulkan/anv_kmd_backend.h @@ -86,7 +86,8 @@ struct anv_kmd_backend { uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass); + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit); VkResult (*queue_exec_trace)(struct anv_queue *queue, struct anv_utrace_submit *submit); uint32_t (*bo_alloc_flags_to_bo_flags)(struct anv_device *device, diff --git a/src/intel/vulkan/i915/anv_batch_chain.c b/src/intel/vulkan/i915/anv_batch_chain.c index ed132d4b5ad..030a3b5d013 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.c +++ b/src/intel/vulkan/i915/anv_batch_chain.c @@ -730,24 +730,16 @@ i915_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass) + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit) { struct anv_device *device = queue->device; - struct anv_utrace_submit *utrace_submit = NULL; struct anv_execbuf execbuf = { .alloc = &queue->device->vk.alloc, .alloc_scope = VK_SYSTEM_ALLOCATION_SCOPE_DEVICE, .perf_query_pass = perf_query_pass, }; - - /* Flush the trace points first, they need to be moved */ - VkResult result = - anv_device_utrace_flush_cmd_buffers(queue, - cmd_buffer_count, - cmd_buffers, - &utrace_submit); - if (result != VK_SUCCESS) - goto error; + VkResult result; if (utrace_submit && !utrace_submit->batch_bo) { result = anv_execbuf_add_sync(device, &execbuf, diff --git a/src/intel/vulkan/i915/anv_batch_chain.h b/src/intel/vulkan/i915/anv_batch_chain.h index aa3dbe32437..f46f19c90bc 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.h +++ b/src/intel/vulkan/i915/anv_batch_chain.h @@ -50,4 +50,5 @@ i915_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass); + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit); diff --git a/src/intel/vulkan/xe/anv_batch_chain.c b/src/intel/vulkan/xe/anv_batch_chain.c index 76a8a4fc2ec..28588aedfe2 100644 --- a/src/intel/vulkan/xe/anv_batch_chain.c +++ b/src/intel/vulkan/xe/anv_batch_chain.c @@ -266,17 +266,12 @@ xe_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass) + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit) { struct anv_device *device = queue->device; - struct anv_utrace_submit *utrace_submit = NULL; VkResult result; - result = anv_device_utrace_flush_cmd_buffers(queue, cmd_buffer_count, - cmd_buffers, &utrace_submit); - if (result != VK_SUCCESS) - return result; - struct drm_xe_sync *xe_syncs = NULL; uint32_t xe_syncs_count = 0; result = xe_exec_process_syncs(queue, wait_count, waits, diff --git a/src/intel/vulkan/xe/anv_batch_chain.h b/src/intel/vulkan/xe/anv_batch_chain.h index a3a59f03d70..f664f9673dd 100644 --- a/src/intel/vulkan/xe/anv_batch_chain.h +++ b/src/intel/vulkan/xe/anv_batch_chain.h @@ -46,7 +46,8 @@ xe_queue_exec_locked(struct anv_queue *queue, uint32_t signal_count, const struct vk_sync_signal *signals, struct anv_query_pool *perf_query_pool, - uint32_t perf_query_pass); + uint32_t perf_query_pass, + struct anv_utrace_submit *utrace_submit); VkResult xe_queue_exec_utrace_locked(struct anv_queue *queue,