mm/memory-failure.c: rework the try_to_unmap logic in hwpoison_user_mappings()
authorMiaohe Lin <linmiaohe@huawei.com>
Tue, 22 Mar 2022 21:44:27 +0000 (14:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Mar 2022 22:57:07 +0000 (15:57 -0700)
Only for hugetlb pages in shared mappings, try_to_unmap should take
semaphore in write mode here.  Rework the code to make it clear.

Link: https://lkml.kernel.org/r/20220218090118.1105-7-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/memory-failure.c

index ac3d582d84b2b8e2fa26d74fe7c9fe86d0cec84e..1597414dec2fd22166540f6d590ba52d946833a4 100644 (file)
@@ -1404,26 +1404,22 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn,
        if (kill)
                collect_procs(hpage, &tokill, flags & MF_ACTION_REQUIRED);
 
-       if (!PageHuge(hpage)) {
-               try_to_unmap(hpage, ttu);
+       if (PageHuge(hpage) && !PageAnon(hpage)) {
+               /*
+                * For hugetlb pages in shared mappings, try_to_unmap
+                * could potentially call huge_pmd_unshare.  Because of
+                * this, take semaphore in write mode here and set
+                * TTU_RMAP_LOCKED to indicate we have taken the lock
+                * at this higher level.
+                */
+               mapping = hugetlb_page_mapping_lock_write(hpage);
+               if (mapping) {
+                       try_to_unmap(hpage, ttu|TTU_RMAP_LOCKED);
+                       i_mmap_unlock_write(mapping);
+               } else
+                       pr_info("Memory failure: %#lx: could not lock mapping for mapped huge page\n", pfn);
        } else {
-               if (!PageAnon(hpage)) {
-                       /*
-                        * For hugetlb pages in shared mappings, try_to_unmap
-                        * could potentially call huge_pmd_unshare.  Because of
-                        * this, take semaphore in write mode here and set
-                        * TTU_RMAP_LOCKED to indicate we have taken the lock
-                        * at this higher level.
-                        */
-                       mapping = hugetlb_page_mapping_lock_write(hpage);
-                       if (mapping) {
-                               try_to_unmap(hpage, ttu|TTU_RMAP_LOCKED);
-                               i_mmap_unlock_write(mapping);
-                       } else
-                               pr_info("Memory failure: %#lx: could not lock mapping for mapped huge page\n", pfn);
-               } else {
-                       try_to_unmap(hpage, ttu);
-               }
+               try_to_unmap(hpage, ttu);
        }
 
        unmap_success = !page_mapped(hpage);