From dba79c3af30ff1093a54bcf40b9ad9bf5eb7a0d8 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Mon, 28 Jun 2021 23:44:19 -0700 Subject: [PATCH] ANDROID: mm: page_pinner: report test_page_isolation_failure Sometimes, alloc_contig_range fails at test_pages_isolated. Report the failed page to page_pinner for tracking them to be able to investigate it. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: Ifcb913faa87a131915efd72848e6ca59c15b75b4 --- include/linux/page_pinner.h | 11 +++++++++++ mm/page_isolation.c | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/linux/page_pinner.h b/include/linux/page_pinner.h index d34b17d8d021..ba14d7636dc0 100644 --- a/include/linux/page_pinner.h +++ b/include/linux/page_pinner.h @@ -47,6 +47,14 @@ static inline void page_pinner_put_page(struct page *page) __page_pinner_migration_failed(page); } +static inline void page_pinner_failure_detect(struct page *page) +{ + if (!static_branch_unlikely(&failure_tracking)) + return; + + __page_pinner_migration_failed(page); +} + static inline void page_pinner_mark_migration_failed_pages(struct list_head *page_list) { if (!static_branch_unlikely(&failure_tracking)) @@ -70,6 +78,9 @@ static inline void dump_page_pinner(struct page *page) static inline void page_pinner_put_page(struct page *page) { } +static inline void page_pinner_failure_detect(struct page *page) +{ +} static inline void page_pinner_mark_migration_failed_pages(struct list_head *page_list) { } diff --git a/mm/page_isolation.c b/mm/page_isolation.c index abbf42214485..6ecd3f432336 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -308,6 +308,10 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, spin_unlock_irqrestore(&zone->lock, flags); trace_test_pages_isolated(start_pfn, end_pfn, pfn); + if (pfn < end_pfn) { + page_pinner_failure_detect(pfn_to_page(pfn)); + return -EBUSY; + } - return pfn < end_pfn ? -EBUSY : 0; + return 0; }