101 lines
3.9 KiB
Diff
101 lines
3.9 KiB
Diff
|
|
From 54a98eecdb81d95d958998c3ecb85b20cde03837 Mon Sep 17 00:00:00 2001
|
|||
|
|
From: Maxime Coquelin <maxime.coquelin@redhat.com>
|
|||
|
|
Date: Wed, 5 Oct 2022 22:35:24 +0200
|
|||
|
|
Subject: [PATCH] vhost: fix build with GCC 12
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|
|||
|
|
[ upstream commit 4226aa9caca9511bf95a093b6ad9c1f8727a4d43 ]
|
|||
|
|
|
|||
|
|
This patch fixes a compilation issue met with GCC 12 on
|
|||
|
|
LoongArch64:
|
|||
|
|
|
|||
|
|
In function ‘mbuf_to_desc’,
|
|||
|
|
inlined from ‘vhost_enqueue_async_packed’
|
|||
|
|
inlined from ‘virtio_dev_rx_async_packed’
|
|||
|
|
inlined from ‘virtio_dev_rx_async_submit_packed’
|
|||
|
|
lib/vhost/virtio_net.c:1159:18: error:
|
|||
|
|
‘buf_vec[0].buf_addr’ may be used uninitialized
|
|||
|
|
1159 | buf_addr = buf_vec[vec_idx].buf_addr;
|
|||
|
|
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
lib/vhost/virtio_net.c: In function ‘virtio_dev_rx_async_submit_packed’:
|
|||
|
|
lib/vhost/virtio_net.c:1834:27: note: ‘buf_vec’ declared here
|
|||
|
|
1834 | struct buf_vector buf_vec[BUF_VECTOR_MAX];
|
|||
|
|
| ^~~~~~~
|
|||
|
|
|
|||
|
|
It happens because the compiler assumes that 'size'
|
|||
|
|
variable in vhost_enqueue_async_packed could wrap to 0 since
|
|||
|
|
'size' is uint32_t and pkt->pkt_len too.
|
|||
|
|
|
|||
|
|
In practice, it would never happen since 'pkt->pkt_len' is
|
|||
|
|
unlikely to be close to UINT32_MAX, but let's just change
|
|||
|
|
'size' to uint64_t to make the compiler happy without
|
|||
|
|
having to add runtime checks.
|
|||
|
|
|
|||
|
|
This patch also fixes similar patterns in three other
|
|||
|
|
places, including one that also produces similar build
|
|||
|
|
issue on ARM64 in vhost_enqueue_single_packed().
|
|||
|
|
|
|||
|
|
Fixes: 873e8dad6f49 ("vhost: support packed ring in async datapath")
|
|||
|
|
|
|||
|
|
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
|
|||
|
|
Reviewed-by: David Marchand <david.marchand@redhat.com>
|
|||
|
|
Tested-by: Amit Prakash Shukla <amitprakashs@marvell.com>
|
|||
|
|
---
|
|||
|
|
lib/vhost/virtio_net.c | 10 +++++-----
|
|||
|
|
1 file changed, 5 insertions(+), 5 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c
|
|||
|
|
index bf4d75b4bd..64460e3e8c 100644
|
|||
|
|
--- a/lib/vhost/virtio_net.c
|
|||
|
|
+++ b/lib/vhost/virtio_net.c
|
|||
|
|
@@ -599,7 +599,7 @@ fill_vec_buf_split(struct virtio_net *dev, struct vhost_virtqueue *vq,
|
|||
|
|
*/
|
|||
|
|
static inline int
|
|||
|
|
reserve_avail_buf_split(struct virtio_net *dev, struct vhost_virtqueue *vq,
|
|||
|
|
- uint32_t size, struct buf_vector *buf_vec,
|
|||
|
|
+ uint64_t size, struct buf_vector *buf_vec,
|
|||
|
|
uint16_t *num_buffers, uint16_t avail_head,
|
|||
|
|
uint16_t *nr_vec)
|
|||
|
|
{
|
|||
|
|
@@ -1069,7 +1069,7 @@ vhost_enqueue_single_packed(struct virtio_net *dev,
|
|||
|
|
uint16_t buf_id = 0;
|
|||
|
|
uint32_t len = 0;
|
|||
|
|
uint16_t desc_count;
|
|||
|
|
- uint32_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf);
|
|||
|
|
+ uint64_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf);
|
|||
|
|
uint16_t num_buffers = 0;
|
|||
|
|
uint32_t buffer_len[vq->size];
|
|||
|
|
uint16_t buffer_buf_id[vq->size];
|
|||
|
|
@@ -1137,7 +1137,7 @@ virtio_dev_rx_split(struct virtio_net *dev, struct vhost_virtqueue *vq,
|
|||
|
|
rte_prefetch0(&vq->avail->ring[vq->last_avail_idx & (vq->size - 1)]);
|
|||
|
|
|
|||
|
|
for (pkt_idx = 0; pkt_idx < count; pkt_idx++) {
|
|||
|
|
- uint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;
|
|||
|
|
+ uint64_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;
|
|||
|
|
uint16_t nr_vec = 0;
|
|||
|
|
|
|||
|
|
if (unlikely(reserve_avail_buf_split(dev, vq,
|
|||
|
|
@@ -1485,7 +1485,7 @@ virtio_dev_rx_async_submit_split(struct virtio_net *dev,
|
|||
|
|
async_iter_reset(async);
|
|||
|
|
|
|||
|
|
for (pkt_idx = 0; pkt_idx < count; pkt_idx++) {
|
|||
|
|
- uint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;
|
|||
|
|
+ uint64_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;
|
|||
|
|
uint16_t nr_vec = 0;
|
|||
|
|
|
|||
|
|
if (unlikely(reserve_avail_buf_split(dev, vq, pkt_len, buf_vec,
|
|||
|
|
@@ -1575,7 +1575,7 @@ vhost_enqueue_async_packed(struct virtio_net *dev,
|
|||
|
|
uint16_t buf_id = 0;
|
|||
|
|
uint32_t len = 0;
|
|||
|
|
uint16_t desc_count = 0;
|
|||
|
|
- uint32_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf);
|
|||
|
|
+ uint64_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf);
|
|||
|
|
uint32_t buffer_len[vq->size];
|
|||
|
|
uint16_t buffer_buf_id[vq->size];
|
|||
|
|
uint16_t buffer_desc_count[vq->size];
|
|||
|
|
--
|
|||
|
|
2.23.0
|
|||
|
|
|