On Thursday, March 5, 2020 11:29:33 AM -03 David Hildenbrand wrote: > Factor it out and properly use it where applicable. Make > qemu_vfio_undo_mapping() look like qemu_vfio_do_mapping(), passing the > size and iova, not the mapping. > > Reviewed-by: Peter Xu <[email protected]> > Cc: Richard Henderson <[email protected]> > Cc: Paolo Bonzini <[email protected]> > Cc: Eduardo Habkost <[email protected]> > Cc: Marcel Apfelbaum <[email protected]> > Cc: Alex Williamson <[email protected]> > Cc: Stefan Hajnoczi <[email protected]> > Signed-off-by: David Hildenbrand <[email protected]> > ---
Acked-by: Murilo Opsfelder Araujo <[email protected]> > util/vfio-helpers.c | 43 +++++++++++++++++++++++++++---------------- > 1 file changed, 27 insertions(+), 16 deletions(-) > > diff --git a/util/vfio-helpers.c b/util/vfio-helpers.c > index 7085ca702c..f0c77f0d69 100644 > --- a/util/vfio-helpers.c > +++ b/util/vfio-helpers.c > @@ -518,6 +518,20 @@ static IOVAMapping *qemu_vfio_add_mapping(QEMUVFIOState > *s, return insert; > } > > +/** > + * Remove the mapping from @s and free it. > + */ > +static void qemu_vfio_remove_mapping(QEMUVFIOState *s, IOVAMapping > *mapping) +{ > + const int index = mapping - s->mappings; > + > + assert(index >= 0 && index < s->nr_mappings); > + memmove(mapping, &s->mappings[index + 1], > + sizeof(s->mappings[0]) * (s->nr_mappings - index - 1)); > + s->nr_mappings--; > + s->mappings = g_renew(IOVAMapping, s->mappings, s->nr_mappings); > +} > + > /* Do the DMA mapping with VFIO. */ > static int qemu_vfio_do_mapping(QEMUVFIOState *s, void *host, size_t size, > uint64_t iova) > @@ -539,29 +553,22 @@ static int qemu_vfio_do_mapping(QEMUVFIOState *s, void > *host, size_t size, } > > /** > - * Undo the DMA mapping from @s with VFIO, and remove from mapping list. > + * Undo the DMA mapping from @s with VFIO. > */ > -static void qemu_vfio_undo_mapping(QEMUVFIOState *s, IOVAMapping *mapping) > +static void qemu_vfio_undo_mapping(QEMUVFIOState *s, size_t size, uint64_t > iova) { > - int index; > struct vfio_iommu_type1_dma_unmap unmap = { > .argsz = sizeof(unmap), > .flags = 0, > - .iova = mapping->iova, > - .size = mapping->size, > + .iova = iova, > + .size = size, > }; > > - index = mapping - s->mappings; > - assert(mapping->size > 0); > - assert(QEMU_IS_ALIGNED(mapping->size, qemu_real_host_page_size)); > - assert(index >= 0 && index < s->nr_mappings); > + assert(size > 0); > + assert(QEMU_IS_ALIGNED(size, qemu_real_host_page_size)); > if (ioctl(s->container, VFIO_IOMMU_UNMAP_DMA, &unmap)) { > error_report("VFIO_UNMAP_DMA failed: %s", strerror(errno)); > } > - memmove(mapping, &s->mappings[index + 1], > - sizeof(s->mappings[0]) * (s->nr_mappings - index - 1)); > - s->nr_mappings--; > - s->mappings = g_renew(IOVAMapping, s->mappings, s->nr_mappings); > } > > /* Check if the mapping list is (ascending) ordered. */ > @@ -621,7 +628,7 @@ int qemu_vfio_dma_map(QEMUVFIOState *s, void *host, > size_t size, assert(qemu_vfio_verify_mappings(s)); > ret = qemu_vfio_do_mapping(s, host, size, iova0); > if (ret) { > - qemu_vfio_undo_mapping(s, mapping); > + qemu_vfio_remove_mapping(s, mapping); > goto out; > } > s->low_water_mark += size; > @@ -681,7 +688,8 @@ void qemu_vfio_dma_unmap(QEMUVFIOState *s, void *host) > if (!m) { > goto out; > } > - qemu_vfio_undo_mapping(s, m); > + qemu_vfio_undo_mapping(s, m->size, m->iova); > + qemu_vfio_remove_mapping(s, m); > out: > qemu_mutex_unlock(&s->lock); > } > @@ -698,7 +706,10 @@ void qemu_vfio_close(QEMUVFIOState *s) > return; > } > while (s->nr_mappings) { > - qemu_vfio_undo_mapping(s, &s->mappings[s->nr_mappings - 1]); > + IOVAMapping *m = &s->mappings[s->nr_mappings - 1]; > + > + qemu_vfio_undo_mapping(s, m->size, m->iova); > + qemu_vfio_remove_mapping(s, m); > } > ram_block_notifier_remove(&s->ram_notifier); > qemu_vfio_reset(s); -- Murilo
