85 lines
4.1 KiB
Diff
85 lines
4.1 KiB
Diff
|
|
From 2be28f75e4ed2a0a35549dd1a545e0655e63973d Mon Sep 17 00:00:00 2001
|
||
|
|
From: Nicolin Chen <nicolinc@nvidia.com>
|
||
|
|
Date: Fri, 12 Apr 2024 23:27:54 +0000
|
||
|
|
Subject: [PATCH] backends/iommufd: Introduce iommufd_viommu_invalidate_cache
|
||
|
|
|
||
|
|
Similar to iommufd_backend_invalidate_cache for iotlb invalidation via
|
||
|
|
IOMMU_HWPT_INVALIDATE ioctl, add a new helper for viommu specific cache
|
||
|
|
invalidation via IOMMU_VIOMMU_INVALIDATE ioctl.
|
||
|
|
|
||
|
|
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
|
||
|
|
---
|
||
|
|
backends/iommufd.c | 31 +++++++++++++++++++++++++++++++
|
||
|
|
backends/trace-events | 1 +
|
||
|
|
include/sysemu/iommufd.h | 3 +++
|
||
|
|
3 files changed, 35 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/backends/iommufd.c b/backends/iommufd.c
|
||
|
|
index af3376d0bf..ee6f5bcf65 100644
|
||
|
|
--- a/backends/iommufd.c
|
||
|
|
+++ b/backends/iommufd.c
|
||
|
|
@@ -426,6 +426,37 @@ struct IOMMUFDVdev *iommufd_backend_alloc_vdev(HostIOMMUDeviceIOMMUFD *idev,
|
||
|
|
return vdev;
|
||
|
|
}
|
||
|
|
|
||
|
|
+int iommufd_viommu_invalidate_cache(IOMMUFDBackend *be, uint32_t viommu_id,
|
||
|
|
+ uint32_t data_type, uint32_t entry_len,
|
||
|
|
+ uint32_t *entry_num, void *data_ptr)
|
||
|
|
+{
|
||
|
|
+ int ret, fd = be->fd;
|
||
|
|
+ struct iommu_hwpt_invalidate cache = {
|
||
|
|
+ .size = sizeof(cache),
|
||
|
|
+ .hwpt_id = viommu_id,
|
||
|
|
+ .data_type = data_type,
|
||
|
|
+ .entry_len = entry_len,
|
||
|
|
+ .entry_num = *entry_num,
|
||
|
|
+ .data_uptr = (uint64_t)data_ptr,
|
||
|
|
+ };
|
||
|
|
+
|
||
|
|
+ ret = ioctl(fd, IOMMU_HWPT_INVALIDATE, &cache);
|
||
|
|
+
|
||
|
|
+ trace_iommufd_viommu_invalidate_cache(fd, viommu_id, data_type,
|
||
|
|
+ entry_len, *entry_num,
|
||
|
|
+ cache.entry_num,
|
||
|
|
+ (uint64_t)data_ptr, ret);
|
||
|
|
+ if (ret) {
|
||
|
|
+ *entry_num = cache.entry_num;
|
||
|
|
+ error_report("IOMMU_VIOMMU_INVALIDATE failed: %s", strerror(errno));
|
||
|
|
+ ret = -errno;
|
||
|
|
+ } else {
|
||
|
|
+ g_assert(*entry_num == cache.entry_num);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return ret;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
bool host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
|
||
|
|
uint32_t hwpt_id, Error **errp)
|
||
|
|
{
|
||
|
|
diff --git a/backends/trace-events b/backends/trace-events
|
||
|
|
index e150a37e9a..f8592a2711 100644
|
||
|
|
--- a/backends/trace-events
|
||
|
|
+++ b/backends/trace-events
|
||
|
|
@@ -21,3 +21,4 @@ iommufd_backend_get_dirty_bitmap(int iommufd, uint32_t hwpt_id, uint64_t iova, u
|
||
|
|
iommufd_backend_invalidate_cache(int iommufd, uint32_t hwpt_id, uint32_t data_type, uint32_t entry_len, uint32_t entry_num, uint32_t done_num, uint64_t data_ptr, int ret) " iommufd=%d hwpt_id=%u data_type=%u entry_len=%u entry_num=%u done_num=%u data_ptr=0x%"PRIx64" (%d)"
|
||
|
|
iommufd_backend_alloc_viommu(int iommufd, uint32_t type, uint32_t dev_id, uint32_t hwpt_id, uint32_t viommu_id, int ret) " iommufd=%d type=%u dev_id=%u hwpt_id=%u viommu_id=%u (%d)"
|
||
|
|
iommufd_backend_alloc_vdev(int iommufd, uint32_t dev_id, uint32_t viommu_id, uint64_t virt_id, uint32_t vdev_id, int ret) " iommufd=%d dev_id=%u viommu_id=%u virt_id=0x%"PRIx64" vdev_id=%u (%d)"
|
||
|
|
+iommufd_viommu_invalidate_cache(int iommufd, uint32_t viommu_id, uint32_t data_type, uint32_t entry_len, uint32_t entry_num, uint32_t done_num, uint64_t data_ptr, int ret) " iommufd=%d viommu_id=%u data_type=%u entry_len=%u entry_num=%u done_num=%u data_ptr=0x%"PRIx64" (%d)"
|
||
|
|
diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h
|
||
|
|
index 0284e95460..0f2c826036 100644
|
||
|
|
--- a/include/sysemu/iommufd.h
|
||
|
|
+++ b/include/sysemu/iommufd.h
|
||
|
|
@@ -76,6 +76,9 @@ struct IOMMUFDViommu *iommufd_backend_alloc_viommu(IOMMUFDBackend *be,
|
||
|
|
uint32_t dev_id,
|
||
|
|
uint32_t viommu_type,
|
||
|
|
uint32_t hwpt_id);
|
||
|
|
+int iommufd_viommu_invalidate_cache(IOMMUFDBackend *be, uint32_t viommu_id,
|
||
|
|
+ uint32_t data_type, uint32_t entry_len,
|
||
|
|
+ uint32_t *entry_num, void *data_ptr);
|
||
|
|
|
||
|
|
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
|
||
|
|
OBJECT_DECLARE_TYPE(HostIOMMUDeviceIOMMUFD, HostIOMMUDeviceIOMMUFDClass,
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|