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 <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/361934
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Pawel Wodkowski 2017-05-22 14:19:03 +02:00 committed by Daniel Verkamp
parent 4c438999e0
commit 5b392ecdd1

View File

@ -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)