From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: "Xu, Qian Q" <qian.q.xu@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>,
Maxime Coquelin <maxime.coquelin@redhat.com>
Subject: Re: [PATCH 1/6] vhost: simplify memory regions handling
Date: Wed, 24 Aug 2016 15:40:26 +0800 [thread overview]
Message-ID: <20160824074026.GT30752@yliu-dev.sh.intel.com> (raw)
In-Reply-To: <82F45D86ADE5454A95A89742C8D1410E03322F77@shsmsx102.ccr.corp.intel.com>
Yes, it depends on the vhost-cuse removal patchset I sent last week.
--yliu
On Wed, Aug 24, 2016 at 07:26:07AM +0000, Xu, Qian Q wrote:
> I want to apply the patch on the latest DPDK, see below commit ID but failed since no vhost.h and vhost-user.h files. So do you have any dependency on other patches?
>
> commit 28d8abaf250c3fb4dcb6416518f4c54b4ae67205
> Author: Deirdre O'Connor <deirdre.o.connor@intel.com>
> Date: Mon Aug 22 17:20:08 2016 +0100
>
> doc: fix patchwork link
>
> Fixes: 58abf6e77c6b ("doc: add contributors guide")
>
> Reported-by: Jon Loeliger <jdl@netgate.com>
> Signed-off-by: Deirdre O'Connor <deirdre.o.connor@intel.com>
> Acked-by: John McNamara <john.mcnamara@intel.com>
>
>
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yuanhan Liu
> Sent: Tuesday, August 23, 2016 4:11 PM
> To: dev@dpdk.org
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>; Yuanhan Liu <yuanhan.liu@linux.intel.com>
> Subject: [dpdk-dev] [PATCH 1/6] vhost: simplify memory regions handling
>
> Due to history reason (that vhost-cuse comes before vhost-user), some fields for maintaining the vhost-user memory mappings (such as mmapped address and size, with those we then can unmap on destroy) are kept in "orig_region_map" struct, a structure that is defined only in vhost-user source file.
>
> The right way to go is to remove the structure and move all those fields into virtio_memory_region struct. But we simply can't do that before, because it breaks the ABI.
>
> Now, thanks to the ABI refactoring, it's never been a blocking issue any more. And here it goes: this patch removes orig_region_map and redefines virtio_memory_region, to include all necessary info.
>
> With that, we can simplify the guest/host address convert a bit.
>
> Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
> ---
> lib/librte_vhost/vhost.h | 49 ++++++------
> lib/librte_vhost/vhost_user.c | 172 +++++++++++++++++-------------------------
> 2 files changed, 90 insertions(+), 131 deletions(-)
>
> diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index c2dfc3c..df2107b 100644
> --- a/lib/librte_vhost/vhost.h
> +++ b/lib/librte_vhost/vhost.h
> @@ -143,12 +143,14 @@ struct virtio_net {
> * Information relating to memory regions including offsets to
> * addresses in QEMUs memory file.
> */
> -struct virtio_memory_regions {
> - uint64_t guest_phys_address;
> - uint64_t guest_phys_address_end;
> - uint64_t memory_size;
> - uint64_t userspace_address;
> - uint64_t address_offset;
> +struct virtio_memory_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;
> };
>
>
> @@ -156,12 +158,8 @@ struct virtio_memory_regions {
> * Memory structure includes region and mapping information.
> */
> struct virtio_memory {
> - /* Base QEMU userspace address of the memory file. */
> - uint64_t base_address;
> - uint64_t mapped_address;
> - uint64_t mapped_size;
> uint32_t nregions;
> - struct virtio_memory_regions regions[0];
> + struct virtio_memory_region regions[0];
> };
>
>
> @@ -200,26 +198,23 @@ extern uint64_t VHOST_FEATURES;
> #define MAX_VHOST_DEVICE 1024
> extern struct virtio_net *vhost_devices[MAX_VHOST_DEVICE];
>
> -/**
> - * Function to convert guest physical addresses to vhost virtual addresses.
> - * This is used to convert guest virtio buffer addresses.
> - */
> +/* Convert guest physical Address to host virtual address */
> static inline uint64_t __attribute__((always_inline)) -gpa_to_vva(struct virtio_net *dev, uint64_t guest_pa)
> +gpa_to_vva(struct virtio_net *dev, uint64_t gpa)
> {
> - struct virtio_memory_regions *region;
> - uint32_t regionidx;
> - uint64_t vhost_va = 0;
> -
> - for (regionidx = 0; regionidx < dev->mem->nregions; regionidx++) {
> - region = &dev->mem->regions[regionidx];
> - if ((guest_pa >= region->guest_phys_address) &&
> - (guest_pa <= region->guest_phys_address_end)) {
> - vhost_va = region->address_offset + guest_pa;
> - break;
> + struct virtio_memory_region *reg;
> + uint32_t i;
> +
> + for (i = 0; i < dev->mem->nregions; i++) {
> + reg = &dev->mem->regions[i];
> + if (gpa >= reg->guest_phys_addr &&
> + gpa < reg->guest_phys_addr + reg->size) {
> + return gpa - reg->guest_phys_addr +
> + reg->host_user_addr;
> }
> }
> - return vhost_va;
> +
> + return 0;
> }
>
> struct virtio_net_device_ops const *notify_ops; diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index eee99e9..d2071fd 100644
> --- a/lib/librte_vhost/vhost_user.c
> +++ b/lib/librte_vhost/vhost_user.c
> @@ -74,18 +74,6 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
> [VHOST_USER_SEND_RARP] = "VHOST_USER_SEND_RARP", };
>
> -struct orig_region_map {
> - int fd;
> - uint64_t mapped_address;
> - uint64_t mapped_size;
> - uint64_t blksz;
> -};
> -
> -#define orig_region(ptr, nregions) \
> - ((struct orig_region_map *)RTE_PTR_ADD((ptr), \
> - sizeof(struct virtio_memory) + \
> - sizeof(struct virtio_memory_regions) * (nregions)))
> -
> static uint64_t
> get_blk_size(int fd)
> {
> @@ -99,18 +87,17 @@ get_blk_size(int fd) static void free_mem_region(struct virtio_net *dev) {
> - struct orig_region_map *region;
> - unsigned int idx;
> + uint32_t i;
> + struct virtio_memory_region *reg;
>
> if (!dev || !dev->mem)
> return;
>
> - region = orig_region(dev->mem, dev->mem->nregions);
> - for (idx = 0; idx < dev->mem->nregions; idx++) {
> - if (region[idx].mapped_address) {
> - munmap((void *)(uintptr_t)region[idx].mapped_address,
> - region[idx].mapped_size);
> - close(region[idx].fd);
> + for (i = 0; i < dev->mem->nregions; i++) {
> + reg = &dev->mem->regions[i];
> + if (reg->host_user_addr) {
> + munmap(reg->mmap_addr, reg->mmap_size);
> + close(reg->fd);
> }
> }
> }
> @@ -120,7 +107,7 @@ vhost_backend_cleanup(struct virtio_net *dev) {
> if (dev->mem) {
> free_mem_region(dev);
> - free(dev->mem);
> + rte_free(dev->mem);
> dev->mem = NULL;
> }
> if (dev->log_addr) {
> @@ -286,25 +273,23 @@ numa_realloc(struct virtio_net *dev, int index __rte_unused)
> * used to convert the ring addresses to our address space.
> */
> static uint64_t
> -qva_to_vva(struct virtio_net *dev, uint64_t qemu_va)
> +qva_to_vva(struct virtio_net *dev, uint64_t qva)
> {
> - struct virtio_memory_regions *region;
> - uint64_t vhost_va = 0;
> - uint32_t regionidx = 0;
> + struct virtio_memory_region *reg;
> + uint32_t i;
>
> /* Find the region where the address lives. */
> - for (regionidx = 0; regionidx < dev->mem->nregions; regionidx++) {
> - region = &dev->mem->regions[regionidx];
> - if ((qemu_va >= region->userspace_address) &&
> - (qemu_va <= region->userspace_address +
> - region->memory_size)) {
> - vhost_va = qemu_va + region->guest_phys_address +
> - region->address_offset -
> - region->userspace_address;
> - break;
> + for (i = 0; i < dev->mem->nregions; i++) {
> + reg = &dev->mem->regions[i];
> +
> + if (qva >= reg->guest_user_addr &&
> + qva < reg->guest_user_addr + reg->size) {
> + return qva - reg->guest_user_addr +
> + reg->host_user_addr;
> }
> }
> - return vhost_va;
> +
> + return 0;
> }
>
> /*
> @@ -391,11 +376,13 @@ static int
> vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg) {
> struct VhostUserMemory memory = pmsg->payload.memory;
> - struct virtio_memory_regions *pregion;
> - uint64_t mapped_address, mapped_size;
> - unsigned int idx = 0;
> - struct orig_region_map *pregion_orig;
> + struct virtio_memory_region *reg;
> + void *mmap_addr;
> + uint64_t mmap_size;
> + uint64_t mmap_offset;
> uint64_t alignment;
> + uint32_t i;
> + int fd;
>
> /* Remove from the data plane. */
> if (dev->flags & VIRTIO_DEV_RUNNING) { @@ -405,14 +392,12 @@ vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
>
> if (dev->mem) {
> free_mem_region(dev);
> - free(dev->mem);
> + rte_free(dev->mem);
> dev->mem = NULL;
> }
>
> - dev->mem = calloc(1,
> - sizeof(struct virtio_memory) +
> - sizeof(struct virtio_memory_regions) * memory.nregions +
> - sizeof(struct orig_region_map) * memory.nregions);
> + dev->mem = rte_zmalloc("vhost-mem-table", sizeof(struct virtio_memory) +
> + sizeof(struct virtio_memory_region) * memory.nregions, 0);
> if (dev->mem == NULL) {
> RTE_LOG(ERR, VHOST_CONFIG,
> "(%d) failed to allocate memory for dev->mem\n", @@ -421,22 +406,17 @@ vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
> }
> dev->mem->nregions = memory.nregions;
>
> - pregion_orig = orig_region(dev->mem, memory.nregions);
> - for (idx = 0; idx < memory.nregions; idx++) {
> - pregion = &dev->mem->regions[idx];
> - pregion->guest_phys_address =
> - memory.regions[idx].guest_phys_addr;
> - pregion->guest_phys_address_end =
> - memory.regions[idx].guest_phys_addr +
> - memory.regions[idx].memory_size;
> - pregion->memory_size =
> - memory.regions[idx].memory_size;
> - pregion->userspace_address =
> - memory.regions[idx].userspace_addr;
> -
> - /* This is ugly */
> - mapped_size = memory.regions[idx].memory_size +
> - memory.regions[idx].mmap_offset;
> + for (i = 0; i < memory.nregions; i++) {
> + fd = pmsg->fds[i];
> + reg = &dev->mem->regions[i];
> +
> + reg->guest_phys_addr = memory.regions[i].guest_phys_addr;
> + reg->guest_user_addr = memory.regions[i].userspace_addr;
> + reg->size = memory.regions[i].memory_size;
> + reg->fd = fd;
> +
> + mmap_offset = memory.regions[i].mmap_offset;
> + mmap_size = reg->size + mmap_offset;
>
> /* mmap() without flag of MAP_ANONYMOUS, should be called
> * with length argument aligned with hugepagesz at older @@ -446,67 +426,51 @@ vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
> * to avoid failure, make sure in caller to keep length
> * aligned.
> */
> - alignment = get_blk_size(pmsg->fds[idx]);
> + alignment = get_blk_size(fd);
> if (alignment == (uint64_t)-1) {
> RTE_LOG(ERR, VHOST_CONFIG,
> "couldn't get hugepage size through fstat\n");
> goto err_mmap;
> }
> - mapped_size = RTE_ALIGN_CEIL(mapped_size, alignment);
> + mmap_size = RTE_ALIGN_CEIL(mmap_size, alignment);
>
> - mapped_address = (uint64_t)(uintptr_t)mmap(NULL,
> - mapped_size,
> - PROT_READ | PROT_WRITE, MAP_SHARED,
> - pmsg->fds[idx],
> - 0);
> + mmap_addr = mmap(NULL, mmap_size,
> + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
>
> - RTE_LOG(INFO, VHOST_CONFIG,
> - "mapped region %d fd:%d to:%p sz:0x%"PRIx64" "
> - "off:0x%"PRIx64" align:0x%"PRIx64"\n",
> - idx, pmsg->fds[idx], (void *)(uintptr_t)mapped_address,
> - mapped_size, memory.regions[idx].mmap_offset,
> - alignment);
> -
> - if (mapped_address == (uint64_t)(uintptr_t)MAP_FAILED) {
> + if (mmap_addr == MAP_FAILED) {
> RTE_LOG(ERR, VHOST_CONFIG,
> - "mmap qemu guest failed.\n");
> + "mmap region %u failed.\n", i);
> goto err_mmap;
> }
>
> - pregion_orig[idx].mapped_address = mapped_address;
> - pregion_orig[idx].mapped_size = mapped_size;
> - pregion_orig[idx].blksz = alignment;
> - pregion_orig[idx].fd = pmsg->fds[idx];
> -
> - mapped_address += memory.regions[idx].mmap_offset;
> + reg->mmap_addr = mmap_addr;
> + reg->mmap_size = mmap_size;
> + reg->host_user_addr = (uint64_t)(uintptr_t)mmap_addr + mmap_offset;
>
> - pregion->address_offset = mapped_address -
> - pregion->guest_phys_address;
> -
> - if (memory.regions[idx].guest_phys_addr == 0) {
> - dev->mem->base_address =
> - memory.regions[idx].userspace_addr;
> - dev->mem->mapped_address =
> - pregion->address_offset;
> - }
> -
> - LOG_DEBUG(VHOST_CONFIG,
> - "REGION: %u GPA: %p QEMU VA: %p SIZE (%"PRIu64")\n",
> - idx,
> - (void *)(uintptr_t)pregion->guest_phys_address,
> - (void *)(uintptr_t)pregion->userspace_address,
> - pregion->memory_size);
> + RTE_LOG(INFO, VHOST_CONFIG,
> + "guest memory region %u, size: 0x%" PRIx64 "\n"
> + "\t guest physical addr: 0x%" PRIx64 "\n"
> + "\t guest virtual addr: 0x%" PRIx64 "\n"
> + "\t host virtual addr: 0x%" PRIx64 "\n"
> + "\t mmap addr : 0x%" PRIx64 "\n"
> + "\t mmap size : 0x%" PRIx64 "\n"
> + "\t mmap align: 0x%" PRIx64 "\n"
> + "\t mmap off : 0x%" PRIx64 "\n",
> + i, reg->size,
> + reg->guest_phys_addr,
> + reg->guest_user_addr,
> + reg->host_user_addr,
> + (uint64_t)(uintptr_t)mmap_addr,
> + mmap_size,
> + alignment,
> + mmap_offset);
> }
>
> return 0;
>
> err_mmap:
> - while (idx--) {
> - munmap((void *)(uintptr_t)pregion_orig[idx].mapped_address,
> - pregion_orig[idx].mapped_size);
> - close(pregion_orig[idx].fd);
> - }
> - free(dev->mem);
> + free_mem_region(dev);
> + rte_free(dev->mem);
> dev->mem = NULL;
> return -1;
> }
> --
> 1.9.0
next prev parent reply other threads:[~2016-08-24 7:30 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-23 8:10 [PATCH 0/6] vhost: add Tx zero copy support Yuanhan Liu
2016-08-23 8:10 ` [PATCH 1/6] vhost: simplify memory regions handling Yuanhan Liu
2016-08-23 9:17 ` Maxime Coquelin
2016-08-24 7:26 ` Xu, Qian Q
2016-08-24 7:40 ` Yuanhan Liu [this message]
2016-08-24 7:36 ` Xu, Qian Q
2016-08-23 8:10 ` [PATCH 2/6] vhost: get guest/host physical address mappings Yuanhan Liu
2016-08-23 9:58 ` Maxime Coquelin
2016-08-23 12:32 ` Yuanhan Liu
2016-08-23 13:25 ` Maxime Coquelin
2016-08-23 13:49 ` Yuanhan Liu
2016-08-23 14:05 ` Maxime Coquelin
2016-08-23 8:10 ` [PATCH 3/6] vhost: introduce last avail idx for Tx Yuanhan Liu
2016-08-23 12:27 ` Maxime Coquelin
2016-08-23 8:10 ` [PATCH 4/6] vhost: add Tx zero copy Yuanhan Liu
2016-08-23 14:04 ` Maxime Coquelin
2016-08-23 14:31 ` Yuanhan Liu
2016-08-23 15:40 ` Maxime Coquelin
2016-08-23 8:10 ` [PATCH 5/6] vhost: add a flag to enable " Yuanhan Liu
2016-09-06 9:00 ` Xu, Qian Q
2016-09-06 9:42 ` Xu, Qian Q
2016-09-06 10:02 ` Yuanhan Liu
2016-09-07 2:43 ` Xu, Qian Q
2016-09-06 9:55 ` Yuanhan Liu
2016-09-07 16:00 ` Thomas Monjalon
2016-09-08 7:21 ` Yuanhan Liu
2016-09-08 7:57 ` Thomas Monjalon
2016-08-23 8:10 ` [PATCH 6/6] examples/vhost: add an option " Yuanhan Liu
2016-08-23 9:31 ` Thomas Monjalon
2016-08-23 12:33 ` Yuanhan Liu
2016-08-23 14:14 ` Maxime Coquelin
2016-08-23 14:45 ` Yuanhan Liu
2016-08-23 14:18 ` [PATCH 0/6] vhost: add Tx zero copy support Maxime Coquelin
2016-08-23 14:42 ` Yuanhan Liu
2016-08-23 14:53 ` Yuanhan Liu
2016-08-23 16:41 ` Maxime Coquelin
2016-08-29 8:32 ` Xu, Qian Q
2016-08-29 8:57 ` Xu, Qian Q
2016-09-23 4:11 ` Yuanhan Liu
2016-10-09 15:20 ` Yuanhan Liu
2016-09-23 4:13 ` [PATCH v2 0/7] vhost: add dequeue " Yuanhan Liu
2016-09-23 4:13 ` [PATCH v2 1/7] vhost: simplify memory regions handling Yuanhan Liu
2016-09-23 4:13 ` [PATCH v2 2/7] vhost: get guest/host physical address mappings Yuanhan Liu
2016-09-26 20:17 ` Maxime Coquelin
2016-09-23 4:13 ` [PATCH v2 3/7] vhost: introduce last avail idx for dequeue Yuanhan Liu
2016-09-23 4:13 ` [PATCH v2 4/7] vhost: add dequeue zero copy Yuanhan Liu
2016-09-26 20:45 ` Maxime Coquelin
2016-10-06 14:37 ` Xu, Qian Q
2016-10-09 2:03 ` Yuanhan Liu
2016-10-10 10:12 ` Xu, Qian Q
2016-10-10 10:14 ` Maxime Coquelin
2016-10-10 10:22 ` Xu, Qian Q
2016-10-10 10:40 ` Xu, Qian Q
2016-10-10 11:48 ` Maxime Coquelin
2016-09-23 4:13 ` [PATCH v2 5/7] vhost: add a flag to enable " Yuanhan Liu
2016-09-26 20:57 ` Maxime Coquelin
2016-09-23 4:13 ` [PATCH v2 6/7] examples/vhost: add an option " Yuanhan Liu
2016-09-26 21:05 ` Maxime Coquelin
2016-09-23 4:13 ` [PATCH v2 7/7] net/vhost: " Yuanhan Liu
2016-09-26 21:05 ` Maxime Coquelin
2016-10-09 7:27 ` [PATCH v3 0/7] vhost: add dequeue zero copy support Yuanhan Liu
2016-10-09 7:27 ` [PATCH v3 1/7] vhost: simplify memory regions handling Yuanhan Liu
2016-10-09 7:27 ` [PATCH v3 2/7] vhost: get guest/host physical address mappings Yuanhan Liu
2016-11-29 3:10 ` linhaifeng
2016-11-29 13:14 ` linhaifeng
2016-10-09 7:27 ` [PATCH v3 3/7] vhost: introduce last avail idx for dequeue Yuanhan Liu
2016-10-09 7:27 ` [PATCH v3 4/7] vhost: add dequeue zero copy Yuanhan Liu
2016-10-09 7:27 ` [PATCH v3 5/7] vhost: add a flag to enable " Yuanhan Liu
2016-10-09 7:27 ` [PATCH v3 6/7] examples/vhost: add an option " Yuanhan Liu
2016-10-09 7:28 ` [PATCH v3 7/7] net/vhost: " Yuanhan Liu
2016-10-11 13:04 ` [PATCH v3 0/7] vhost: add dequeue zero copy support Xu, Qian Q
2016-10-12 7:48 ` Yuanhan Liu
2016-10-09 10:46 ` [PATCH 0/6] vhost: add Tx " linhaifeng
2016-10-10 8:03 ` Yuanhan Liu
2016-10-14 7:30 ` linhaifeng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160824074026.GT30752@yliu-dev.sh.intel.com \
--to=yuanhan.liu@linux.intel.com \
--cc=dev@dpdk.org \
--cc=maxime.coquelin@redhat.com \
--cc=qian.q.xu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.