From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>
To: tony.luck@intel.com, bp@alien8.de
Cc: ananth@in.ibm.com, masbock@linux.vnet.ibm.com,
lcm@linux.vnet.ibm.com, linux-kernel@vger.kernel.org,
linux-acpi@vger.kernel.org, ying.huang@intel.com
Subject: Re: [PATCH v2 2/2] mce: acpi/apei: Add a boot option to disable ff mode for corrected errors
Date: Fri, 28 Jun 2013 17:34:02 +0530 [thread overview]
Message-ID: <20130628120224.7781.45438.stgit@localhost.localdomain> (raw)
In-Reply-To: <20130621072725.GB22006@pd.tnic>
Hi Tony, Boris,
Here is a patch which implements this technique. Kindly take a look and let me
know what you think.
Thanks,
Naveen
--
If the firmware indicates in GHES error data entry that the error threshold
has exceeded for a corrected error event, then we try to soft-offline the
page.
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
---
drivers/acpi/apei/ghes.c | 7 ++++++
include/linux/mm.h | 1 +
mm/memory-failure.c | 53 ++++++++++++++++++++++++++++++----------------
3 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index fcd7d91..17137cf 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -422,6 +422,13 @@ static void ghes_do_proc(struct ghes *ghes,
CPER_SEC_PLATFORM_MEM)) {
struct cper_sec_mem_err *mem_err;
mem_err = (struct cper_sec_mem_err *)(gdata+1);
+ if (sec_sev == GHES_SEV_CORRECTED &&
+ (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED) &&
+ (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS)) {
+ unsigned long pfn;
+ pfn = mem_err->physical_addr >> PAGE_SHIFT;
+ soft_memory_failure_queue(pfn, 0, 0);
+ }
ghes_edac_report_mem_error(ghes, sev, mem_err);
#ifdef CONFIG_X86_MCE
diff --git a/include/linux/mm.h b/include/linux/mm.h
index e0c8528..f9907d2 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1787,6 +1787,7 @@ enum mf_flags {
};
extern int memory_failure(unsigned long pfn, int trapno, int flags);
extern void memory_failure_queue(unsigned long pfn, int trapno, int flags);
+extern void soft_memory_failure_queue(unsigned long pfn, int trapno, int flags);
extern int unpoison_memory(unsigned long pfn);
extern int sysctl_memory_failure_early_kill;
extern int sysctl_memory_failure_recovery;
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index ceb0c7f..50caefd 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1222,6 +1222,7 @@ struct memory_failure_entry {
unsigned long pfn;
int trapno;
int flags;
+ bool soft_offline;
};
struct memory_failure_cpu {
@@ -1233,6 +1234,28 @@ struct memory_failure_cpu {
static DEFINE_PER_CPU(struct memory_failure_cpu, memory_failure_cpu);
+void __memory_failure_queue(unsigned long pfn, int trapno, int flags, int soft_offline)
+{
+ struct memory_failure_cpu *mf_cpu;
+ unsigned long proc_flags;
+ struct memory_failure_entry entry = {
+ .pfn = pfn,
+ .trapno = trapno,
+ .flags = flags,
+ .soft_offline = soft_offline
+ };
+
+ mf_cpu = &get_cpu_var(memory_failure_cpu);
+ spin_lock_irqsave(&mf_cpu->lock, proc_flags);
+ if (kfifo_put(&mf_cpu->fifo, &entry))
+ schedule_work_on(smp_processor_id(), &mf_cpu->work);
+ else
+ pr_err("Memory failure: buffer overflow when queuing memory failure at 0x%#lx\n",
+ pfn);
+ spin_unlock_irqrestore(&mf_cpu->lock, proc_flags);
+ put_cpu_var(memory_failure_cpu);
+}
+
/**
* memory_failure_queue - Schedule handling memory failure of a page.
* @pfn: Page Number of the corrupted page
@@ -1250,28 +1273,19 @@ static DEFINE_PER_CPU(struct memory_failure_cpu, memory_failure_cpu);
*
* Can run in IRQ context.
*/
+
void memory_failure_queue(unsigned long pfn, int trapno, int flags)
{
- struct memory_failure_cpu *mf_cpu;
- unsigned long proc_flags;
- struct memory_failure_entry entry = {
- .pfn = pfn,
- .trapno = trapno,
- .flags = flags,
- };
-
- mf_cpu = &get_cpu_var(memory_failure_cpu);
- spin_lock_irqsave(&mf_cpu->lock, proc_flags);
- if (kfifo_put(&mf_cpu->fifo, &entry))
- schedule_work_on(smp_processor_id(), &mf_cpu->work);
- else
- pr_err("Memory failure: buffer overflow when queuing memory failure at 0x%#lx\n",
- pfn);
- spin_unlock_irqrestore(&mf_cpu->lock, proc_flags);
- put_cpu_var(memory_failure_cpu);
+ __memory_failure_queue(pfn, trapno, flags, false);
}
EXPORT_SYMBOL_GPL(memory_failure_queue);
+void soft_memory_failure_queue(unsigned long pfn, int trapno, int flags)
+{
+ __memory_failure_queue(pfn, trapno, flags, true);
+}
+EXPORT_SYMBOL_GPL(soft_memory_failure_queue);
+
static void memory_failure_work_func(struct work_struct *work)
{
struct memory_failure_cpu *mf_cpu;
@@ -1286,7 +1300,10 @@ static void memory_failure_work_func(struct work_struct *work)
spin_unlock_irqrestore(&mf_cpu->lock, proc_flags);
if (!gotten)
break;
- memory_failure(entry.pfn, entry.trapno, entry.flags);
+ if (entry.soft_offline)
+ soft_offline_page(pfn_to_page(entry.pfn), entry.flags);
+ else
+ memory_failure(entry.pfn, entry.trapno, entry.flags);
}
}
next prev parent reply other threads:[~2013-06-28 12:04 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-19 17:57 [PATCH v2 1/2] mce: acpi/apei: Honour Firmware First for MCA banks listed in APEI HEST CMC Naveen N. Rao
2013-06-19 17:57 ` [PATCH v2 2/2] mce: acpi/apei: Add a boot option to disable ff mode for corrected errors Naveen N. Rao
2013-06-19 18:04 ` Borislav Petkov
2013-06-19 18:17 ` Naveen N. Rao
2013-06-19 18:19 ` Luck, Tony
2013-06-19 18:19 ` Luck, Tony
2013-06-19 18:36 ` Borislav Petkov
2013-06-19 19:05 ` Luck, Tony
2013-06-19 19:05 ` Luck, Tony
2013-06-19 20:14 ` Borislav Petkov
2013-06-19 20:33 ` Luck, Tony
2013-06-19 20:33 ` Luck, Tony
2013-06-19 21:07 ` Borislav Petkov
2013-06-19 21:28 ` Luck, Tony
2013-06-19 21:28 ` Luck, Tony
2013-06-19 21:41 ` Borislav Petkov
2013-06-19 22:08 ` Luck, Tony
2013-06-19 22:08 ` Luck, Tony
2013-06-20 5:35 ` Borislav Petkov
2013-06-20 21:21 ` Naveen N. Rao
2013-06-20 22:11 ` Luck, Tony
2013-06-20 22:11 ` Luck, Tony
2013-06-21 7:27 ` Borislav Petkov
2013-06-21 16:43 ` Naveen N. Rao
2013-06-28 12:04 ` Naveen N. Rao [this message]
2013-06-28 17:31 ` Tony Luck
2013-07-01 15:07 ` Naveen N. Rao
2013-07-01 15:38 ` Borislav Petkov
2013-07-01 15:41 ` Naveen N. Rao
2013-06-20 7:48 ` Borislav Petkov
2013-06-20 19:02 ` Naveen N. Rao
2013-06-20 7:39 ` [PATCH v2 1/2] mce: acpi/apei: Honour Firmware First for MCA banks listed in APEI HEST CMC Borislav Petkov
2013-06-20 7:39 ` Borislav Petkov
2013-06-20 19:08 ` Naveen N. Rao
2013-06-20 19:29 ` Borislav Petkov
2013-06-20 20:14 ` Naveen N. Rao
2013-06-20 20:57 ` Borislav Petkov
2013-06-20 21:22 ` Naveen N. Rao
2013-06-21 7:34 ` Borislav Petkov
2013-06-21 7:46 ` Naveen N. Rao
2013-06-21 8:36 ` Borislav Petkov
2013-06-21 9:32 ` Naveen N. Rao
2013-06-21 14:08 ` Borislav Petkov
2013-06-21 16:47 ` Tony Luck
2013-06-21 17:40 ` Borislav Petkov
2013-06-25 17:46 ` Naveen N. Rao
2013-06-25 17:53 ` Borislav Petkov
2013-06-25 17:55 ` Luck, Tony
2013-06-25 17:55 ` Luck, Tony
2013-06-25 18:28 ` Naveen N. Rao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130628120224.7781.45438.stgit@localhost.localdomain \
--to=naveen.n.rao@linux.vnet.ibm.com \
--cc=ananth@in.ibm.com \
--cc=bp@alien8.de \
--cc=lcm@linux.vnet.ibm.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=masbock@linux.vnet.ibm.com \
--cc=tony.luck@intel.com \
--cc=ying.huang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.