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; }