__collapse_huge_page_isolate() may fail due to extra pin in the LRU add pagevec. It's petty common for swapin case: we swap in pages just to fail due to the extra pin. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> --- mm/khugepaged.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 14d7afc90786..39e0994abeb8 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -585,11 +585,19 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, * The page must only be referenced by the scanned process * and page swap cache. */ + if (page_count(page) != 1 + PageSwapCache(page)) { + /* + * Drain pagevec and retry just in case we can get rid + * of the extra pin, like in swapin case. + */ + lru_add_drain(); + } if (page_count(page) != 1 + PageSwapCache(page)) { unlock_page(page); result = SCAN_PAGE_COUNT; goto out; } + if (pte_write(pteval)) { writable = true; } else { -- 2.26.0