From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jianfeng Tan Subject: [PATCH v2] net/virtio-user: fix not working on 32-bit system Date: Wed, 19 Apr 2017 02:30:33 +0000 Message-ID: <1492569033-140348-1-git-send-email-jianfeng.tan@intel.com> References: <1492092776-57008-1-git-send-email-jianfeng.tan@intel.com> Cc: yuanhan.liu@linux.intel.com, olivier.matz@6wind.com, Jianfeng Tan , stable@dpdk.org To: dev@dpdk.org Return-path: In-Reply-To: <1492092776-57008-1-git-send-email-jianfeng.tan@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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: stable@dpdk.org Signed-off-by: Jianfeng Tan --- 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