Loading drivers/iommu/iommu.c +12 −3 Original line number Diff line number Diff line Loading @@ -1035,9 +1035,12 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, size_t orig_size = size; int ret = 0; trace_map_start(iova, paddr, size); if (unlikely(domain->ops->map == NULL || domain->ops->pgsize_bitmap == 0UL)) domain->ops->pgsize_bitmap == 0UL)) { trace_map_end(iova, paddr, size); return -ENODEV; } /* find out the minimum page size supported */ min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); Loading @@ -1050,6 +1053,7 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) { pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%x\n", iova, &paddr, size, min_pagesz); trace_map_end(iova, paddr, size); return -EINVAL; } Loading Loading @@ -1077,6 +1081,7 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, else trace_map(iova, paddr, size); trace_map_end(iova, paddr, size); return ret; } EXPORT_SYMBOL_GPL(iommu_map); Loading @@ -1086,10 +1091,12 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) size_t unmapped_page, unmapped = 0; unsigned int min_pagesz; trace_unmap_start(iova, 0, size); if (unlikely(domain->ops->unmap == NULL || domain->ops->pgsize_bitmap == 0UL)) domain->ops->pgsize_bitmap == 0UL)) { trace_unmap_end(iova, 0, size); return -ENODEV; } /* find out the minimum page size supported */ min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); Loading @@ -1101,6 +1108,7 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) if (!IS_ALIGNED(iova | size, min_pagesz)) { pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n", iova, size, min_pagesz); trace_unmap_end(iova, 0, size); return -EINVAL; } Loading @@ -1125,6 +1133,7 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) } trace_unmap(iova, 0, size); trace_unmap_end(iova, 0, size); return unmapped; } EXPORT_SYMBOL_GPL(iommu_unmap); Loading include/linux/iommu.h +6 −1 Original line number Diff line number Diff line Loading @@ -262,7 +262,12 @@ static inline size_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, struct scatterlist *sg, unsigned int nents, int prot) { return domain->ops->map_sg(domain, iova, sg, nents, prot); size_t ret; trace_map_sg_start(iova, nents); ret = domain->ops->map_sg(domain, iova, sg, nents, prot); trace_map_sg_end(iova, nents); return ret; } extern int iommu_dma_supported(struct iommu_domain *domain, struct device *dev, Loading include/trace/events/iommu.h +71 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,20 @@ DEFINE_EVENT(iommu_map_unmap, map, TP_ARGS(iova, paddr, size) ); DEFINE_EVENT(iommu_map_unmap, map_start, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size) ); DEFINE_EVENT(iommu_map_unmap, map_end, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), Loading @@ -124,6 +138,63 @@ DEFINE_EVENT_PRINT(iommu_map_unmap, unmap, ) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap_start, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size), TP_printk("IOMMU: iova=0x%016llx size=0x%x", __entry->iova, __entry->size ) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap_end, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size), TP_printk("IOMMU: iova=0x%016llx size=0x%x", __entry->iova, __entry->size ) ); DECLARE_EVENT_CLASS(iommu_map_sg, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents), TP_STRUCT__entry( __field(u64, iova) __field(int, nents) ), TP_fast_assign( __entry->iova = iova; __entry->nents = nents; ), TP_printk("IOMMU: iova=0x%016llx nents=%u", __entry->iova, __entry->nents ) ); DEFINE_EVENT(iommu_map_sg, map_sg_start, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents) ); DEFINE_EVENT(iommu_map_sg, map_sg_end, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents) ); DECLARE_EVENT_CLASS(iommu_error, TP_PROTO(struct device *dev, unsigned long iova, int flags), Loading Loading
drivers/iommu/iommu.c +12 −3 Original line number Diff line number Diff line Loading @@ -1035,9 +1035,12 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, size_t orig_size = size; int ret = 0; trace_map_start(iova, paddr, size); if (unlikely(domain->ops->map == NULL || domain->ops->pgsize_bitmap == 0UL)) domain->ops->pgsize_bitmap == 0UL)) { trace_map_end(iova, paddr, size); return -ENODEV; } /* find out the minimum page size supported */ min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); Loading @@ -1050,6 +1053,7 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) { pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%x\n", iova, &paddr, size, min_pagesz); trace_map_end(iova, paddr, size); return -EINVAL; } Loading Loading @@ -1077,6 +1081,7 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, else trace_map(iova, paddr, size); trace_map_end(iova, paddr, size); return ret; } EXPORT_SYMBOL_GPL(iommu_map); Loading @@ -1086,10 +1091,12 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) size_t unmapped_page, unmapped = 0; unsigned int min_pagesz; trace_unmap_start(iova, 0, size); if (unlikely(domain->ops->unmap == NULL || domain->ops->pgsize_bitmap == 0UL)) domain->ops->pgsize_bitmap == 0UL)) { trace_unmap_end(iova, 0, size); return -ENODEV; } /* find out the minimum page size supported */ min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); Loading @@ -1101,6 +1108,7 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) if (!IS_ALIGNED(iova | size, min_pagesz)) { pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n", iova, size, min_pagesz); trace_unmap_end(iova, 0, size); return -EINVAL; } Loading @@ -1125,6 +1133,7 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) } trace_unmap(iova, 0, size); trace_unmap_end(iova, 0, size); return unmapped; } EXPORT_SYMBOL_GPL(iommu_unmap); Loading
include/linux/iommu.h +6 −1 Original line number Diff line number Diff line Loading @@ -262,7 +262,12 @@ static inline size_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, struct scatterlist *sg, unsigned int nents, int prot) { return domain->ops->map_sg(domain, iova, sg, nents, prot); size_t ret; trace_map_sg_start(iova, nents); ret = domain->ops->map_sg(domain, iova, sg, nents, prot); trace_map_sg_end(iova, nents); return ret; } extern int iommu_dma_supported(struct iommu_domain *domain, struct device *dev, Loading
include/trace/events/iommu.h +71 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,20 @@ DEFINE_EVENT(iommu_map_unmap, map, TP_ARGS(iova, paddr, size) ); DEFINE_EVENT(iommu_map_unmap, map_start, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size) ); DEFINE_EVENT(iommu_map_unmap, map_end, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), Loading @@ -124,6 +138,63 @@ DEFINE_EVENT_PRINT(iommu_map_unmap, unmap, ) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap_start, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size), TP_printk("IOMMU: iova=0x%016llx size=0x%x", __entry->iova, __entry->size ) ); DEFINE_EVENT_PRINT(iommu_map_unmap, unmap_end, TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), TP_ARGS(iova, paddr, size), TP_printk("IOMMU: iova=0x%016llx size=0x%x", __entry->iova, __entry->size ) ); DECLARE_EVENT_CLASS(iommu_map_sg, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents), TP_STRUCT__entry( __field(u64, iova) __field(int, nents) ), TP_fast_assign( __entry->iova = iova; __entry->nents = nents; ), TP_printk("IOMMU: iova=0x%016llx nents=%u", __entry->iova, __entry->nents ) ); DEFINE_EVENT(iommu_map_sg, map_sg_start, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents) ); DEFINE_EVENT(iommu_map_sg, map_sg_end, TP_PROTO(unsigned long iova, unsigned int nents), TP_ARGS(iova, nents) ); DECLARE_EVENT_CLASS(iommu_error, TP_PROTO(struct device *dev, unsigned long iova, int flags), Loading