mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-18 23:52:14 -06: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
1 changed files with 13 additions and 7 deletions
|
@ -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…
Add table
Add a link
Reference in a new issue