|
@@ -184,8 +184,8 @@ static int kill_proc(struct task_struct *t, unsigned long addr, int trapno,
|
|
|
struct siginfo si;
|
|
|
int ret;
|
|
|
|
|
|
- pr_err("MCE %#lx: Killing %s:%d due to hardware memory corruption\n",
|
|
|
- pfn, t->comm, t->pid);
|
|
|
+ pr_err("Memory failure: %#lx: Killing %s:%d due to hardware memory corruption\n",
|
|
|
+ pfn, t->comm, t->pid);
|
|
|
si.si_signo = SIGBUS;
|
|
|
si.si_errno = 0;
|
|
|
si.si_addr = (void *)addr;
|
|
@@ -208,7 +208,7 @@ static int kill_proc(struct task_struct *t, unsigned long addr, int trapno,
|
|
|
ret = send_sig_info(SIGBUS, &si, t); /* synchronous? */
|
|
|
}
|
|
|
if (ret < 0)
|
|
|
- pr_info("MCE: Error sending signal to %s:%d: %d\n",
|
|
|
+ pr_info("Memory failure: Error sending signal to %s:%d: %d\n",
|
|
|
t->comm, t->pid, ret);
|
|
|
return ret;
|
|
|
}
|
|
@@ -289,7 +289,7 @@ static void add_to_kill(struct task_struct *tsk, struct page *p,
|
|
|
} else {
|
|
|
tk = kmalloc(sizeof(struct to_kill), GFP_ATOMIC);
|
|
|
if (!tk) {
|
|
|
- pr_err("MCE: Out of memory while machine check handling\n");
|
|
|
+ pr_err("Memory failure: Out of memory while machine check handling\n");
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -303,7 +303,7 @@ static void add_to_kill(struct task_struct *tsk, struct page *p,
|
|
|
* a SIGKILL because the error is not contained anymore.
|
|
|
*/
|
|
|
if (tk->addr == -EFAULT) {
|
|
|
- pr_info("MCE: Unable to find user space address %lx in %s\n",
|
|
|
+ pr_info("Memory failure: Unable to find user space address %lx in %s\n",
|
|
|
page_to_pfn(p), tsk->comm);
|
|
|
tk->addr_valid = 0;
|
|
|
}
|
|
@@ -334,7 +334,7 @@ static void kill_procs(struct list_head *to_kill, int forcekill, int trapno,
|
|
|
* signal and then access the memory. Just kill it.
|
|
|
*/
|
|
|
if (fail || tk->addr_valid == 0) {
|
|
|
- pr_err("MCE %#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n",
|
|
|
+ pr_err("Memory failure: %#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n",
|
|
|
pfn, tk->tsk->comm, tk->tsk->pid);
|
|
|
force_sig(SIGKILL, tk->tsk);
|
|
|
}
|
|
@@ -347,7 +347,7 @@ static void kill_procs(struct list_head *to_kill, int forcekill, int trapno,
|
|
|
*/
|
|
|
else if (kill_proc(tk->tsk, tk->addr, trapno,
|
|
|
pfn, page, flags) < 0)
|
|
|
- pr_err("MCE %#lx: Cannot send advisory machine check signal to %s:%d\n",
|
|
|
+ pr_err("Memory failure: %#lx: Cannot send advisory machine check signal to %s:%d\n",
|
|
|
pfn, tk->tsk->comm, tk->tsk->pid);
|
|
|
}
|
|
|
put_task_struct(tk->tsk);
|
|
@@ -559,7 +559,7 @@ static int me_kernel(struct page *p, unsigned long pfn)
|
|
|
*/
|
|
|
static int me_unknown(struct page *p, unsigned long pfn)
|
|
|
{
|
|
|
- pr_err("MCE %#lx: Unknown page state\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: Unknown page state\n", pfn);
|
|
|
return MF_FAILED;
|
|
|
}
|
|
|
|
|
@@ -604,11 +604,12 @@ static int me_pagecache_clean(struct page *p, unsigned long pfn)
|
|
|
if (mapping->a_ops->error_remove_page) {
|
|
|
err = mapping->a_ops->error_remove_page(mapping, p);
|
|
|
if (err != 0) {
|
|
|
- pr_info("MCE %#lx: Failed to punch page: %d\n",
|
|
|
+ pr_info("Memory failure: %#lx: Failed to punch page: %d\n",
|
|
|
pfn, err);
|
|
|
} else if (page_has_private(p) &&
|
|
|
!try_to_release_page(p, GFP_NOIO)) {
|
|
|
- pr_info("MCE %#lx: failed to release buffers\n", pfn);
|
|
|
+ pr_info("Memory failure: %#lx: failed to release buffers\n",
|
|
|
+ pfn);
|
|
|
} else {
|
|
|
ret = MF_RECOVERED;
|
|
|
}
|
|
@@ -620,7 +621,8 @@ static int me_pagecache_clean(struct page *p, unsigned long pfn)
|
|
|
if (invalidate_inode_page(p))
|
|
|
ret = MF_RECOVERED;
|
|
|
else
|
|
|
- pr_info("MCE %#lx: Failed to invalidate\n", pfn);
|
|
|
+ pr_info("Memory failure: %#lx: Failed to invalidate\n",
|
|
|
+ pfn);
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
@@ -833,7 +835,7 @@ static void action_result(unsigned long pfn, enum mf_action_page_type type,
|
|
|
{
|
|
|
trace_memory_failure_event(pfn, type, result);
|
|
|
|
|
|
- pr_err("MCE %#lx: recovery action for %s: %s\n",
|
|
|
+ pr_err("Memory failure: %#lx: recovery action for %s: %s\n",
|
|
|
pfn, action_page_types[type], action_name[result]);
|
|
|
}
|
|
|
|
|
@@ -849,7 +851,7 @@ static int page_action(struct page_state *ps, struct page *p,
|
|
|
if (ps->action == me_swapcache_dirty && result == MF_DELAYED)
|
|
|
count--;
|
|
|
if (count != 0) {
|
|
|
- pr_err("MCE %#lx: %s still referenced by %d users\n",
|
|
|
+ pr_err("Memory failure: %#lx: %s still referenced by %d users\n",
|
|
|
pfn, action_page_types[ps->type], count);
|
|
|
result = MF_FAILED;
|
|
|
}
|
|
@@ -882,7 +884,7 @@ int get_hwpoison_page(struct page *page)
|
|
|
* tries to touch the "partially handled" page.
|
|
|
*/
|
|
|
if (!PageAnon(head)) {
|
|
|
- pr_err("MCE: %#lx: non anonymous thp\n",
|
|
|
+ pr_err("Memory failure: %#lx: non anonymous thp\n",
|
|
|
page_to_pfn(page));
|
|
|
return 0;
|
|
|
}
|
|
@@ -892,7 +894,8 @@ int get_hwpoison_page(struct page *page)
|
|
|
if (head == compound_head(page))
|
|
|
return 1;
|
|
|
|
|
|
- pr_info("MCE: %#lx cannot catch tail\n", page_to_pfn(page));
|
|
|
+ pr_info("Memory failure: %#lx cannot catch tail\n",
|
|
|
+ page_to_pfn(page));
|
|
|
put_page(head);
|
|
|
}
|
|
|
|
|
@@ -931,12 +934,13 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
|
|
return SWAP_SUCCESS;
|
|
|
|
|
|
if (PageKsm(p)) {
|
|
|
- pr_err("MCE %#lx: can't handle KSM pages.\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: can't handle KSM pages.\n", pfn);
|
|
|
return SWAP_FAIL;
|
|
|
}
|
|
|
|
|
|
if (PageSwapCache(p)) {
|
|
|
- pr_err("MCE %#lx: keeping poisoned page in swap cache\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: keeping poisoned page in swap cache\n",
|
|
|
+ pfn);
|
|
|
ttu |= TTU_IGNORE_HWPOISON;
|
|
|
}
|
|
|
|
|
@@ -954,7 +958,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
|
|
} else {
|
|
|
kill = 0;
|
|
|
ttu |= TTU_IGNORE_HWPOISON;
|
|
|
- pr_info("MCE %#lx: corrupted page was clean: dropped without side effects\n",
|
|
|
+ pr_info("Memory failure: %#lx: corrupted page was clean: dropped without side effects\n",
|
|
|
pfn);
|
|
|
}
|
|
|
}
|
|
@@ -972,7 +976,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
|
|
|
|
|
ret = try_to_unmap(hpage, ttu);
|
|
|
if (ret != SWAP_SUCCESS)
|
|
|
- pr_err("MCE %#lx: failed to unmap page (mapcount=%d)\n",
|
|
|
+ pr_err("Memory failure: %#lx: failed to unmap page (mapcount=%d)\n",
|
|
|
pfn, page_mapcount(hpage));
|
|
|
|
|
|
/*
|
|
@@ -1040,14 +1044,16 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
panic("Memory failure from trap %d on page %lx", trapno, pfn);
|
|
|
|
|
|
if (!pfn_valid(pfn)) {
|
|
|
- pr_err("MCE %#lx: memory outside kernel control\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: memory outside kernel control\n",
|
|
|
+ pfn);
|
|
|
return -ENXIO;
|
|
|
}
|
|
|
|
|
|
p = pfn_to_page(pfn);
|
|
|
orig_head = hpage = compound_head(p);
|
|
|
if (TestSetPageHWPoison(p)) {
|
|
|
- pr_err("MCE %#lx: already hardware poisoned\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: already hardware poisoned\n",
|
|
|
+ pfn);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1112,9 +1118,11 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) {
|
|
|
unlock_page(hpage);
|
|
|
if (!PageAnon(hpage))
|
|
|
- pr_err("MCE: %#lx: non anonymous thp\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: non anonymous thp\n",
|
|
|
+ pfn);
|
|
|
else
|
|
|
- pr_err("MCE: %#lx: thp split failed\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: thp split failed\n",
|
|
|
+ pfn);
|
|
|
if (TestClearPageHWPoison(p))
|
|
|
num_poisoned_pages_sub(nr_pages);
|
|
|
put_hwpoison_page(p);
|
|
@@ -1178,7 +1186,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
* unpoison always clear PG_hwpoison inside page lock
|
|
|
*/
|
|
|
if (!PageHWPoison(p)) {
|
|
|
- pr_err("MCE %#lx: just unpoisoned\n", pfn);
|
|
|
+ pr_err("Memory failure: %#lx: just unpoisoned\n", pfn);
|
|
|
num_poisoned_pages_sub(nr_pages);
|
|
|
unlock_page(hpage);
|
|
|
put_hwpoison_page(hpage);
|
|
@@ -1395,25 +1403,25 @@ int unpoison_memory(unsigned long pfn)
|
|
|
page = compound_head(p);
|
|
|
|
|
|
if (!PageHWPoison(p)) {
|
|
|
- unpoison_pr_info("MCE: Page was already unpoisoned %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Page was already unpoisoned %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (page_count(page) > 1) {
|
|
|
- unpoison_pr_info("MCE: Someone grabs the hwpoison page %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Someone grabs the hwpoison page %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (page_mapped(page)) {
|
|
|
- unpoison_pr_info("MCE: Someone maps the hwpoison page %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Someone maps the hwpoison page %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (page_mapping(page)) {
|
|
|
- unpoison_pr_info("MCE: the hwpoison page has non-NULL mapping %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: the hwpoison page has non-NULL mapping %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1424,7 +1432,7 @@ int unpoison_memory(unsigned long pfn)
|
|
|
* In such case, we yield to memory_failure() and make unpoison fail.
|
|
|
*/
|
|
|
if (!PageHuge(page) && PageTransHuge(page)) {
|
|
|
- unpoison_pr_info("MCE: Memory failure is now running on %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Memory failure is now running on %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1439,13 +1447,13 @@ int unpoison_memory(unsigned long pfn)
|
|
|
* to the end.
|
|
|
*/
|
|
|
if (PageHuge(page)) {
|
|
|
- unpoison_pr_info("MCE: Memory failure is now running on free hugepage %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Memory failure is now running on free hugepage %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
|
if (TestClearPageHWPoison(p))
|
|
|
num_poisoned_pages_dec();
|
|
|
- unpoison_pr_info("MCE: Software-unpoisoned free page %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Software-unpoisoned free page %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1458,7 +1466,7 @@ int unpoison_memory(unsigned long pfn)
|
|
|
* the free buddy page pool.
|
|
|
*/
|
|
|
if (TestClearPageHWPoison(page)) {
|
|
|
- unpoison_pr_info("MCE: Software-unpoisoned page %#lx\n",
|
|
|
+ unpoison_pr_info("Unpoison: Software-unpoisoned page %#lx\n",
|
|
|
pfn, &unpoison_rs);
|
|
|
num_poisoned_pages_sub(nr_pages);
|
|
|
freeit = 1;
|