ANDROID: vendor_hooks: Add hooks to for free_unref_page_commit
Provide a vendor hook to skip cma-pages to add in pcplist when
free_unref_page_commit.
The patch is revelant to skip drain_all_pages in alloc_contig_range,
the revelant hooks is android_vh_cma_drain_all_pages_bypass
which is to avoid to delay in drain pcppages when drain_all_pages.
In most case, pcp->high is small so that free-pages with other mt_types
can also fill with pcplist full.
Bug: 224732340
Signed-off-by: Peifeng Li <lipeifeng@oppo.com>
Change-Id: Ifdeeed9f8934d87671ec3fa6787a02675b993082
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 4bd60d6..30f52cc 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3301,6 +3301,7 @@ static void free_unref_page_commit(struct page *page, unsigned long pfn)
struct zone *zone = page_zone(page);
struct per_cpu_pages *pcp;
int migratetype;
+ bool pcp_skip_cma_pages = false;
migratetype = get_pcppage_migratetype(page);
__count_vm_event(PGFREE);
@@ -3313,7 +3314,10 @@ static void free_unref_page_commit(struct page *page, unsigned long pfn)
* excessively into the page allocator
*/
if (migratetype >= MIGRATE_PCPTYPES) {
- if (unlikely(is_migrate_isolate(migratetype))) {
+ trace_android_vh_pcplist_add_cma_pages_bypass(migratetype,
+ &pcp_skip_cma_pages);
+ if (unlikely(is_migrate_isolate(migratetype)) ||
+ pcp_skip_cma_pages) {
free_one_page(zone, page, pfn, 0, migratetype,
FPI_NONE);
return;