summaryrefslogtreecommitdiffstats
path: root/drivers/vdpa/vdpa_user
diff options
context:
space:
mode:
authorJohn Garry <john.garry@huawei.com>2022-02-03 17:59:20 +0800
committerJoerg Roedel <jroedel@suse.de>2022-02-14 15:43:15 +0100
commit32e92d9f6f876721cc4f565f8369d542b6266380 (patch)
tree5bff28207f3a1b6108f3791914d8f2212d37f017 /drivers/vdpa/vdpa_user
parent114a6f5015df8eda0cf37302914cb15a3da3f086 (diff)
downloadlinux-stable-32e92d9f6f876721cc4f565f8369d542b6266380.tar.gz
linux-stable-32e92d9f6f876721cc4f565f8369d542b6266380.tar.bz2
linux-stable-32e92d9f6f876721cc4f565f8369d542b6266380.zip
iommu/iova: Separate out rcache init
Currently the rcache structures are allocated for all IOVA domains, even if they do not use "fast" alloc+free interface. This is wasteful of memory. In addition, fails in init_iova_rcaches() are not handled safely, which is less than ideal. Make "fast" users call a separate rcache init explicitly, which includes error checking. Signed-off-by: John Garry <john.garry@huawei.com> Reviewed-by: Robin Murphy <robin.murphy@arm.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Link: https://lore.kernel.org/r/1643882360-241739-1-git-send-email-john.garry@huawei.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/vdpa/vdpa_user')
-rw-r--r--drivers/vdpa/vdpa_user/iova_domain.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_user/iova_domain.c
index 2b1143f11d8f..22f7d43f8a68 100644
--- a/drivers/vdpa/vdpa_user/iova_domain.c
+++ b/drivers/vdpa/vdpa_user/iova_domain.c
@@ -480,6 +480,7 @@ vduse_domain_create(unsigned long iova_limit, size_t bounce_size)
struct file *file;
struct vduse_bounce_map *map;
unsigned long pfn, bounce_pfns;
+ int ret;
bounce_pfns = PAGE_ALIGN(bounce_size) >> PAGE_SHIFT;
if (iova_limit <= bounce_size)
@@ -513,10 +514,20 @@ vduse_domain_create(unsigned long iova_limit, size_t bounce_size)
spin_lock_init(&domain->iotlb_lock);
init_iova_domain(&domain->stream_iovad,
PAGE_SIZE, IOVA_START_PFN);
+ ret = iova_domain_init_rcaches(&domain->stream_iovad);
+ if (ret)
+ goto err_iovad_stream;
init_iova_domain(&domain->consistent_iovad,
PAGE_SIZE, bounce_pfns);
+ ret = iova_domain_init_rcaches(&domain->consistent_iovad);
+ if (ret)
+ goto err_iovad_consistent;
return domain;
+err_iovad_consistent:
+ put_iova_domain(&domain->stream_iovad);
+err_iovad_stream:
+ fput(file);
err_file:
vfree(domain->bounce_maps);
err_map: