diff options
Diffstat (limited to 'drivers/iommu/iommu.c')
| -rw-r--r-- | drivers/iommu/iommu.c | 21 | 
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index fbe9ca734f8..e5555fcfe70 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -29,6 +29,7 @@  #include <linux/idr.h>  #include <linux/notifier.h>  #include <linux/err.h> +#include <trace/events/iommu.h>  static struct kset *iommu_group_kset;  static struct ida iommu_group_ida; @@ -363,6 +364,8 @@ rename:  	/* Notify any listeners about change to group. */  	blocking_notifier_call_chain(&group->notifier,  				     IOMMU_GROUP_NOTIFY_ADD_DEVICE, dev); + +	trace_add_device_to_group(group->id, dev);  	return 0;  }  EXPORT_SYMBOL_GPL(iommu_group_add_device); @@ -399,6 +402,8 @@ void iommu_group_remove_device(struct device *dev)  	sysfs_remove_link(group->devices_kobj, device->name);  	sysfs_remove_link(&dev->kobj, "iommu_group"); +	trace_remove_device_from_group(group->id, dev); +  	kfree(device->name);  	kfree(device);  	dev->iommu_group = NULL; @@ -680,10 +685,14 @@ EXPORT_SYMBOL_GPL(iommu_domain_free);  int iommu_attach_device(struct iommu_domain *domain, struct device *dev)  { +	int ret;  	if (unlikely(domain->ops->attach_dev == NULL))  		return -ENODEV; -	return domain->ops->attach_dev(domain, dev); +	ret = domain->ops->attach_dev(domain, dev); +	if (!ret) +		trace_attach_device_to_domain(dev); +	return ret;  }  EXPORT_SYMBOL_GPL(iommu_attach_device); @@ -693,6 +702,7 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev)  		return;  	domain->ops->detach_dev(domain, dev); +	trace_detach_device_from_domain(dev);  }  EXPORT_SYMBOL_GPL(iommu_detach_device); @@ -807,17 +817,17 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova,  	 * size of the smallest page supported by the hardware  	 */  	if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) { -		pr_err("unaligned: iova 0x%lx pa 0x%pa size 0x%zx min_pagesz 0x%x\n", +		pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%x\n",  		       iova, &paddr, size, min_pagesz);  		return -EINVAL;  	} -	pr_debug("map: iova 0x%lx pa 0x%pa size 0x%zx\n", iova, &paddr, size); +	pr_debug("map: iova 0x%lx pa %pa size 0x%zx\n", iova, &paddr, size);  	while (size) {  		size_t pgsize = iommu_pgsize(domain, iova | paddr, size); -		pr_debug("mapping: iova 0x%lx pa 0x%pa pgsize 0x%zx\n", +		pr_debug("mapping: iova 0x%lx pa %pa pgsize 0x%zx\n",  			 iova, &paddr, pgsize);  		ret = domain->ops->map(domain, iova, paddr, pgsize, prot); @@ -832,6 +842,8 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova,  	/* unroll mapping in case something went wrong */  	if (ret)  		iommu_unmap(domain, orig_iova, orig_size - size); +	else +		trace_map(iova, paddr, size);  	return ret;  } @@ -880,6 +892,7 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)  		unmapped += unmapped_page;  	} +	trace_unmap(iova, 0, size);  	return unmapped;  }  EXPORT_SYMBOL_GPL(iommu_unmap);  | 
