Mesa (master): anv/device: keep track of 'device lost' state

Iago Toral Quiroga itoral at kemper.freedesktop.org
Fri Mar 24 07:17:46 UTC 2017


Module: Mesa
Branch: master
Commit: 50c8d2c1f71944688ebf753af3866981a07c4e9c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=50c8d2c1f71944688ebf753af3866981a07c4e9c

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Wed Mar 22 08:46:04 2017 +0100

anv/device: keep track of 'device lost' state

The Vulkan specs say:

   "A logical device may become lost because of hardware errors, execution
    timeouts, power management events and/or platform-specific events. This
    may cause pending and future command execution to fail and cause hardware
    resources to be corrupted. When this happens, certain commands will
    return VK_ERROR_DEVICE_LOST (see Error Codes for a list of such commands).
    After any such event, the logical device is considered lost. It is not
    possible to reset the logical device to a non-lost state, however the lost
    state is specific to a logical device (VkDevice), and the corresponding
    physical device (VkPhysicalDevice) may be otherwise unaffected. In some
    cases, the physical device may also be lost, and attempting to create a
    new logical device will fail, returning VK_ERROR_DEVICE_LOST."

This means that we need to track if a logical device has been lost so we can
have the commands referenced by the spec return VK_ERROR_DEVICE_LOST
immediately.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

---

 src/intel/vulkan/anv_device.c  | 5 +++++
 src/intel/vulkan/anv_private.h | 1 +
 2 files changed, 6 insertions(+)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 2a2a470ec9..193db01b92 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -929,6 +929,7 @@ anv_device_submit_simple_batch(struct anv_device *device,
    ret = anv_gem_wait(device, bo.gem_handle, &timeout);
    if (ret != 0) {
       /* We don't know the real error. */
+      device->lost = true;
       result = vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m");
       goto fail;
    }
@@ -973,6 +974,7 @@ VkResult anv_CreateDevice(
    device->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
    device->instance = physical_device->instance;
    device->chipset_id = physical_device->chipset_id;
+   device->lost = false;
 
    if (pAllocator)
       device->alloc = *pAllocator;
@@ -1250,6 +1252,7 @@ anv_device_execbuf(struct anv_device *device,
    int ret = anv_gem_execbuffer(device, execbuf);
    if (ret != 0) {
       /* We don't know the real error. */
+      device->lost = true;
       return vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m");
    }
 
@@ -1339,6 +1342,7 @@ out:
        * submit the same job again to this device.
        */
       result = VK_ERROR_DEVICE_LOST;
+      device->lost = true;
 
       /* If we return VK_ERROR_DEVICE LOST here, we need to ensure that
        * vkWaitForFences() and vkGetFenceStatus() return a valid result
@@ -1865,6 +1869,7 @@ VkResult anv_WaitForFences(
                return VK_TIMEOUT;
             } else if (ret == -1) {
                /* We don't know the real error. */
+                device->lost = true;
                return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m");
             } else {
                fence->state = ANV_FENCE_STATE_SIGNALED;
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index fd82ce92df..68f7359d71 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -619,6 +619,7 @@ struct anv_device {
 
     pthread_mutex_t                             mutex;
     pthread_cond_t                              queue_submit;
+    bool                                        lost;
 };
 
 static void inline




More information about the mesa-commit mailing list