From bfa245e0c1b4022f9ea75fee76657b87ae86588b Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 2 Dec 2021 15:01:09 -0800 Subject: [PATCH] venus: fix vn_instance_wait_roundtrip when seqno wraps Signed-off-by: Chia-I Wu Part-of: --- src/virtio/vulkan/vn_instance.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 025433bf975..910f7ded115 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -319,6 +319,13 @@ vn_instance_submit_roundtrip(struct vn_instance *instance, return result; } +static bool +roundtrip_seqno_ge(uint32_t a, uint32_t b) +{ + /* a >= b, but deal with wrapping as well */ + return (a - b) <= INT32_MAX; +} + void vn_instance_wait_roundtrip(struct vn_instance *instance, uint32_t roundtrip_seqno) @@ -328,7 +335,7 @@ vn_instance_wait_roundtrip(struct vn_instance *instance, uint32_t iter = 0; do { const uint32_t cur = atomic_load_explicit(ptr, memory_order_acquire); - if (cur >= roundtrip_seqno || roundtrip_seqno - cur >= INT32_MAX) + if (roundtrip_seqno_ge(cur, roundtrip_seqno)) break; vn_relax(&iter, "roundtrip"); } while (true);