virtio-user cannot work on 32-bit system as higher 32-bit of the addr field (64-bit) in the desc is filled with non-zero value which should not happen for a 32-bit system.
In case of virtio-user, we use buf_addr of mbuf to fill the virtqueue desc addr. This is a regression bug. For 32-bit system, the first 4 bytes of mbuf is buf_addr, with following 8 bytes for buf_phyaddr. With below wrong definition, both buf_addr and lower 4 bytes buf_phyaddr are obtained to fill the virtqueue desc. #define VIRTIO_MBUF_ADDR(mb, vq) \ (*(uint64_t *)((uintptr_t)(mb) + (vq)->offset)) Fixes: 25f80d108780 ("net/virtio: fix packet corruption") Cc: sta...@dpdk.org Signed-off-by: Jianfeng Tan <jianfeng....@intel.com> --- drivers/net/virtio/virtqueue.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index f9e3736..2e67460 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -69,10 +69,16 @@ struct rte_mbuf; #ifdef RTE_VIRTIO_USER /** - * Return the physical address (or virtual address in case of - * virtio-user) of mbuf data buffer. + * + * Return the physical address of mbuf data buffer for virtio pci: + * on 32-bit system, offset equals 4, return the second four bytes of mbuf; + * on 64-bit system, offset equals 8, return the second eight bytes of mbuf. + * Return the virtual address of mbuf data buffer for virtio-user. + * on 32-bit system, offset equals 0, return the first four bytes of mbuf; + * on 64-bit system, offset equals 0, return the first eight bytes of mbuf; */ -#define VIRTIO_MBUF_ADDR(mb, vq) (*(uint64_t *)((uintptr_t)(mb) + (vq)->offset)) +#define VIRTIO_MBUF_ADDR(mb, vq) \ + ((uint64_t)(*(uintptr_t *)((uintptr_t)(mb) + (vq)->offset))) #else #define VIRTIO_MBUF_ADDR(mb, vq) ((mb)->buf_physaddr) #endif -- 2.7.4