From 2488e2e472e7f66933b1f190251a35f13ea67699 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Thu, 23 Mar 2023 13:37:22 -0700 Subject: [PATCH] ANDROID: page_pinner: add missing page_pinner_put_page aosp/2369528 missed page_pinner_put_page in put_page_testzero path. Fix it. Bug: 274967172 Change-Id: Ia2af2ffb752f8405b4289ca88cde09f201548e1f Signed-off-by: Minchan Kim --- include/linux/mm.h | 8 +++++++- include/linux/page_pinner.h | 6 ------ mm/page_pinner.c | 14 +++++++++++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 07ee5deefa91..b82c982b9818 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -28,6 +28,7 @@ #include #include #include +#include #include struct mempolicy; @@ -760,8 +761,13 @@ static inline unsigned int folio_order(struct folio *folio) */ static inline int put_page_testzero(struct page *page) { + int ret; + VM_BUG_ON_PAGE(page_ref_count(page) == 0, page); - return page_ref_dec_and_test(page); + ret = page_ref_dec_and_test(page); + page_pinner_put_page(page); + + return ret; } static inline int folio_put_testzero(struct folio *folio) diff --git a/include/linux/page_pinner.h b/include/linux/page_pinner.h index cb29f5c3d68e..d87706cc3317 100644 --- a/include/linux/page_pinner.h +++ b/include/linux/page_pinner.h @@ -24,9 +24,6 @@ static inline void page_pinner_put_page(struct page *page) if (!static_branch_unlikely(&page_pinner_inited)) return; - if (!static_branch_unlikely(&failure_tracking)) - return; - __page_pinner_put_page(page); } @@ -35,9 +32,6 @@ static inline void page_pinner_failure_detect(struct page *page) if (!static_branch_unlikely(&page_pinner_inited)) return; - if (!static_branch_unlikely(&failure_tracking)) - return; - __page_pinner_failure_detect(page); } #else diff --git a/mm/page_pinner.c b/mm/page_pinner.c index 2567206e7ce8..2b1b1165867e 100644 --- a/mm/page_pinner.c +++ b/mm/page_pinner.c @@ -56,9 +56,9 @@ static struct page_pinner_buffer pp_buffer; static bool page_pinner_enabled; DEFINE_STATIC_KEY_FALSE(page_pinner_inited); +EXPORT_SYMBOL_GPL(page_pinner_inited); DEFINE_STATIC_KEY_TRUE(failure_tracking); -EXPORT_SYMBOL_GPL(failure_tracking); static depot_stack_handle_t failure_handle; @@ -252,11 +252,15 @@ print_page_pinner(char __user *buf, size_t count, struct captured_pinner *record void __page_pinner_failure_detect(struct page *page) { - struct page_ext *page_ext = page_ext_get(page); + struct page_ext *page_ext; struct page_pinner *page_pinner; struct captured_pinner record; u64 now; + if (!static_branch_unlikely(&failure_tracking)) + return; + + page_ext = page_ext_get(page); if (unlikely(!page_ext)) return; @@ -282,11 +286,15 @@ EXPORT_SYMBOL_GPL(__page_pinner_failure_detect); void __page_pinner_put_page(struct page *page) { - struct page_ext *page_ext = page_ext_get(page); + struct page_ext *page_ext; struct page_pinner *page_pinner; struct captured_pinner record; u64 now, ts_usec; + if (!static_branch_unlikely(&failure_tracking)) + return; + + page_ext = page_ext_get(page); if (unlikely(!page_ext)) return;