net/virtio-user: fix address on 32-bit system
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: 25f80d1087
("net/virtio: fix packet corruption")
Cc: stable@dpdk.org
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
This commit is contained in:
parent
cca5c0c008
commit
260aae9ad9
@ -71,8 +71,14 @@ struct rte_mbuf;
|
||||
/**
|
||||
* Return the physical address (or virtual address in case of
|
||||
* virtio-user) of mbuf data buffer.
|
||||
*
|
||||
* The address is firstly casted to the word size (sizeof(uintptr_t))
|
||||
* before casting it to uint64_t. This is to make it work with different
|
||||
* combination of word size (64 bit and 32 bit) and virtio device
|
||||
* (virtio-pci and virtio-user).
|
||||
*/
|
||||
#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
|
||||
|
Loading…
Reference in New Issue
Block a user