Module: Mesa Branch: main Commit: 3812a946d22bab9fd1945c309e1f8cd2b63b591d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3812a946d22bab9fd1945c309e1f8cd2b63b591d
Author: Ryan Neph <[email protected]> Date: Wed Mar 22 12:27:28 2023 -0700 venus: set/check ring status bits independently prepare for manipulation of the new VK_RING_STATUS_ALIVE_BIT_MESA during ring monitoring. Signed-off-by: Ryan Neph <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22036> --- src/virtio/vulkan/vn_common.c | 5 +++-- src/virtio/vulkan/vn_ring.c | 9 +++++---- src/virtio/vulkan/vn_ring.h | 11 +++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index 0472e9369b7..115961fe065 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -161,8 +161,9 @@ vn_relax(struct vn_relax_state *state) 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"); + const uint32_t status = vn_ring_load_status(ring); + if (status & VK_RING_STATUS_FATAL_BIT_MESA) { + vn_log(NULL, "aborting on ring fatal error at iter %d", *iter); abort(); } diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index 4e9ac3b3acf..189fe4bc88f 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -27,17 +27,18 @@ vn_ring_store_tail(struct vn_ring *ring) memory_order_release); } -static uint32_t +uint32_t vn_ring_load_status(const struct vn_ring *ring) { /* 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) +void +vn_ring_unset_status_bits(struct vn_ring *ring, uint32_t mask) { - return vn_ring_load_status(ring) & VK_RING_STATUS_FATAL_BIT_MESA; + atomic_fetch_and_explicit(ring->shared.status, ~mask, + memory_order_seq_cst); } static void diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index 892c3616b14..69594504a8b 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -44,7 +44,7 @@ static_assert(ATOMIC_INT_LOCK_FREE == 2 && sizeof(atomic_uint) == 4, struct vn_ring_shared { const volatile atomic_uint *head; volatile atomic_uint *tail; - const volatile atomic_uint *status; + volatile atomic_uint *status; void *buffer; void *extra; }; @@ -89,6 +89,12 @@ vn_ring_fini(struct vn_ring *ring); struct vn_ring_submit * vn_ring_get_submit(struct vn_ring *ring, uint32_t shmem_count); +uint32_t +vn_ring_load_status(const struct vn_ring *ring); + +void +vn_ring_unset_status_bits(struct vn_ring *ring, uint32_t mask); + bool vn_ring_submit(struct vn_ring *ring, struct vn_ring_submit *submit, @@ -98,7 +104,4 @@ vn_ring_submit(struct vn_ring *ring, void vn_ring_wait(struct vn_ring *ring, uint32_t seqno); -bool -vn_ring_fatal(const struct vn_ring *ring); - #endif /* VN_RING_H */
