diff options
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 6379fff1a5ff..831be5ff5f4d 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -372,7 +372,8 @@ static void kill_procs(struct list_head *to_kill, int forcekill, bool fail, | |||
372 | if (fail || tk->addr_valid == 0) { | 372 | if (fail || tk->addr_valid == 0) { |
373 | pr_err("Memory failure: %#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n", | 373 | pr_err("Memory failure: %#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n", |
374 | pfn, tk->tsk->comm, tk->tsk->pid); | 374 | pfn, tk->tsk->comm, tk->tsk->pid); |
375 | force_sig(SIGKILL, tk->tsk); | 375 | do_send_sig_info(SIGKILL, SEND_SIG_PRIV, |
376 | tk->tsk, PIDTYPE_PID); | ||
376 | } | 377 | } |
377 | 378 | ||
378 | /* | 379 | /* |
@@ -966,7 +967,7 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
966 | enum ttu_flags ttu = TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS; | 967 | enum ttu_flags ttu = TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS; |
967 | struct address_space *mapping; | 968 | struct address_space *mapping; |
968 | LIST_HEAD(tokill); | 969 | LIST_HEAD(tokill); |
969 | bool unmap_success = true; | 970 | bool unmap_success; |
970 | int kill = 1, forcekill; | 971 | int kill = 1, forcekill; |
971 | struct page *hpage = *hpagep; | 972 | struct page *hpage = *hpagep; |
972 | bool mlocked = PageMlocked(hpage); | 973 | bool mlocked = PageMlocked(hpage); |
@@ -1028,19 +1029,7 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
1028 | if (kill) | 1029 | if (kill) |
1029 | collect_procs(hpage, &tokill, flags & MF_ACTION_REQUIRED); | 1030 | collect_procs(hpage, &tokill, flags & MF_ACTION_REQUIRED); |
1030 | 1031 | ||
1031 | if (!PageHuge(hpage)) { | 1032 | unmap_success = try_to_unmap(hpage, ttu); |
1032 | unmap_success = try_to_unmap(hpage, ttu); | ||
1033 | } else if (mapping) { | ||
1034 | /* | ||
1035 | * For hugetlb pages, try_to_unmap could potentially call | ||
1036 | * huge_pmd_unshare. Because of this, take semaphore in | ||
1037 | * write mode here and set TTU_RMAP_LOCKED to indicate we | ||
1038 | * have taken the lock at this higer level. | ||
1039 | */ | ||
1040 | i_mmap_lock_write(mapping); | ||
1041 | unmap_success = try_to_unmap(hpage, ttu|TTU_RMAP_LOCKED); | ||
1042 | i_mmap_unlock_write(mapping); | ||
1043 | } | ||
1044 | if (!unmap_success) | 1033 | if (!unmap_success) |
1045 | pr_err("Memory failure: %#lx: failed to unmap page (mapcount=%d)\n", | 1034 | pr_err("Memory failure: %#lx: failed to unmap page (mapcount=%d)\n", |
1046 | pfn, page_mapcount(hpage)); | 1035 | pfn, page_mapcount(hpage)); |