+++ /dev/null
-From e53ac7374e64dede04d745ff0e70ff5048378d1f Mon Sep 17 00:00:00 2001
-From: Rik van Riel <riel@surriel.com>
-Date: Tue, 22 Mar 2022 14:44:09 -0700
-Subject: mm: invalidate hwpoison page cache page in fault path
-
-From: Rik van Riel <riel@surriel.com>
-
-commit e53ac7374e64dede04d745ff0e70ff5048378d1f upstream.
-
-Sometimes the page offlining code can leave behind a hwpoisoned clean
-page cache page. This can lead to programs being killed over and over
-and over again as they fault in the hwpoisoned page, get killed, and
-then get re-spawned by whatever wanted to run them.
-
-This is particularly embarrassing when the page was offlined due to
-having too many corrected memory errors. Now we are killing tasks due
-to them trying to access memory that probably isn't even corrupted.
-
-This problem can be avoided by invalidating the page from the page fault
-handler, which already has a branch for dealing with these kinds of
-pages. With this patch we simply pretend the page fault was successful
-if the page was invalidated, return to userspace, incur another page
-fault, read in the file from disk (to a new memory page), and then
-everything works again.
-
-Link: https://lkml.kernel.org/r/20220212213740.423efcea@imladris.surriel.com
-Signed-off-by: Rik van Riel <riel@surriel.com>
-Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
-Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
-Reviewed-by: Oscar Salvador <osalvador@suse.de>
-Cc: John Hubbard <jhubbard@nvidia.com>
-Cc: Mel Gorman <mgorman@suse.de>
-Cc: Johannes Weiner <hannes@cmpxchg.org>
-Cc: Matthew Wilcox <willy@infradead.org>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- mm/memory.c | 9 +++++++--
- 1 file changed, 7 insertions(+), 2 deletions(-)
-
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -3329,11 +3329,16 @@ static int __do_fault(struct vm_fault *v
- return ret;
-
- if (unlikely(PageHWPoison(vmf->page))) {
-- if (ret & VM_FAULT_LOCKED)
-+ vm_fault_t poisonret = VM_FAULT_HWPOISON;
-+ if (ret & VM_FAULT_LOCKED) {
-+ /* Retry if a clean page was removed from the cache. */
-+ if (invalidate_inode_page(vmf->page))
-+ poisonret = 0;
- unlock_page(vmf->page);
-+ }
- put_page(vmf->page);
- vmf->page = NULL;
-- return VM_FAULT_HWPOISON;
-+ return poisonret;
- }
-
- if (unlikely(!(ret & VM_FAULT_LOCKED)))