Commit 7061b6af authored by Jean-Philippe Brucker's avatar Jean-Philippe Brucker Committed by Joerg Roedel
Browse files

iommu/virtio: Return size mapped for a detached domain



When map() is called on a detached domain, the domain does not exist in
the device so we do not send a MAP request, but we do update the
internal mapping tree, to be replayed on the next attach. Since this
constitutes a successful iommu_map() call, return *mapped in this case
too.

Fixes: 7e62edd7 ("iommu/virtio: Add map/unmap_pages() callbacks implementation")
Signed-off-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20230515113946.1017624-3-jean-philippe@linaro.org


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 809d0810
Loading
Loading
Loading
Loading
+17 −16
Original line number Diff line number Diff line
@@ -833,6 +833,7 @@ static int viommu_map_pages(struct iommu_domain *domain, unsigned long iova,
	if (ret)
		return ret;

	if (vdomain->nr_endpoints) {
		map = (struct virtio_iommu_req_map) {
			.head.type	= VIRTIO_IOMMU_T_MAP,
			.domain		= cpu_to_le32(vdomain->id),
@@ -842,16 +843,16 @@ static int viommu_map_pages(struct iommu_domain *domain, unsigned long iova,
			.flags		= cpu_to_le32(flags),
		};

	if (!vdomain->nr_endpoints)
		return 0;

		ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map));
	if (ret)
		if (ret) {
			viommu_del_mappings(vdomain, iova, end);
	else if (mapped)
			return ret;
		}
	}
	if (mapped)
		*mapped = size;

	return ret;
	return 0;
}

static size_t viommu_unmap_pages(struct iommu_domain *domain, unsigned long iova,