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
|
||
|