vhost: move VM memory register/unregister to vhost.c
It is not vhost SCSI specific. Change-Id: I7eff272fcd1aa47135de7178d0763b1793b298ec Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-on: https://review.gerrithub.io/363087 Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
c190dcd767
commit
d7054e23b7
@ -40,6 +40,7 @@
|
|||||||
#include "vhost_internal.h"
|
#include "vhost_internal.h"
|
||||||
#include "vhost_scsi.h"
|
#include "vhost_scsi.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
#include "vhost_iommu.h"
|
||||||
|
|
||||||
static uint32_t g_num_ctrlrs[RTE_MAX_LCORE];
|
static uint32_t g_num_ctrlrs[RTE_MAX_LCORE];
|
||||||
|
|
||||||
@ -221,6 +222,53 @@ spdk_vhost_dev_construct(struct spdk_vhost_dev *vdev)
|
|||||||
return 0;
|
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
|
void
|
||||||
spdk_vhost_dev_task_ref(struct spdk_vhost_dev *vdev)
|
spdk_vhost_dev_task_ref(struct spdk_vhost_dev *vdev)
|
||||||
{
|
{
|
||||||
|
@ -66,6 +66,10 @@ struct spdk_vhost_dev_backend {
|
|||||||
const struct vhost_device_ops ops;
|
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);
|
void *spdk_vhost_gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr);
|
||||||
|
|
||||||
uint32_t spdk_vhost_allocate_reactor(uint64_t cpumask);
|
uint32_t spdk_vhost_allocate_reactor(uint64_t cpumask);
|
||||||
|
@ -45,7 +45,6 @@
|
|||||||
#include "vhost_internal.h"
|
#include "vhost_internal.h"
|
||||||
#include "vhost_scsi.h"
|
#include "vhost_scsi.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "vhost_iommu.h"
|
|
||||||
|
|
||||||
#ifndef VIRTIO_F_VERSION_1
|
#ifndef VIRTIO_F_VERSION_1
|
||||||
#define VIRTIO_F_VERSION_1 32
|
#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
|
static void
|
||||||
vdev_event_done_cb(void *arg1, void *arg2)
|
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_scsi_dev *svdev = arg1;
|
||||||
struct spdk_vhost_dev *vdev = &svdev->vdev;
|
struct spdk_vhost_dev *vdev = &svdev->vdev;
|
||||||
struct rte_vhost_mem_region *region;
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; 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);
|
SPDK_NOTICELOG("Started poller for vhost controller %s on lcore %d\n", vdev->name, vdev->lcore);
|
||||||
|
|
||||||
for (i = 0; i < vdev->mem->nregions; i++) {
|
spdk_vhost_dev_mem_register(vdev);
|
||||||
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_poller_register(&svdev->requestq_poller, vdev_worker, svdev, vdev->lcore, 0);
|
spdk_poller_register(&svdev->requestq_poller, vdev_worker, svdev, vdev->lcore, 0);
|
||||||
spdk_poller_register(&svdev->controlq_poller, vdev_controlq_worker, svdev, vdev->lcore,
|
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)
|
remove_vdev_cb(void *arg1, void *arg2)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_scsi_dev *svdev = arg1;
|
struct spdk_vhost_scsi_dev *svdev = arg1;
|
||||||
struct rte_vhost_mem_region *region;
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; 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);
|
SPDK_NOTICELOG("Stopping poller for vhost controller %s\n", svdev->vdev.name);
|
||||||
for (i = 0; i < svdev->vdev.mem->nregions; i++) {
|
spdk_vhost_dev_mem_unregister(&svdev->vdev);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
sem_post((sem_t *)arg2);
|
sem_post((sem_t *)arg2);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user