diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index d41c18cc3407..4501d20feb6a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -85,6 +85,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_tm_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_check_int_errors); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_setup_dma_ops); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_alloc_insert_iova); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_iovad_alloc_iova); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_iovad_free_iova); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_iovad_init_alloc_algo); diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index 602888ec9572..889eae11b096 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -11,6 +11,7 @@ #include #include #include +#include /* The anchor node sits above the top of the usable address space */ #define IOVA_ANCHOR ~0UL @@ -317,14 +318,18 @@ alloc_iova(struct iova_domain *iovad, unsigned long size, bool size_aligned) { struct iova *new_iova; - int ret; + int ret = -1; new_iova = alloc_iova_mem(); if (!new_iova) return NULL; - ret = __alloc_and_insert_iova_range(iovad, size, limit_pfn + 1, - new_iova, size_aligned); + trace_android_rvh_iommu_alloc_insert_iova(iovad, size, limit_pfn + 1, + new_iova, size_aligned, &ret); + if (ret) { + ret = __alloc_and_insert_iova_range(iovad, size, + limit_pfn + 1, new_iova, size_aligned); + } if (ret) { free_iova_mem(new_iova); diff --git a/include/trace/hooks/iommu.h b/include/trace/hooks/iommu.h index 86b12dbb6d59..ed02144539f9 100644 --- a/include/trace/hooks/iommu.h +++ b/include/trace/hooks/iommu.h @@ -14,6 +14,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_iommu_setup_dma_ops, TP_ARGS(dev, dma_base, dma_limit), 1); struct iova_domain; +struct iova; + +DECLARE_RESTRICTED_HOOK(android_rvh_iommu_alloc_insert_iova, + TP_PROTO(struct iova_domain *iovad, unsigned long size, + unsigned long limit_pfn, struct iova *new_iova, + bool size_aligned, int *ret), + TP_ARGS(iovad, size, limit_pfn, new_iova, size_aligned, ret), + 1); DECLARE_HOOK(android_vh_iommu_iovad_alloc_iova, TP_PROTO(struct device *dev, struct iova_domain *iovad, dma_addr_t iova, size_t size),