anv: move utrace flush out of backends
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 17 Aug 2023 07:02:45 +0000 (10:02 +0300)
committerMarge Bot <emma+marge@anholt.net>
Mon, 25 Sep 2023 13:05:45 +0000 (13:05 +0000)
The next patch is going to introduce some locking that needs to happen
before the submission to the backend.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24744>

src/intel/vulkan/anv_batch_chain.c
src/intel/vulkan/anv_gem_stubs.c
src/intel/vulkan/anv_kmd_backend.h
src/intel/vulkan/i915/anv_batch_chain.c
src/intel/vulkan/i915/anv_batch_chain.h
src/intel/vulkan/xe/anv_batch_chain.c
src/intel/vulkan/xe/anv_batch_chain.h

index 22975dd..8da9aa8 100644 (file)
@@ -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);
 
index 9e6ab8c..a224910 100644 (file)
@@ -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;
 }
index bf3e093..ff1e969 100644 (file)
@@ -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,
index ed132d4..030a3b5 100644 (file)
@@ -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,
index aa3dbe3..f46f19c 100644 (file)
@@ -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);
index 76a8a4f..28588ae 100644 (file)
@@ -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,
index a3a59f0..f664f96 100644 (file)
@@ -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,