diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 4a9a2e80e72c..b5f86b200c48 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -5974,6 +5974,7 @@ + @@ -35503,27 +35504,27 @@ - + - + - + - + - + - + - + - + @@ -41420,9 +41421,9 @@ - + - + @@ -64672,7 +64673,7 @@ - + @@ -78408,21 +78409,21 @@ - + - + - + - + - + - + @@ -114167,15 +114168,15 @@ - - - + + + - - - - + + + + @@ -117002,6 +117003,7 @@ + @@ -117493,12 +117495,12 @@ - - - - - - + + + + + + @@ -122714,7 +122716,7 @@ - + @@ -126212,10 +126214,10 @@ - - - - + + + + @@ -126835,12 +126837,12 @@ - - + + - - + + @@ -130947,27 +130949,27 @@ - - + + - - - - - - + + + + + + - - + + - - + + - + @@ -133016,8 +133018,8 @@ - - + + @@ -133048,8 +133050,8 @@ - - + + @@ -137550,8 +137552,8 @@ - - + + diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index e01b646d5bf7..ad6dea578253 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -2699,6 +2699,7 @@ __tracepoint_android_vh_show_max_freq __tracepoint_android_vh_show_resume_epoch_val __tracepoint_android_vh_show_suspend_epoch_val + __tracepoint_android_vh_subpage_dma_contig_alloc __tracepoint_android_vh_timer_calc_index __tracepoint_android_vh_ufs_check_int_errors __tracepoint_android_vh_ufs_clock_scaling diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 3f6157a125c4..d0f5d357a8b7 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -400,3 +400,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_css_offline); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_css_online); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_alloc); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_subpage_dma_contig_alloc); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 4b299fd6e613..5821f6d74a07 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -126,6 +126,10 @@ DECLARE_HOOK(android_vh_mmap_region, DECLARE_HOOK(android_vh_try_to_unmap_one, TP_PROTO(struct vm_area_struct *vma, struct page *page, unsigned long addr, bool ret), TP_ARGS(vma, page, addr, ret)); +struct device; +DECLARE_HOOK(android_vh_subpage_dma_contig_alloc, + TP_PROTO(bool *allow_subpage_alloc, struct device *dev, size_t *size), + TP_ARGS(allow_subpage_alloc, dev, size)); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_MM_H */ diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index 2e0763463b59..e678bf688f6d 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -50,6 +50,7 @@ #include #include #include +#include #ifdef CONFIG_CMA_SIZE_MBYTES #define CMA_SIZE_MBYTES CONFIG_CMA_SIZE_MBYTES @@ -309,14 +310,19 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp) #ifdef CONFIG_DMA_PERNUMA_CMA int nid = dev_to_node(dev); #endif + bool allow_subpage_alloc = false; /* CMA can be used only in the context which permits sleeping */ if (!gfpflags_allow_blocking(gfp)) return NULL; if (dev->cma_area) return cma_alloc_aligned(dev->cma_area, size, gfp); - if (size <= PAGE_SIZE) - return NULL; + + if (size <= PAGE_SIZE) { + trace_android_vh_subpage_dma_contig_alloc(&allow_subpage_alloc, dev, &size); + if (!allow_subpage_alloc) + return NULL; + } #ifdef CONFIG_DMA_PERNUMA_CMA if (nid != NUMA_NO_NODE && !(gfp & (GFP_DMA | GFP_DMA32))) {