From 572ed2249465acd4c5f8a229d504a48cbddf95a5 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 20 Aug 2021 15:20:58 -0700 Subject: [PATCH] venus: use uint32_t in vn_ring_submit And in vn_ring_write_buffer as well, to fix the assert in vn_ring_write_buffer. The ring code uses 32-bit unsigned integers and relies on that their overflow/underflow behavior is well-defined. When ring->shared.head is about to overflow and ring->cur has overflowed, this expression ring->cur + size - vn_ring_load_head(ring) gives an incorrect result when size is 64-bit. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Reviewed-by: Ryan Neph Part-of: --- src/virtio/vulkan/vn_ring.c | 8 ++++---- src/virtio/vulkan/vn_ring.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index 29a2884776e..4f1b99db4c5 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -42,15 +42,15 @@ vn_ring_load_status(const struct vn_ring *ring) } static void -vn_ring_write_buffer(struct vn_ring *ring, const void *data, size_t size) +vn_ring_write_buffer(struct vn_ring *ring, const void *data, uint32_t size) { assert(ring->cur + size - vn_ring_load_head(ring) <= VN_RING_BUFFER_SIZE); - const size_t offset = ring->cur & VN_RING_BUFFER_MASK; + const uint32_t offset = ring->cur & VN_RING_BUFFER_MASK; if (offset + size <= VN_RING_BUFFER_SIZE) { memcpy(ring->shared.buffer + offset, data, size); } else { - const size_t s = VN_RING_BUFFER_SIZE - offset; + const uint32_t s = VN_RING_BUFFER_SIZE - offset; memcpy(ring->shared.buffer + offset, data, s); memcpy(ring->shared.buffer, data + s, size - s); } @@ -204,7 +204,7 @@ bool vn_ring_submit(struct vn_ring *ring, struct vn_ring_submit *submit, const void *cs_data, - size_t cs_size, + uint32_t cs_size, uint32_t *seqno) { const uint32_t cur_seqno = vn_ring_wait_space(ring, cs_size); diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index a9542631964..3d3d2afbe6e 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -88,7 +88,7 @@ bool vn_ring_submit(struct vn_ring *ring, struct vn_ring_submit *submit, const void *cs_data, - size_t cs_size, + uint32_t cs_size, uint32_t *seqno); void