From 70e8d1397ec0a426fb6562724bf3c2f23ea27d19 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Mon, 6 Nov 2023 12:46:42 -0800 Subject: [PATCH] venus: further cleanup vn_relax_init to take instance instead of ring For multi-ring, later we can just check primary ring alive status. Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_common.c | 16 ++++++++-------- src/virtio/vulkan/vn_common.h | 5 ++--- src/virtio/vulkan/vn_queue.c | 8 ++++---- src/virtio/vulkan/vn_ring.c | 6 ++++-- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index 75eaded758a..6090ca21c0e 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -165,19 +165,19 @@ vn_watchdog_acquire(struct vn_watchdog *watchdog, bool alive) void vn_relax_fini(struct vn_relax_state *state) { - vn_watchdog_release(state->watchdog); + vn_watchdog_release(&state->instance->ring.watchdog); } struct vn_relax_state -vn_relax_init(struct vn_ring *ring, const char *reason) +vn_relax_init(struct vn_instance *instance, const char *reason) { - struct vn_watchdog *watchdog = &ring->instance->ring.watchdog; + struct vn_ring *ring = &instance->ring.ring; + struct vn_watchdog *watchdog = &instance->ring.watchdog; if (vn_watchdog_acquire(watchdog, true)) vn_ring_unset_status_bits(ring, VK_RING_STATUS_ALIVE_BIT_MESA); return (struct vn_relax_state){ - .ring = ring, - .watchdog = watchdog, + .instance = instance, .iter = 0, .reason = reason, }; @@ -186,7 +186,6 @@ vn_relax_init(struct vn_ring *ring, const char *reason) void vn_relax(struct vn_relax_state *state) { - struct vn_ring *ring = state->ring; uint32_t *iter = &state->iter; const char *reason = state->reason; @@ -210,16 +209,17 @@ vn_relax(struct vn_relax_state *state) * another 2047 shorter sleeps) */ if (unlikely(*iter % (1 << warn_order) == 0)) { - struct vn_instance *instance = ring->instance; + struct vn_instance *instance = state->instance; vn_log(instance, "stuck in %s wait with iter at %d", reason, *iter); - struct vn_watchdog *watchdog = state->watchdog; + struct vn_ring *ring = &instance->ring.ring; const uint32_t status = vn_ring_load_status(ring); if (status & VK_RING_STATUS_FATAL_BIT_MESA) { vn_log(instance, "aborting on ring fatal error at iter %d", *iter); abort(); } + struct vn_watchdog *watchdog = &instance->ring.watchdog; const bool alive = status & VK_RING_STATUS_ALIVE_BIT_MESA; if (vn_watchdog_acquire(watchdog, alive)) vn_ring_unset_status_bits(ring, VK_RING_STATUS_ALIVE_BIT_MESA); diff --git a/src/virtio/vulkan/vn_common.h b/src/virtio/vulkan/vn_common.h index bee0af6c650..ca26694df3b 100644 --- a/src/virtio/vulkan/vn_common.h +++ b/src/virtio/vulkan/vn_common.h @@ -202,8 +202,7 @@ struct vn_watchdog { }; struct vn_relax_state { - struct vn_ring *ring; - struct vn_watchdog *watchdog; + struct vn_instance *instance; uint32_t iter; const char *reason; }; @@ -306,7 +305,7 @@ vn_watchdog_fini(struct vn_watchdog *watchdog) } struct vn_relax_state -vn_relax_init(struct vn_ring *ring, const char *reason); +vn_relax_init(struct vn_instance *instance, const char *reason); void vn_relax(struct vn_relax_state *state); diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index 31e2d2d408d..e1136660f8b 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -1786,7 +1786,7 @@ vn_WaitForFences(VkDevice device, memcpy(fences, pFences, sizeof(*fences) * fenceCount); struct vn_relax_state relax_state = - vn_relax_init(&dev->instance->ring.ring, "client"); + vn_relax_init(dev->instance, "client"); while (result == VK_NOT_READY) { result = vn_remove_signaled_fences(device, fences, &fenceCount); result = @@ -1798,7 +1798,7 @@ vn_WaitForFences(VkDevice device, vk_free(alloc, fences); } else { struct vn_relax_state relax_state = - vn_relax_init(&dev->instance->ring.ring, "client"); + vn_relax_init(dev->instance, "client"); while (result == VK_NOT_READY) { result = vn_find_first_signaled_fence(device, pFences, fenceCount); result = @@ -2301,7 +2301,7 @@ vn_WaitSemaphores(VkDevice device, memcpy(values, pWaitInfo->pValues, sizeof(*values) * semaphore_count); struct vn_relax_state relax_state = - vn_relax_init(&dev->instance->ring.ring, "client"); + vn_relax_init(dev->instance, "client"); while (result == VK_NOT_READY) { result = vn_remove_signaled_semaphores(device, semaphores, values, &semaphore_count); @@ -2314,7 +2314,7 @@ vn_WaitSemaphores(VkDevice device, vk_free(alloc, semaphores); } else { struct vn_relax_state relax_state = - vn_relax_init(&dev->instance->ring.ring, "client"); + vn_relax_init(dev->instance, "client"); while (result == VK_NOT_READY) { result = vn_find_first_signaled_semaphore( device, pWaitInfo->pSemaphores, pWaitInfo->pValues, diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index f5af1786308..9015c701104 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -102,7 +102,8 @@ vn_ring_wait_seqno(struct vn_ring *ring, uint32_t seqno) /* A renderer wait incurs several hops and the renderer might poll * repeatedly anyway. Let's just poll here. */ - struct vn_relax_state relax_state = vn_relax_init(ring, "ring seqno"); + struct vn_relax_state relax_state = + vn_relax_init(ring->instance, "ring seqno"); do { if (vn_ring_get_seqno_status(ring, seqno)) { vn_relax_fini(&relax_state); @@ -139,7 +140,8 @@ vn_ring_wait_space(struct vn_ring *ring, uint32_t size) VN_TRACE_FUNC(); /* see the reasoning in vn_ring_wait_seqno */ - struct vn_relax_state relax_state = vn_relax_init(ring, "ring space"); + struct vn_relax_state relax_state = + vn_relax_init(ring->instance, "ring space"); do { vn_relax(&relax_state); if (vn_ring_has_space(ring, size, &head)) {