From 5b392ecdd1f27bf272fad5f6945d5ab4d4fd04e6 Mon Sep 17 00:00:00 2001 From: Pawel Wodkowski Date: Mon, 22 May 2017 14:19:03 +0200 Subject: [PATCH] vhost: fix deadlock on VFIO registration failure Move mutext locking to API functions to prevent deadlock when memory registration fail. Fixes #163. Change-Id: I4804f671ed9d82ede87bc9439c36368b94e2d636 Signed-off-by: Pawel Wodkowski Reviewed-on: https://review.gerrithub.io/361934 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Daniel Verkamp --- lib/vhost/vhost_iommu.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/vhost/vhost_iommu.c b/lib/vhost/vhost_iommu.c index ffded9033f..8b50e7922e 100644 --- a/lib/vhost/vhost_iommu.c +++ b/lib/vhost/vhost_iommu.c @@ -57,7 +57,7 @@ static struct { struct vfio_map *maps; size_t maps_count; size_t maps_max_count; -} vfio_cfg = { 1, -1 }; +} vfio_cfg = { 1, -1, PTHREAD_MUTEX_INITIALIZER }; /* Internal DPDK function forward declaration */ int pci_vfio_is_enabled(void); @@ -108,7 +108,6 @@ vfio_cfg_init(void) return -1; } - pthread_mutex_init(&vfio_cfg.map_lock, NULL); return 0; } @@ -244,8 +243,6 @@ spdk_vfio_mem_op(uint64_t addr, uint64_t len, int dma_op) return 0; } - pthread_mutex_lock(&vfio_cfg.map_lock); - vaddr = addr; while (len > 0) { vlen = spdk_min(len_2mb - (vaddr & MASK_2MB), len); @@ -282,18 +279,27 @@ spdk_vfio_mem_op(uint64_t addr, uint64_t len, int dma_op) spdk_vfio_mem_op(addr, vaddr - addr, VFIO_IOMMU_UNMAP_DMA); } - pthread_mutex_unlock(&vfio_cfg.map_lock); return ret; } int spdk_iommu_mem_register(uint64_t addr, uint64_t len) { - return spdk_vfio_mem_op(addr, len, VFIO_IOMMU_MAP_DMA); + int ret; + + pthread_mutex_lock(&vfio_cfg.map_lock); + ret = spdk_vfio_mem_op(addr, len, VFIO_IOMMU_MAP_DMA); + pthread_mutex_unlock(&vfio_cfg.map_lock); + return ret; } int spdk_iommu_mem_unregister(uint64_t addr, uint64_t len) { - return spdk_vfio_mem_op(addr, len, VFIO_IOMMU_UNMAP_DMA); + int ret; + + pthread_mutex_lock(&vfio_cfg.map_lock); + ret = spdk_vfio_mem_op(addr, len, VFIO_IOMMU_MAP_DMA); + pthread_mutex_unlock(&vfio_cfg.map_lock); + return ret; } SPDK_LOG_REGISTER_TRACE_FLAG("vhost_vfio", SPDK_TRACE_VHOST_VFIO)