diff --git a/mm/memory.c b/mm/memory.c index 422d2be8e61028c4c33db8e24a18a061ccc7bc3d..8e4068ef034b03926507b46ab6221811c6707d1a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3186,7 +3186,15 @@ static vm_fault_t do_wp_page(struct vm_fault *vmf) * * PageKsm() doesn't necessarily raise the page refcount. */ - if (PageKsm(page) || page_count(page) > 1 + PageSwapCache(page)) + if (PageKsm(page) || page_count(page) > 3) + goto copy; + if (!PageLRU(page)) + /* + * Note: We cannot easily detect+handle references from + * remote LRU pagevecs or references to PageLRU() pages. + */ + lru_add_drain(); + if (page_count(page) > 1 + PageSwapCache(page)) goto copy; if (!trylock_page(page)) goto copy;