mirror of
https://github.com/qemu/qemu.git
synced 2024-12-02 00:03:35 +08:00
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,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
DMAMap mem_region = {};
|
||||
struct vhost_vdpa *v = container_of(listener, struct vhost_vdpa, listener);
|
||||
hwaddr iova;
|
||||
Int128 llend, llsize;
|
||||
@ -212,13 +213,13 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
||||
|
||||
llsize = int128_sub(llend, int128_make64(iova));
|
||||
if (v->shadow_vqs_enabled) {
|
||||
DMAMap mem_region = {
|
||||
.translated_addr = (hwaddr)(uintptr_t)vaddr,
|
||||
.size = int128_get64(llsize) - 1,
|
||||
.perm = IOMMU_ACCESS_FLAG(true, section->readonly),
|
||||
};
|
||||
int r;
|
||||
|
||||
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)) {
|
||||
error_report("Can't allocate a mapping (%d)", r);
|
||||
goto fail;
|
||||
@ -232,11 +233,16 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
|
||||
vaddr, section->readonly);
|
||||
if (ret) {
|
||||
error_report("vhost vdpa map fail!");
|
||||
goto fail;
|
||||
goto fail_map;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
fail_map:
|
||||
if (v->shadow_vqs_enabled) {
|
||||
vhost_iova_tree_remove(v->iova_tree, &mem_region);
|
||||
}
|
||||
|
||||
fail:
|
||||
/*
|
||||
* On the initfn path, store the first error in the container so we
|
||||
|
Loading…
Reference in New Issue
Block a user