diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index 15f851b4a41..2948d858659 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -147,6 +147,11 @@ vn_relax(const struct vn_ring *ring, uint32_t *iter, const char *reason) if (unlikely(*iter % (1 << warn_order) == 0)) { vn_log(NULL, "stuck in %s wait with iter at %d", reason, *iter); + if (vn_ring_fatal(ring)) { + vn_log(NULL, "aborting on ring fatal error"); + abort(); + } + if (*iter >= (1 << abort_order) && !VN_DEBUG(NO_ABORT)) { vn_log(NULL, "aborting"); abort(); diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index 805f97cc343..a315dbbdb99 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -30,10 +30,16 @@ vn_ring_store_tail(struct vn_ring *ring) static uint32_t vn_ring_load_status(const struct vn_ring *ring) { - /* this must be called and ordered after vn_ring_store_tail */ + /* must be called and ordered after vn_ring_store_tail for idle status */ return atomic_load_explicit(ring->shared.status, memory_order_seq_cst); } +bool +vn_ring_fatal(const struct vn_ring *ring) +{ + return vn_ring_load_status(ring) & VK_RING_STATUS_FATAL_BIT_MESA; +} + static void vn_ring_write_buffer(struct vn_ring *ring, const void *data, uint32_t size) { diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index 6d51610a794..970cce73c04 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -98,4 +98,7 @@ vn_ring_submit(struct vn_ring *ring, void vn_ring_wait(const struct vn_ring *ring, uint32_t seqno); +bool +vn_ring_fatal(const struct vn_ring *ring); + #endif /* VN_RING_H */