From 28bdf8db184a1cfc3c10b202765cf2674ceb29c9 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 21 Sep 2022 21:08:41 +0000 Subject: [PATCH] venus: vn_relax to abort on ring fatal status upon warn order Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_common.c | 5 +++++ src/virtio/vulkan/vn_ring.c | 8 +++++++- src/virtio/vulkan/vn_ring.h | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) 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 */