mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 13:59:45 -04:00
iommufd/fault: Remove iommufd_fault_domain_attach/detach/replace_dev()
There are new attach/detach/replace helpers in device.c taking care of both the attach_handle and the fault specific routines for iopf_enable/disable() and auto response. Clean up these redundant functions in the fault.c file. Link: https://patch.msgid.link/r/3ca94625e9d78270d9a715fa0809414fddd57e58.1738645017.git.nicolinc@nvidia.com Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Reviewed-by: Yi Liu <yi.l.liu@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
committed by
Jason Gunthorpe
parent
fb21b1568a
commit
dc10ba25d4
@@ -60,44 +60,6 @@ void iommufd_fault_iopf_disable(struct iommufd_device *idev)
|
||||
mutex_unlock(&idev->iopf_lock);
|
||||
}
|
||||
|
||||
static int __fault_domain_attach_dev(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_device *idev)
|
||||
{
|
||||
struct iommufd_attach_handle *handle;
|
||||
int ret;
|
||||
|
||||
handle = kzalloc(sizeof(*handle), GFP_KERNEL);
|
||||
if (!handle)
|
||||
return -ENOMEM;
|
||||
|
||||
handle->idev = idev;
|
||||
ret = iommu_attach_group_handle(hwpt->domain, idev->igroup->group,
|
||||
&handle->handle);
|
||||
if (ret)
|
||||
kfree(handle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iommufd_fault_domain_attach_dev(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_device *idev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!hwpt->fault)
|
||||
return -EINVAL;
|
||||
|
||||
ret = iommufd_fault_iopf_enable(idev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = __fault_domain_attach_dev(hwpt, idev);
|
||||
if (ret)
|
||||
iommufd_fault_iopf_disable(idev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void iommufd_auto_response_faults(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_attach_handle *handle)
|
||||
{
|
||||
@@ -135,88 +97,6 @@ void iommufd_auto_response_faults(struct iommufd_hw_pagetable *hwpt,
|
||||
mutex_unlock(&fault->mutex);
|
||||
}
|
||||
|
||||
static struct iommufd_attach_handle *
|
||||
iommufd_device_get_attach_handle(struct iommufd_device *idev)
|
||||
{
|
||||
struct iommu_attach_handle *handle;
|
||||
|
||||
handle = iommu_attach_handle_get(idev->igroup->group, IOMMU_NO_PASID, 0);
|
||||
if (IS_ERR(handle))
|
||||
return NULL;
|
||||
|
||||
return to_iommufd_handle(handle);
|
||||
}
|
||||
|
||||
void iommufd_fault_domain_detach_dev(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_device *idev)
|
||||
{
|
||||
struct iommufd_attach_handle *handle;
|
||||
|
||||
handle = iommufd_device_get_attach_handle(idev);
|
||||
iommu_detach_group_handle(hwpt->domain, idev->igroup->group);
|
||||
iommufd_auto_response_faults(hwpt, handle);
|
||||
iommufd_fault_iopf_disable(idev);
|
||||
kfree(handle);
|
||||
}
|
||||
|
||||
static int __fault_domain_replace_dev(struct iommufd_device *idev,
|
||||
struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_hw_pagetable *old)
|
||||
{
|
||||
struct iommufd_attach_handle *handle, *curr = NULL;
|
||||
int ret;
|
||||
|
||||
if (old->fault)
|
||||
curr = iommufd_device_get_attach_handle(idev);
|
||||
|
||||
if (hwpt->fault) {
|
||||
handle = kzalloc(sizeof(*handle), GFP_KERNEL);
|
||||
if (!handle)
|
||||
return -ENOMEM;
|
||||
|
||||
handle->idev = idev;
|
||||
ret = iommu_replace_group_handle(idev->igroup->group,
|
||||
hwpt->domain, &handle->handle);
|
||||
} else {
|
||||
ret = iommu_replace_group_handle(idev->igroup->group,
|
||||
hwpt->domain, NULL);
|
||||
}
|
||||
|
||||
if (!ret && curr) {
|
||||
iommufd_auto_response_faults(old, curr);
|
||||
kfree(curr);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iommufd_fault_domain_replace_dev(struct iommufd_device *idev,
|
||||
struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_hw_pagetable *old)
|
||||
{
|
||||
bool iopf_off = !hwpt->fault && old->fault;
|
||||
bool iopf_on = hwpt->fault && !old->fault;
|
||||
int ret;
|
||||
|
||||
if (iopf_on) {
|
||||
ret = iommufd_fault_iopf_enable(idev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = __fault_domain_replace_dev(idev, hwpt, old);
|
||||
if (ret) {
|
||||
if (iopf_on)
|
||||
iommufd_fault_iopf_disable(idev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (iopf_off)
|
||||
iommufd_fault_iopf_disable(idev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void iommufd_fault_destroy(struct iommufd_object *obj)
|
||||
{
|
||||
struct iommufd_fault *fault = container_of(obj, struct iommufd_fault, obj);
|
||||
|
||||
@@ -496,14 +496,6 @@ int iommufd_fault_alloc(struct iommufd_ucmd *ucmd);
|
||||
void iommufd_fault_destroy(struct iommufd_object *obj);
|
||||
int iommufd_fault_iopf_handler(struct iopf_group *group);
|
||||
|
||||
int iommufd_fault_domain_attach_dev(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_device *idev);
|
||||
void iommufd_fault_domain_detach_dev(struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_device *idev);
|
||||
int iommufd_fault_domain_replace_dev(struct iommufd_device *idev,
|
||||
struct iommufd_hw_pagetable *hwpt,
|
||||
struct iommufd_hw_pagetable *old);
|
||||
|
||||
int iommufd_fault_iopf_enable(struct iommufd_device *idev);
|
||||
void iommufd_fault_iopf_disable(struct iommufd_device *idev);
|
||||
void iommufd_auto_response_faults(struct iommufd_hw_pagetable *hwpt,
|
||||
|
||||
Reference in New Issue
Block a user