[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [PATCH V3 28/42] backends/iommufd: iommufd_backend_map_file_dma
From: |
Duan, Zhenzhong |
Subject: |
RE: [PATCH V3 28/42] backends/iommufd: iommufd_backend_map_file_dma |
Date: |
Fri, 16 May 2025 08:26:30 +0000 |
>-----Original Message-----
>From: Steve Sistare <steven.sistare@oracle.com>
>Subject: [PATCH V3 28/42] backends/iommufd:
>iommufd_backend_map_file_dma
>
>Define iommufd_backend_map_file_dma to implement IOMMU_IOAS_MAP_FILE.
>This will be called as a substitute for iommufd_backend_map_dma, so
>the error conditions for BARs are copied as-is from that function.
>
>Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>---
> backends/iommufd.c | 36 ++++++++++++++++++++++++++++++++++++
> backends/trace-events | 1 +
> include/system/iommufd.h | 3 +++
> 3 files changed, 40 insertions(+)
>
>diff --git a/backends/iommufd.c b/backends/iommufd.c
>index b73f75c..5c1958f 100644
>--- a/backends/iommufd.c
>+++ b/backends/iommufd.c
>@@ -172,6 +172,42 @@ int iommufd_backend_map_dma(IOMMUFDBackend
>*be, uint32_t ioas_id, hwaddr iova,
> return ret;
> }
>
>+int iommufd_backend_map_file_dma(IOMMUFDBackend *be, uint32_t ioas_id,
>+ hwaddr iova, ram_addr_t size,
>+ int mfd, unsigned long start, bool readonly)
>+{
>+ int ret, fd = be->fd;
>+ struct iommu_ioas_map_file map = {
>+ .size = sizeof(map),
>+ .flags = IOMMU_IOAS_MAP_READABLE |
>+ IOMMU_IOAS_MAP_FIXED_IOVA,
>+ .ioas_id = ioas_id,
>+ .fd = mfd,
>+ .start = start,
>+ .iova = iova,
>+ .length = size,
>+ };
>+
>+ if (!readonly) {
>+ map.flags |= IOMMU_IOAS_MAP_WRITEABLE;
>+ }
>+
>+ ret = ioctl(fd, IOMMU_IOAS_MAP_FILE, &map);
>+ trace_iommufd_backend_map_file_dma(fd, ioas_id, iova, size, mfd, start,
>+ readonly, ret);
>+ if (ret) {
>+ ret = -errno;
>+
>+ /* TODO: Not support mapping hardware PCI BAR region for now. */
>+ if (errno == EFAULT) {
>+ warn_report("IOMMU_IOAS_MAP_FILE failed: %m, PCI BAR?");
>+ } else {
>+ error_report("IOMMU_IOAS_MAP_FILE failed: %m");
No need to print error here as caller does the same thing.
>+ }
>+ }
>+ return ret;
>+}
>+
> int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
> hwaddr iova, ram_addr_t size)
> {
>diff --git a/backends/trace-events b/backends/trace-events
>index 40811a3..f478e18 100644
>--- a/backends/trace-events
>+++ b/backends/trace-events
>@@ -11,6 +11,7 @@ iommufd_backend_connect(int fd, bool owned, uint32_t
>users) "fd=%d owned=%d user
> iommufd_backend_disconnect(int fd, uint32_t users) "fd=%d users=%d"
> iommu_backend_set_fd(int fd) "pre-opened /dev/iommu fd=%d"
> iommufd_backend_map_dma(int iommufd, uint32_t ioas, uint64_t iova, uint64_t
>size, void *vaddr, bool readonly, int ret) " iommufd=%d ioas=%d
>iova=0x%"PRIx64" size=0x%"PRIx64" addr=%p readonly=%d (%d)"
>+iommufd_backend_map_file_dma(int iommufd, uint32_t ioas, uint64_t iova,
>uint64_t size, int fd, unsigned long start, bool readonly, int ret) "
>iommufd=%d
>ioas=%d iova=0x%"PRIx64" size=0x%"PRIx64" fd=%d start=%ld readonly=%d
>(%d)"
> iommufd_backend_unmap_dma_non_exist(int iommufd, uint32_t ioas, uint64_t
>iova, uint64_t size, int ret) " Unmap nonexistent mapping: iommufd=%d ioas=%d
>iova=0x%"PRIx64" size=0x%"PRIx64" (%d)"
> iommufd_backend_unmap_dma(int iommufd, uint32_t ioas, uint64_t iova,
>uint64_t size, int ret) " iommufd=%d ioas=%d iova=0x%"PRIx64"
>size=0x%"PRIx64" (%d)"
> iommufd_backend_alloc_ioas(int iommufd, uint32_t ioas) " iommufd=%d
>ioas=%d"
>diff --git a/include/system/iommufd.h b/include/system/iommufd.h
>index cbab75b..ac700b8 100644
>--- a/include/system/iommufd.h
>+++ b/include/system/iommufd.h
>@@ -43,6 +43,9 @@ void iommufd_backend_disconnect(IOMMUFDBackend
>*be);
> bool iommufd_backend_alloc_ioas(IOMMUFDBackend *be, uint32_t *ioas_id,
> Error **errp);
> void iommufd_backend_free_id(IOMMUFDBackend *be, uint32_t id);
>+int iommufd_backend_map_file_dma(IOMMUFDBackend *be, uint32_t ioas_id,
>+ hwaddr iova, ram_addr_t size, int fd,
>+ unsigned long start, bool readonly);
> int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id,
>hwaddr iova,
> ram_addr_t size, void *vaddr, bool readonly);
> int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
>--
>1.8.3.1
[PATCH V3 28/42] backends/iommufd: iommufd_backend_map_file_dma, Steve Sistare, 2025/05/12
- RE: [PATCH V3 28/42] backends/iommufd: iommufd_backend_map_file_dma,
Duan, Zhenzhong <=
[PATCH V3 23/42] vfio-pci: preserve INTx, Steve Sistare, 2025/05/12
[PATCH V3 37/42] vfio/iommufd: reconstruct device, Steve Sistare, 2025/05/12
[PATCH V3 38/42] vfio/iommufd: reconstruct hw_caps, Steve Sistare, 2025/05/12
[PATCH V3 29/42] backends/iommufd: change process ioctl, Steve Sistare, 2025/05/12
[PATCH V3 24/42] migration: close kvm after cpr, Steve Sistare, 2025/05/12