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;
|
struct vfio_map *maps;
|
||||||
size_t maps_count;
|
size_t maps_count;
|
||||||
size_t maps_max_count;
|
size_t maps_max_count;
|
||||||
} vfio_cfg = { 1, -1 };
|
} vfio_cfg = { 1, -1, PTHREAD_MUTEX_INITIALIZER };
|
||||||
|
|
||||||
/* Internal DPDK function forward declaration */
|
/* Internal DPDK function forward declaration */
|
||||||
int pci_vfio_is_enabled(void);
|
int pci_vfio_is_enabled(void);
|
||||||
@ -108,7 +108,6 @@ vfio_cfg_init(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_init(&vfio_cfg.map_lock, NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,8 +243,6 @@ spdk_vfio_mem_op(uint64_t addr, uint64_t len, int dma_op)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&vfio_cfg.map_lock);
|
|
||||||
|
|
||||||
vaddr = addr;
|
vaddr = addr;
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
vlen = spdk_min(len_2mb - (vaddr & MASK_2MB), len);
|
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);
|
spdk_vfio_mem_op(addr, vaddr - addr, VFIO_IOMMU_UNMAP_DMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&vfio_cfg.map_lock);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int spdk_iommu_mem_register(uint64_t addr, uint64_t len)
|
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)
|
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)
|
SPDK_LOG_REGISTER_TRACE_FLAG("vhost_vfio", SPDK_TRACE_VHOST_VFIO)
|
||||||
|
Loading…
Reference in New Issue
Block a user