On Mon, May 30, 2016 at 10:55:34AM +0000, Jianfeng Tan wrote: > This patch is related to how to calculate relative address for vhost > backend. > > The principle is that: based on one or multiple shared memory regions, > vhost maintains a reference system with the frontend start address, > backend start address, and length for each segment, so that each > frontend address (GPA, Guest Physical Address) can be translated into > vhost-recognizable backend address. To make the address translation > efficient, we need to maintain as few regions as possible. In the case > of VM, GPA is always locally continuous. But for some other case, like > virtio-user, we use virtual address here. > > It basically means: > a. when set_base_addr, VA address is used; > b. when preparing RX's descriptors, VA address is used; > c. when transmitting packets, VA is filled in TX's descriptors; > d. in TX and CQ's header, VA is used. > > Signed-off-by: Huawei Xie <huawei.xie at intel.com> > Signed-off-by: Jianfeng Tan <jianfeng.tan at intel.com> > Acked-by: Neil Horman <nhorman at tuxdriver.com> > --- > drivers/net/virtio/virtio_ethdev.c | 21 ++++++++++++++++----- > drivers/net/virtio/virtio_rxtx.c | 5 ++--- > drivers/net/virtio/virtio_rxtx_simple.c | 13 +++++++------ > drivers/net/virtio/virtqueue.h | 13 ++++++++++++- > 4 files changed, 37 insertions(+), 15 deletions(-) > > @@ -419,8 +419,6 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev, > vq->virtio_net_hdr_mem = hdr_mz->phys_addr; > > memset(hdr_mz->addr, 0, hdr_mz_sz); > - vring_hdr_desc_init(vq); > - > } else if (queue_type == VTNET_CQ) { > /* Allocate a page for control vq command, data and status */ > snprintf(vq_name, sizeof(vq_name), "port%d_cvq_hdrzone", > @@ -441,6 +439,19 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev, > memset(vq->virtio_net_hdr_mz->addr, 0, PAGE_SIZE); > } > > + if (dev->pci_dev) > + vq->offset = offsetof(struct rte_mbuf, buf_physaddr); > + else { > + vq->vq_ring_mem = (phys_addr_t)vq->mz->addr; > + vq->offset = offsetof(struct rte_mbuf, buf_addr); > + if (vq->virtio_net_hdr_mz) > + vq->virtio_net_hdr_mem = > + (phys_addr_t)vq->virtio_net_hdr_mz->addr; > + }
I guess this piece of code deserves some comments. Say, for virtio-user case (that is when dev->pci_dev is NULL), we use virtual address, because, bala, bala ... > @@ -165,6 +173,7 @@ struct virtqueue { > void *vq_ring_virt_mem; /**< linear address of vring*/ > unsigned int vq_ring_size; > phys_addr_t vq_ring_mem; /**< physical address of vring */ > + /**< use virtual address for vdev. */ Replace vdev with "virtio-user" is better here? --yliu