vdpa: do not save failed dma maps in SVQ iova tree
If a map fails for whatever reason, it must not be saved in the tree. Otherwise, qemu will try to unmap it in cleanup, leaving to more errors. Fixes: 34e3c94eda ("vdpa: Add custom IOTLB translations to SVQ") Reported-by: Lei Yang <leiyang@redhat.com> Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
10dab9f263
commit
7dab70bec3
@ -176,6 +176,7 @@ static void vhost_vdpa_listener_commit(MemoryListener *listener)
|
|||||||
static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
||||||
MemoryRegionSection *section)
|
MemoryRegionSection *section)
|
||||||
{
|
{
|
||||||
|
DMAMap mem_region = {};
|
||||||
struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
|
struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
|
||||||
hwaddr iova;
|
hwaddr iova;
|
||||||
Int128 llend, llsize;
|
Int128 llend, llsize;
|
||||||
@ -212,13 +213,13 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
|||||||
|
|
||||||
llsize = int128_sub(llend, int128_make64(iova));
|
llsize = int128_sub(llend, int128_make64(iova));
|
||||||
if (v->shadow_vqs_enabled) {
|
if (v->shadow_vqs_enabled) {
|
||||||
DMAMap mem_region = {
|
int r;
|
||||||
.translated_addr = (hwaddr)(uintptr_t)vaddr,
|
|
||||||
.size = int128_get64(llsize) - 1,
|
|
||||||
.perm = IOMMU_ACCESS_FLAG(true, section->readonly),
|
|
||||||
};
|
|
||||||
|
|
||||||
int r = vhost_iova_tree_map_alloc(v->iova_tree, &mem_region);
|
mem_region.translated_addr = (hwaddr)(uintptr_t)vaddr,
|
||||||
|
mem_region.size = int128_get64(llsize) - 1,
|
||||||
|
mem_region.perm = IOMMU_ACCESS_FLAG(true, section->readonly),
|
||||||
|
|
||||||
|
r = vhost_iova_tree_map_alloc(v->iova_tree, &mem_region);
|
||||||
if (unlikely(r != IOVA_OK)) {
|
if (unlikely(r != IOVA_OK)) {
|
||||||
error_report("Can't allocate a mapping (%d)", r);
|
error_report("Can't allocate a mapping (%d)", r);
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -232,11 +233,16 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
|||||||
vaddr, section->readonly);
|
vaddr, section->readonly);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("vhost vdpa map fail!");
|
error_report("vhost vdpa map fail!");
|
||||||
goto fail;
|
goto fail_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
fail_map:
|
||||||
|
if (v->shadow_vqs_enabled) {
|
||||||
|
vhost_iova_tree_remove(v->iova_tree, &mem_region);
|
||||||
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
/*
|
/*
|
||||||
* On the initfn path, store the first error in the container so we
|
* On the initfn path, store the first error in the container so we
|
||||||
|
Loading…
x
Reference in New Issue
Block a user