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:
parent
4c438999e0
commit
5b392ecdd1
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user