On Tue, Aug 23, 2022 at 8:40 AM Jason Wang <jasow...@redhat.com> wrote: > > > 在 2022/8/20 00:53, Eugenio Pérez 写道: > > Reduce code duplication. > > > > Signed-off-by: Eugenio Pérez <epere...@redhat.com> > > > Acked-by: Jason Wang <jasow...@redhat.com> > > (In the future, we need to look for other cases where a function may use > only a partial of DMAMap.) >
Do you have a use case in mind? The IOVA tree also trusts the memory listener will unmap and map chunks symmetrically. Thanks! > Thanks > > > > --- > > hw/virtio/vhost-vdpa.c | 17 ++++++++--------- > > 1 file changed, 8 insertions(+), 9 deletions(-) > > > > diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c > > index 07d00f5284..45d6e86b45 100644 > > --- a/hw/virtio/vhost-vdpa.c > > +++ b/hw/virtio/vhost-vdpa.c > > @@ -884,10 +884,12 @@ static int vhost_vdpa_svq_set_fds(struct vhost_dev > > *dev, > > /** > > * Unmap a SVQ area in the device > > */ > > -static void vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, > > - const DMAMap *needle) > > +static void vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, hwaddr addr) > > { > > - const DMAMap *result = vhost_iova_tree_find_iova(v->iova_tree, needle); > > + const DMAMap needle = { > > + .translated_addr = addr, > > + }; > > + const DMAMap *result = vhost_iova_tree_find_iova(v->iova_tree, > > &needle); > > hwaddr size; > > int r; > > > > @@ -908,17 +910,14 @@ static void vhost_vdpa_svq_unmap_ring(struct > > vhost_vdpa *v, > > static void vhost_vdpa_svq_unmap_rings(struct vhost_dev *dev, > > const VhostShadowVirtqueue *svq) > > { > > - DMAMap needle = {}; > > struct vhost_vdpa *v = dev->opaque; > > struct vhost_vring_addr svq_addr; > > > > vhost_svq_get_vring_addr(svq, &svq_addr); > > > > - needle.translated_addr = svq_addr.desc_user_addr; > > - vhost_vdpa_svq_unmap_ring(v, &needle); > > + vhost_vdpa_svq_unmap_ring(v, svq_addr.desc_user_addr); > > > > - needle.translated_addr = svq_addr.used_user_addr; > > - vhost_vdpa_svq_unmap_ring(v, &needle); > > + vhost_vdpa_svq_unmap_ring(v, svq_addr.used_user_addr); > > } > > > > /** > > @@ -996,7 +995,7 @@ static bool vhost_vdpa_svq_map_rings(struct vhost_dev > > *dev, > > ok = vhost_vdpa_svq_map_ring(v, &device_region, errp); > > if (unlikely(!ok)) { > > error_prepend(errp, "Cannot create vq device region: "); > > - vhost_vdpa_svq_unmap_ring(v, &driver_region); > > + vhost_vdpa_svq_unmap_ring(v, driver_region.translated_addr); > > } > > addr->used_user_addr = device_region.iova; > > >