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 <pet...@redhat.com>
> Cc: Richard Henderson <r...@twiddle.net>
> Cc: Paolo Bonzini <pbonz...@redhat.com>
> Cc: Eduardo Habkost <ehabk...@redhat.com>
> Cc: Marcel Apfelbaum <marcel.apfelb...@gmail.com>
> Cc: Alex Williamson <alex.william...@redhat.com>
> Cc: Stefan Hajnoczi <stefa...@redhat.com>
> Signed-off-by: David Hildenbrand <da...@redhat.com>
> ---

Acked-by: Murilo Opsfelder Araujo <muri...@linux.ibm.com>

>  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

Reply via email to