From 8123aef784ad472e2a72c7fd6cbdb6ff96a1f2a5 Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Tue, 8 Aug 2017 16:11:49 +0200 Subject: [PATCH] vhost: don't abort on mem region registration failure A single warning message is printed instead. This is required for VMs which have memory mapped virtual devices. (e.g NVDIMM in Clear Containers). This memory won't ever be used by guest kernel for IO processing. Change-Id: Ie24501acbdb3ba0d67bd29b146a09b222451427d Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/373224 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker Reviewed-by: Pawel Wodkowski --- lib/vhost/vhost.c | 16 ++++++++++++++-- test/unit/lib/vhost/vhost.c/vhost_ut.c | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 945faaacd..7645e4097 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -210,7 +210,13 @@ spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev) 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_mem_register((void *)start, len) != 0) { + SPDK_WARNLOG("Failed to register memory region %"PRIu32". Future vtophys translation might fail.\n", + i); + continue; + } + if (spdk_iommu_mem_register(region->host_user_addr, region->size)) { abort(); } @@ -230,11 +236,17 @@ spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev) end = CEIL_2MB(region->mmap_addr + region->mmap_size); len = end - start; + if (spdk_vtophys((void *) start) == SPDK_VTOPHYS_ERROR) { + continue; /* region has not been registered */ + } + if (spdk_iommu_mem_unregister(region->host_user_addr, region->size)) { abort(); } - spdk_mem_unregister((void *)start, len); + if (spdk_mem_unregister((void *)start, len) != 0) { + assert(false); + } } } diff --git a/test/unit/lib/vhost/vhost.c/vhost_ut.c b/test/unit/lib/vhost/vhost.c/vhost_ut.c index 8b4e19030..0ed3d2c1d 100644 --- a/test/unit/lib/vhost/vhost.c/vhost_ut.c +++ b/test/unit/lib/vhost/vhost.c/vhost_ut.c @@ -44,6 +44,7 @@ DEFINE_STUB(spdk_event_allocate, struct spdk_event *, (uint32_t lcore, spdk_event_fn fn, void *arg1, void *arg2), NULL); DEFINE_STUB(spdk_mem_register, int, (void *vaddr, size_t len), 0); DEFINE_STUB(spdk_mem_unregister, int, (void *vaddr, size_t len), 0); +DEFINE_STUB(spdk_vtophys, uint64_t, (void *vaddr), 1); DEFINE_STUB(spdk_iommu_mem_register, int, (uint64_t addr, uint64_t len), 0); DEFINE_STUB(spdk_app_get_core_mask, uint64_t, (void), 0); DEFINE_STUB_V(spdk_app_stop, (int rc));