[dpdk-dev] [PATCH 05/17] vhost: export guest memory regions
Maxime Coquelin
maxime.coquelin at redhat.com
Tue Mar 14 12:00:05 CET 2017
On 03/03/2017 10:51 AM, Yuanhan Liu wrote:
> Some vhost-user driver may need this info to setup its own page tables
> for GPA (guest physical addr) to HPA (host physical addr) translation.
> SPDK (Storage Performance Development Kit) is one example.
>
> Besides, by exporting this memory info, we could also export the
> gpa_to_vva() as an inline function, which helps for performance.
> Otherwise, it has to be referenced indirectly by a "vid".
>
> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> ---
> lib/librte_vhost/rte_vhost_version.map | 1 +
> lib/librte_vhost/rte_virtio_net.h | 24 ++++++++++++++++++++++++
> lib/librte_vhost/vhost.c | 23 +++++++++++++++++++++++
> lib/librte_vhost/vhost.h | 28 ++--------------------------
> lib/librte_vhost/vhost_user.c | 12 ++++++------
> 5 files changed, 56 insertions(+), 32 deletions(-)
>
> diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
> index ee72d5f..b890da6 100644
> --- a/lib/librte_vhost/rte_vhost_version.map
> +++ b/lib/librte_vhost/rte_vhost_version.map
> @@ -35,5 +35,6 @@ DPDK_17.05 {
> rte_vhost_driver_enable_features;
> rte_vhost_driver_get_features;
> rte_vhost_driver_set_features;
> + rte_vhost_get_vhost_memory;
>
> } DPDK_16.07;
> diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h
> index 3bfd0b7..eddf0f4 100644
> --- a/lib/librte_vhost/rte_virtio_net.h
> +++ b/lib/librte_vhost/rte_virtio_net.h
> @@ -59,6 +59,28 @@
> enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
>
> /**
> + * Information relating to memory regions including offsets to
> + * addresses in QEMUs memory file.
> + */
> +struct rte_vhost_mem_region {
> + uint64_t guest_phys_addr;
> + uint64_t guest_user_addr;
> + uint64_t host_user_addr;
> + uint64_t size;
> + void *mmap_addr;
> + uint64_t mmap_size;
> + int fd;
> +};
> +
> +/**
> + * Memory structure includes region and mapping information.
> + */
> +struct rte_vhost_memory {
> + uint32_t nregions;
> + struct rte_vhost_mem_region regions[0];
> +};
> +
> +/**
> * Device and vring operations.
> */
> struct virtio_net_device_ops {
> @@ -187,4 +209,6 @@ uint16_t rte_vhost_enqueue_burst(int vid, uint16_t queue_id,
> uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
> struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count);
>
> +int rte_vhost_get_vhost_memory(int vid, struct rte_vhost_memory **mem);
> +
> #endif /* _VIRTIO_NET_H_ */
> diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
> index 0088f87..eee229a 100644
> --- a/lib/librte_vhost/vhost.c
> +++ b/lib/librte_vhost/vhost.c
> @@ -340,6 +340,29 @@ struct virtio_net *
> return 0;
> }
>
> +int
> +rte_vhost_get_vhost_memory(int vid, struct rte_vhost_memory **mem)
> +{
> + struct virtio_net *dev;
> + struct rte_vhost_memory *m;
> + size_t size;
> +
> + dev = get_device(vid);
> + if (!dev)
> + return -1;
> +
> + size = dev->mem->nregions * sizeof(struct rte_vhost_mem_region);
> + m = malloc(size);
> + if (!m)
> + return -1;
> +
> + m->nregions = dev->mem->nregions;
> + memcpy(m->regions, dev->mem->regions, size);
> + *mem = m;
> +
> + return 0;
> +}
> +
Might worth to be documented, as API.
Other than that:
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
Thanks,
Maxime
More information about the dev
mailing list