On Mon, Nov 25, 2013 at 02:15:01AM -0500, Chen, Gong wrote: > Date: Mon, 25 Nov 2013 02:15:01 -0500 > From: "Chen, Gong" <gong.chen@xxxxxxxxxxxxxxx> > To: tony.luck@xxxxxxxxx, bp@xxxxxxxxx, naveen.n.rao@xxxxxxxxxxxxxxxxxx > Cc: linux-acpi@xxxxxxxxxxxxxxx, "Chen, Gong" <gong.chen@xxxxxxxxxxxxxxx> > Subject: [PATCH v2 2/2] ACPI, APEI, GHES: Cleanup ghes codes for memory > error handling > X-Mailer: git-send-email 1.8.4.3 > > Cleanup the logic for function ghes_handle_memory_failure. Just > make it simpler and cleaner. > > v2 -> v1: fix a compile error & some minor changes. > > Signed-off-by: Chen, Gong <gong.chen@xxxxxxxxxxxxxxx> > --- > drivers/acpi/apei/ghes.c | 36 ++++++++++++++++++++---------------- > 1 file changed, 20 insertions(+), 16 deletions(-) > > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > index ce3683d..46766ef 100644 > --- a/drivers/acpi/apei/ghes.c > +++ b/drivers/acpi/apei/ghes.c > @@ -413,27 +413,31 @@ static void ghes_handle_memory_failure(struct acpi_generic_data *gdata, int sev) > { > #ifdef CONFIG_ACPI_APEI_MEMORY_FAILURE > unsigned long pfn; > + int flags = -1; > int sec_sev = ghes_severity(gdata->error_severity); > 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_PA)) { > - pfn = mem_err->physical_addr >> PAGE_SHIFT; > - if (pfn_valid(pfn)) > - memory_failure_queue(pfn, 0, MF_SOFT_OFFLINE); > - else if (printk_ratelimit()) > - pr_warn(FW_WARN GHES_PFX > - "Invalid address in generic error data: %#llx\n", > - mem_err->physical_addr); > - } > - if (sev == GHES_SEV_RECOVERABLE && > - sec_sev == GHES_SEV_RECOVERABLE && > - mem_err->validation_bits & CPER_MEM_VALID_PA) { > - pfn = mem_err->physical_addr >> PAGE_SHIFT; > - memory_failure_queue(pfn, 0, 0); > + if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) > + return; > + > + pfn = mem_err->physical_addr >> PAGE_SHIFT; > + if (!pfn_valid(pfn)) { > + pr_warn_ratelimited(FW_WARN GHES_PFX > + "Invalid address in generic error data: %#llx\n", > + mem_err->physical_addr); > + return; > } > + > + /* iff following two events can be handled properly by now */ > + if (sec_sev == GHES_SEV_CORRECTED && > + (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED)) > + flags = MF_SOFT_OFFLINE; > + if (sev == GHES_SEV_RECOVERABLE && sec_sev == GHES_SEV_RECOVERABLE) > + flags = 0; > + > + if (flags != -1) > + memory_failure_queue(pfn, 0, flags); > #endif > } > Hi, Boris In this patch so-called cleanup includes an implied PFN check for UC error but missed in current codes.
Attachment:
signature.asc
Description: Digital signature