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))) {