Mesa (main): venus: use uint32_t in vn_ring_submit

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 24 16:09:23 UTC 2021


Module: Mesa
Branch: main
Commit: 572ed2249465acd4c5f8a229d504a48cbddf95a5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=572ed2249465acd4c5f8a229d504a48cbddf95a5

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Fri Aug 20 15:20:58 2021 -0700

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 <olvaffe at gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Ryan Neph <ryanneph at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12494>

---

 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



More information about the mesa-commit mailing list