Mesa (main): v3dv: Switch to the common device lost tracking

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 13 17:57:18 UTC 2022


Module: Mesa
Branch: main
Commit: 8bd7bd957791170c00702467844176644d2808bd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8bd7bd957791170c00702467844176644d2808bd

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Mon Apr  4 09:50:26 2022 -0500

v3dv: Switch to the common device lost tracking

Vulkan requires that, once the device has been lost, you keep returning
VK_ERROR_DEVICE_LOST.  We've got tracking for this in common code; it
just needs to be wired up.

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15704>

---

 src/broadcom/vulkan/v3dv_device.c |  4 ++++
 src/broadcom/vulkan/v3dv_query.c  |  9 ++++++---
 src/broadcom/vulkan/v3dv_queue.c  | 35 +++++++++++++++++++++++------------
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 915fb691979..52aaeeb756f 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -2036,6 +2036,10 @@ VKAPI_ATTR VkResult VKAPI_CALL
 v3dv_DeviceWaitIdle(VkDevice _device)
 {
    V3DV_FROM_HANDLE(v3dv_device, device, _device);
+
+   if (vk_device_is_lost(&device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    return v3dv_QueueWaitIdle(v3dv_queue_to_handle(&device->queue));
 }
 
diff --git a/src/broadcom/vulkan/v3dv_query.c b/src/broadcom/vulkan/v3dv_query.c
index fc5a976ea7c..6102976dc68 100644
--- a/src/broadcom/vulkan/v3dv_query.c
+++ b/src/broadcom/vulkan/v3dv_query.c
@@ -147,6 +147,9 @@ get_occlusion_query_result(struct v3dv_device *device,
 {
    assert(pool && pool->query_type == VK_QUERY_TYPE_OCCLUSION);
 
+   if (vk_device_is_lost(&device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    struct v3dv_query *q = &pool->queries[query];
    assert(q->bo && q->bo->map);
 
@@ -159,10 +162,10 @@ get_occlusion_query_result(struct v3dv_device *device,
        *     error may occur."
        */
       if (!q->maybe_available)
-         return vk_error(device, VK_ERROR_DEVICE_LOST);
+         return vk_device_set_lost(&device->vk, "Query unavailable");
 
       if (!v3dv_bo_wait(device, q->bo, 0xffffffffffffffffull))
-         return vk_error(device, VK_ERROR_DEVICE_LOST);
+         return vk_device_set_lost(&device->vk, "Query BO wait failed: %m");
 
       *available = true;
    } else {
@@ -195,7 +198,7 @@ get_timestamp_query_result(struct v3dv_device *device,
        *     error may occur."
        */
       if (!q->maybe_available)
-         return vk_error(device, VK_ERROR_DEVICE_LOST);
+         return vk_device_set_lost(&device->vk, "Query unavailable");
 
       *available = true;
    } else {
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index d95b4be2f38..f88c7ce032a 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -145,13 +145,13 @@ gpu_queue_wait_idle(struct v3dv_queue *queue)
                                3, INT64_MAX,
                                DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, NULL);
       if (ret)
-         return VK_ERROR_DEVICE_LOST;
+         return vk_queue_set_lost(&queue->vk, "Syncobj wait failed: %m");
    } else {
       int ret =
          drmSyncobjWait(render_fd, &last_job_syncs.syncs[V3DV_QUEUE_ANY], 1,
                         INT64_MAX, 0, NULL);
       if (ret)
-         return VK_ERROR_DEVICE_LOST;
+         return vk_queue_set_lost(&queue->vk, "Syncobj wait failed: %m");
    }
 
    return VK_SUCCESS;
@@ -162,6 +162,9 @@ v3dv_QueueWaitIdle(VkQueue _queue)
 {
    V3DV_FROM_HANDLE(v3dv_queue, queue, _queue);
 
+   if (vk_device_is_lost(&queue->device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    /* Check that we don't have any wait threads running in the CPU first,
     * as these can spawn new GPU jobs.
     */
@@ -457,7 +460,8 @@ spawn_event_wait_thread(struct v3dv_wait_thread_info *info, pthread_t *wait_thre
    assert(wait_thread != NULL);
 
    if (pthread_create(wait_thread, NULL, event_wait_thread_func, info))
-      return vk_error(info->job->device, VK_ERROR_DEVICE_LOST);
+      return vk_queue_set_lost(&info->job->device->queue.vk,
+                               "Thread create failed: %m");
 
    return VK_NOT_READY;
 }
@@ -1001,7 +1005,7 @@ handle_cl_job(struct v3dv_queue *queue,
    multisync_free(device, &ms);
 
    if (ret)
-      return vk_error(device, VK_ERROR_DEVICE_LOST);
+      return vk_queue_set_lost(&queue->vk, "V3D_SUBMIT_CL failed: %m");
 
    return VK_SUCCESS;
 }
@@ -1045,10 +1049,8 @@ handle_tfu_job(struct v3dv_queue *queue,
 
    multisync_free(device, &ms);
 
-   if (ret != 0) {
-      fprintf(stderr, "Failed to submit TFU job: %d\n", ret);
-      return vk_error(device, VK_ERROR_DEVICE_LOST);
-   }
+   if (ret != 0)
+      return vk_queue_set_lost(&queue->vk, "V3D_SUBMIT_TFU failed: %m");
 
    return VK_SUCCESS;
 }
@@ -1114,7 +1116,7 @@ handle_csd_job(struct v3dv_queue *queue,
    multisync_free(device, &ms);
 
    if (ret)
-      return vk_error(device, VK_ERROR_DEVICE_LOST);
+      return vk_queue_set_lost(&queue->vk, "V3D_SUBMIT_CSD failed: %m");
 
    return VK_SUCCESS;
 }
@@ -1517,7 +1519,7 @@ spawn_master_wait_thread(struct v3dv_queue *queue,
    mtx_lock(&queue->mutex);
    if (pthread_create(&wait_info->master_wait_thread, NULL,
                       master_wait_thread_func, wait_info)) {
-      result = vk_error(queue, VK_ERROR_DEVICE_LOST);
+      result = vk_queue_set_lost(&queue->vk, "Thread create failed: %m");
       goto done;
    }
 
@@ -1536,6 +1538,9 @@ v3dv_QueueSubmit(VkQueue _queue,
 {
    V3DV_FROM_HANDLE(v3dv_queue, queue, _queue);
 
+   if (vk_device_is_lost(&queue->device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    struct v3dv_queue_submit_wait_info *wait_info = NULL;
 
    VkResult result = VK_SUCCESS;
@@ -1949,13 +1954,16 @@ v3dv_GetFenceStatus(VkDevice _device, VkFence _fence)
    V3DV_FROM_HANDLE(v3dv_device, device, _device);
    V3DV_FROM_HANDLE(v3dv_fence, fence, _fence);
 
+   if (vk_device_is_lost(&device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    uint32_t sync = fence_get_sync(fence);
    int ret = drmSyncobjWait(device->pdevice->render_fd, &sync, 1,
                             0, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, NULL);
    if (ret == -ETIME)
       return VK_NOT_READY;
    else if (ret)
-      return vk_error(device, VK_ERROR_DEVICE_LOST);
+      return vk_device_set_lost(&device->vk, "Syncobj wait failed: %m");
    return VK_SUCCESS;
 }
 
@@ -2045,6 +2053,9 @@ v3dv_WaitForFences(VkDevice _device,
 {
    V3DV_FROM_HANDLE(v3dv_device, device, _device);
 
+   if (vk_device_is_lost(&device->vk))
+      return VK_ERROR_DEVICE_LOST;
+
    const uint64_t abs_timeout = get_absolute_timeout(timeout);
 
    uint32_t *syncobjs = vk_alloc(&device->vk.alloc,
@@ -2073,7 +2084,7 @@ v3dv_WaitForFences(VkDevice _device,
    if (ret == -ETIME)
       return VK_TIMEOUT;
    else if (ret)
-      return vk_error(device, VK_ERROR_DEVICE_LOST);
+      return vk_device_set_lost(&device->vk, "Syncobj wait failed: %m");
    return VK_SUCCESS;
 }
 



More information about the mesa-commit mailing list