Messages in this thread Patch in this message | | | From | Suravee Suthikulpanit <> | Subject | [PATCH 3/4] iommu: Introduce IOMMU call-back for processing struct KVM assigned to VFIO | Date | Tue, 10 Jan 2023 08:31:36 -0600 |
| |
Currently, VFIO provide an kvm_vfio_file_set_kvm() interface for assigning a KVM structure to a VFIO group. The information in struct KVM is also useful for IOMMU drivers when setting up VFIO domain.
Introduce struct iommu_domain_ops.set_kvm call-back function to allow IOMMU drivers to provide call-back to process the struct KVM assigned.
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> --- drivers/iommu/iommu.c | 10 ++++++++++ drivers/vfio/vfio_main.c | 1 + include/linux/iommu.h | 4 ++++ 3 files changed, 15 insertions(+)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 65a3b3d886dc..5116d5fe35f2 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -3231,3 +3231,13 @@ bool iommu_group_dma_owner_claimed(struct iommu_group *group) return user; } EXPORT_SYMBOL_GPL(iommu_group_dma_owner_claimed); + +void iommu_set_kvm(struct iommu_group *group, struct kvm *kvm) +{ + if (!group || !group->domain || !group->domain->ops) + return; + + if (group->domain->ops->set_kvm) + group->domain->ops->set_kvm(group->domain, kvm); +} +EXPORT_SYMBOL_GPL(iommu_set_kvm); diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 2d168793d4e1..7641e3a0c986 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -1652,6 +1652,7 @@ void vfio_file_set_kvm(struct file *file, struct kvm *kvm) mutex_lock(&group->group_lock); group->kvm = kvm; + iommu_set_kvm(group->iommu_group, kvm); mutex_unlock(&group->group_lock); } EXPORT_SYMBOL_GPL(vfio_file_set_kvm); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 3c9da1f8979e..43000231d3d7 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -42,6 +42,7 @@ struct notifier_block; struct iommu_sva; struct iommu_fault_event; struct iommu_dma_cookie; +struct kvm; /* iommu fault flags */ #define IOMMU_FAULT_READ 0x0 @@ -314,6 +315,8 @@ struct iommu_domain_ops { unsigned long quirks); void (*free)(struct iommu_domain *domain); + + void (*set_kvm)(struct iommu_domain *domain, struct kvm *kvm); }; /** @@ -391,6 +394,7 @@ void iommu_device_sysfs_remove(struct iommu_device *iommu); int iommu_device_link(struct iommu_device *iommu, struct device *link); void iommu_device_unlink(struct iommu_device *iommu, struct device *link); int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain); +void iommu_set_kvm(struct iommu_group *group, struct kvm *kvm); static inline struct iommu_device *dev_to_iommu_device(struct device *dev) { -- 2.32.0
| |