iommu/virtio: Return size mapped for a detached domain
[ Upstream commit7061b6af34
] 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:7e62edd7a3
("iommu/virtio: Add map/unmap_pages() callbacks implementation") Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/20230515113946.1017624-3-jean-philippe@linaro.org Signed-off-by: Joerg Roedel <jroedel@suse.de> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0f2c11ccfd
commit
2128318c91
|
@ -834,25 +834,26 @@ static int viommu_map_pages(struct iommu_domain *domain, unsigned long iova,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
map = (struct virtio_iommu_req_map) {
|
||||
.head.type = VIRTIO_IOMMU_T_MAP,
|
||||
.domain = cpu_to_le32(vdomain->id),
|
||||
.virt_start = cpu_to_le64(iova),
|
||||
.phys_start = cpu_to_le64(paddr),
|
||||
.virt_end = cpu_to_le64(end),
|
||||
.flags = cpu_to_le32(flags),
|
||||
};
|
||||
if (vdomain->nr_endpoints) {
|
||||
map = (struct virtio_iommu_req_map) {
|
||||
.head.type = VIRTIO_IOMMU_T_MAP,
|
||||
.domain = cpu_to_le32(vdomain->id),
|
||||
.virt_start = cpu_to_le64(iova),
|
||||
.phys_start = cpu_to_le64(paddr),
|
||||
.virt_end = cpu_to_le64(end),
|
||||
.flags = cpu_to_le32(flags),
|
||||
};
|
||||
|
||||
if (!vdomain->nr_endpoints)
|
||||
return 0;
|
||||
|
||||
ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map));
|
||||
if (ret)
|
||||
viommu_del_mappings(vdomain, iova, end);
|
||||
else if (mapped)
|
||||
ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map));
|
||||
if (ret) {
|
||||
viommu_del_mappings(vdomain, iova, end);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
if (mapped)
|
||||
*mapped = size;
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t viommu_unmap_pages(struct iommu_domain *domain, unsigned long iova,
|
||||
|
|
Loading…
Reference in New Issue