From d7054e23b7d0139e51f2b35fd737b8525c3924cb Mon Sep 17 00:00:00 2001 From: Pawel Wodkowski Date: Thu, 25 May 2017 18:20:01 +0200 Subject: [PATCH] vhost: move VM memory register/unregister to vhost.c It is not vhost SCSI specific. Change-Id: I7eff272fcd1aa47135de7178d0763b1793b298ec Signed-off-by: Pawel Wodkowski Reviewed-on: https://review.gerrithub.io/363087 Reviewed-by: Jim Harris Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp --- lib/vhost/vhost.c | 48 ++++++++++++++++++++++++++++++++++++++ lib/vhost/vhost_internal.h | 4 ++++ lib/vhost/vhost_scsi.c | 32 ++----------------------- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 4d0ba745c..1833ff2a8 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -40,6 +40,7 @@ #include "vhost_internal.h" #include "vhost_scsi.h" #include "task.h" +#include "vhost_iommu.h" static uint32_t g_num_ctrlrs[RTE_MAX_LCORE]; @@ -221,6 +222,53 @@ spdk_vhost_dev_construct(struct spdk_vhost_dev *vdev) return 0; } +#define SHIFT_2MB 21 +#define SIZE_2MB (1ULL << SHIFT_2MB) +#define FLOOR_2MB(x) (((uintptr_t)x) / SIZE_2MB) << SHIFT_2MB +#define CEIL_2MB(x) ((((uintptr_t)x) + SIZE_2MB - 1) / SIZE_2MB) << SHIFT_2MB + +void +spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev) +{ + struct rte_vhost_mem_region *region; + uint32_t i; + + for (i = 0; i < vdev->mem->nregions; i++) { + uint64_t start, end, len; + region = &vdev->mem->regions[i]; + start = FLOOR_2MB(region->mmap_addr); + end = CEIL_2MB(region->mmap_addr + region->mmap_size); + len = end - start; + SPDK_NOTICELOG("Registering VM memory for vtophys translation - 0x%jx len:0x%jx\n", + start, len); + spdk_mem_register((void *)start, len); + if (spdk_iommu_mem_register(region->host_user_addr, region->size)) { + abort(); + } + } +} + +void +spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev) +{ + struct rte_vhost_mem_region *region; + uint32_t i; + + for (i = 0; i < vdev->mem->nregions; i++) { + uint64_t start, end, len; + region = &vdev->mem->regions[i]; + start = FLOOR_2MB(region->mmap_addr); + end = CEIL_2MB(region->mmap_addr + region->mmap_size); + len = end - start; + + if (spdk_iommu_mem_unregister(region->host_user_addr, region->size)) { + abort(); + } + + spdk_mem_unregister((void *)start, len); + } +} + void spdk_vhost_dev_task_ref(struct spdk_vhost_dev *vdev) { diff --git a/lib/vhost/vhost_internal.h b/lib/vhost/vhost_internal.h index a391b50eb..af7a85dbb 100644 --- a/lib/vhost/vhost_internal.h +++ b/lib/vhost/vhost_internal.h @@ -66,6 +66,10 @@ struct spdk_vhost_dev_backend { const struct vhost_device_ops ops; }; + +void spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev); +void spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev); + void *spdk_vhost_gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr); uint32_t spdk_vhost_allocate_reactor(uint64_t cpumask); diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index ad3dcd8bf..ea0ce1430 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -45,7 +45,6 @@ #include "vhost_internal.h" #include "vhost_scsi.h" #include "task.h" -#include "vhost_iommu.h" #ifndef VIRTIO_F_VERSION_1 #define VIRTIO_F_VERSION_1 32 @@ -539,12 +538,6 @@ vdev_worker(void *arg) } } - -#define SHIFT_2MB 21 -#define SIZE_2MB (1ULL << SHIFT_2MB) -#define FLOOR_2MB(x) (((uintptr_t)x) / SIZE_2MB) << SHIFT_2MB -#define CEIL_2MB(x) ((((uintptr_t)x) + SIZE_2MB - 1) / SIZE_2MB) << SHIFT_2MB - static void vdev_event_done_cb(void *arg1, void *arg2) { @@ -580,7 +573,6 @@ add_vdev_cb(void *arg1, void *arg2) { struct spdk_vhost_scsi_dev *svdev = arg1; struct spdk_vhost_dev *vdev = &svdev->vdev; - struct rte_vhost_mem_region *region; uint32_t i; for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) { @@ -591,18 +583,7 @@ add_vdev_cb(void *arg1, void *arg2) } SPDK_NOTICELOG("Started poller for vhost controller %s on lcore %d\n", vdev->name, vdev->lcore); - for (i = 0; i < vdev->mem->nregions; i++) { - uint64_t start, end, len; - region = &vdev->mem->regions[i]; - start = FLOOR_2MB(region->mmap_addr); - end = CEIL_2MB(region->mmap_addr + region->mmap_size); - len = end - start; - SPDK_NOTICELOG("Registering VM memory for vtophys translation - 0x%jx len:0x%jx\n", - start, len); - spdk_mem_register((void *)start, len); - spdk_iommu_mem_register(region->host_user_addr, region->size); - - } + spdk_vhost_dev_mem_register(vdev); spdk_poller_register(&svdev->requestq_poller, vdev_worker, svdev, vdev->lcore, 0); spdk_poller_register(&svdev->controlq_poller, vdev_controlq_worker, svdev, vdev->lcore, @@ -614,7 +595,6 @@ static void remove_vdev_cb(void *arg1, void *arg2) { struct spdk_vhost_scsi_dev *svdev = arg1; - struct rte_vhost_mem_region *region; uint32_t i; for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) { @@ -625,15 +605,7 @@ remove_vdev_cb(void *arg1, void *arg2) } SPDK_NOTICELOG("Stopping poller for vhost controller %s\n", svdev->vdev.name); - for (i = 0; i < svdev->vdev.mem->nregions; i++) { - uint64_t start, end, len; - region = &svdev->vdev.mem->regions[i]; - start = FLOOR_2MB(region->mmap_addr); - end = CEIL_2MB(region->mmap_addr + region->mmap_size); - len = end - start; - spdk_iommu_mem_unregister(region->host_user_addr, region->size); - spdk_mem_unregister((void *)start, len); - } + spdk_vhost_dev_mem_unregister(&svdev->vdev); sem_post((sem_t *)arg2); }