venus: set/check ring status bits independently
authorRyan Neph <ryanneph@google.com>
Wed, 22 Mar 2023 19:27:28 +0000 (12:27 -0700)
committerMarge Bot <emma+marge@anholt.net>
Fri, 24 Mar 2023 23:27:53 +0000 (23:27 +0000)
prepare for manipulation of the new VK_RING_STATUS_ALIVE_BIT_MESA during
ring monitoring.

Signed-off-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22036>

src/virtio/vulkan/vn_common.c
src/virtio/vulkan/vn_ring.c
src/virtio/vulkan/vn_ring.h

index 0472e93..115961f 100644 (file)
@@ -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();
       }
 
index 4e9ac3b..189fe4b 100644 (file)
@@ -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
index 892c361..6959450 100644 (file)
@@ -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 */