Skip to content

Commit

Permalink
vdpa: Fix memory listener deletions of iova tree
Browse files Browse the repository at this point in the history
vhost_vdpa_listener_region_del is always deleting the first iova entry
of the tree, since it's using the needle iova instead of the result's
one.

This was detected using a vga virtual device in the VM using vdpa SVQ.
It makes some extra memory adding and deleting, so the wrong one was
mapped / unmapped. This was undetected before since all the memory was
mappend and unmapped totally without that device, but other conditions
could trigger it too:

* mem_region was with .iova = 0, .translated_addr = (correct GPA).
* iova_tree_find_iova returned right result, but does not update
  mem_region.
* iova_tree_remove always removed region with .iova = 0. Right iova were
  sent to the device.
* Next map will fill the first region with .iova = 0, causing a mapping
  with the same iova and device complains, if the next action is a map.
* Next unmap will cause to try to unmap again iova = 0, causing the
  device to complain that no region was mapped at iova = 0.

Fixes: 34e3c94 ("vdpa: Add custom IOTLB translations to SVQ")
Reported-by: Lei Yang <[email protected]>
Signed-off-by: Eugenio Pérez <[email protected]>
Signed-off-by: Jason Wang <[email protected]>
  • Loading branch information
eugpermar authored and jasowang committed Jul 26, 2022
1 parent 2fdac34 commit 75a8ce6
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion hw/virtio/vhost-vdpa.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,

result = vhost_iova_tree_find_iova(v->iova_tree, &mem_region);
iova = result->iova;
vhost_iova_tree_remove(v->iova_tree, &mem_region);
vhost_iova_tree_remove(v->iova_tree, result);
}
vhost_vdpa_iotlb_batch_begin_once(v);
ret = vhost_vdpa_dma_unmap(v, iova, int128_get64(llsize));
Expand Down

0 comments on commit 75a8ce6

Please sign in to comment.