Loading mm/memory-failure.c +15 −5 Original line number Diff line number Diff line Loading @@ -655,7 +655,7 @@ static int page_action(struct page_state *ps, struct page *p, * Do all that is necessary to remove user space mappings. Unmap * the pages and send SIGBUS to the processes if the data was dirty. */ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, static int hwpoison_user_mappings(struct page *p, unsigned long pfn, int trapno) { enum ttu_flags ttu = TTU_UNMAP | TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS; Loading @@ -665,15 +665,18 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, int i; int kill = 1; if (PageReserved(p) || PageCompound(p) || PageSlab(p) || PageKsm(p)) return; if (PageReserved(p) || PageSlab(p)) return SWAP_SUCCESS; /* * This check implies we don't kill processes if their pages * are in the swap cache early. Those are always late kills. */ if (!page_mapped(p)) return; return SWAP_SUCCESS; if (PageCompound(p) || PageKsm(p)) return SWAP_FAIL; if (PageSwapCache(p)) { printk(KERN_ERR Loading Loading @@ -735,6 +738,8 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, */ kill_procs_ao(&tokill, !!PageDirty(p), trapno, ret != SWAP_SUCCESS, pfn); return ret; } int __memory_failure(unsigned long pfn, int trapno, int flags) Loading Loading @@ -807,8 +812,13 @@ int __memory_failure(unsigned long pfn, int trapno, int flags) /* * Now take care of user space mappings. * Abort on fail: __remove_from_page_cache() assumes unmapped page. */ hwpoison_user_mappings(p, pfn, trapno); if (hwpoison_user_mappings(p, pfn, trapno) != SWAP_SUCCESS) { printk(KERN_ERR "MCE %#lx: cannot unmap page, give up\n", pfn); res = -EBUSY; goto out; } /* * Torn down by someone else? Loading Loading
mm/memory-failure.c +15 −5 Original line number Diff line number Diff line Loading @@ -655,7 +655,7 @@ static int page_action(struct page_state *ps, struct page *p, * Do all that is necessary to remove user space mappings. Unmap * the pages and send SIGBUS to the processes if the data was dirty. */ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, static int hwpoison_user_mappings(struct page *p, unsigned long pfn, int trapno) { enum ttu_flags ttu = TTU_UNMAP | TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS; Loading @@ -665,15 +665,18 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, int i; int kill = 1; if (PageReserved(p) || PageCompound(p) || PageSlab(p) || PageKsm(p)) return; if (PageReserved(p) || PageSlab(p)) return SWAP_SUCCESS; /* * This check implies we don't kill processes if their pages * are in the swap cache early. Those are always late kills. */ if (!page_mapped(p)) return; return SWAP_SUCCESS; if (PageCompound(p) || PageKsm(p)) return SWAP_FAIL; if (PageSwapCache(p)) { printk(KERN_ERR Loading Loading @@ -735,6 +738,8 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, */ kill_procs_ao(&tokill, !!PageDirty(p), trapno, ret != SWAP_SUCCESS, pfn); return ret; } int __memory_failure(unsigned long pfn, int trapno, int flags) Loading Loading @@ -807,8 +812,13 @@ int __memory_failure(unsigned long pfn, int trapno, int flags) /* * Now take care of user space mappings. * Abort on fail: __remove_from_page_cache() assumes unmapped page. */ hwpoison_user_mappings(p, pfn, trapno); if (hwpoison_user_mappings(p, pfn, trapno) != SWAP_SUCCESS) { printk(KERN_ERR "MCE %#lx: cannot unmap page, give up\n", pfn); res = -EBUSY; goto out; } /* * Torn down by someone else? Loading