venus: fix vn_instance_wait_roundtrip when seqno wraps
Signed-off-by: Chia-I Wu <olvaffe@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14026>
This commit is contained in:
parent
47ed98f540
commit
bfa245e0c1
|
@ -319,6 +319,13 @@ vn_instance_submit_roundtrip(struct vn_instance *instance,
|
||||||
return result;
|
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
|
void
|
||||||
vn_instance_wait_roundtrip(struct vn_instance *instance,
|
vn_instance_wait_roundtrip(struct vn_instance *instance,
|
||||||
uint32_t roundtrip_seqno)
|
uint32_t roundtrip_seqno)
|
||||||
|
@ -328,7 +335,7 @@ vn_instance_wait_roundtrip(struct vn_instance *instance,
|
||||||
uint32_t iter = 0;
|
uint32_t iter = 0;
|
||||||
do {
|
do {
|
||||||
const uint32_t cur = atomic_load_explicit(ptr, memory_order_acquire);
|
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;
|
break;
|
||||||
vn_relax(&iter, "roundtrip");
|
vn_relax(&iter, "roundtrip");
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
Loading…
Reference in New Issue