ACPI, APEI, Report GHES error information via printk

printk is one of the methods to report hardware errors to user space.
This patch implements hardware error reporting for GHES via printk.

Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Huang Ying 2010-12-07 10:22:31 +08:00 committed by Len Brown
parent f59c55d04b
commit 32c361f574
1 changed files with 21 additions and 4 deletions

View File

@ -43,6 +43,7 @@
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/ratelimit.h>
#include <acpi/apei.h> #include <acpi/apei.h>
#include <acpi/atomicio.h> #include <acpi/atomicio.h>
#include <acpi/hed.h> #include <acpi/hed.h>
@ -255,11 +256,26 @@ static void ghes_do_proc(struct ghes *ghes)
} }
#endif #endif
} }
}
if (!processed && printk_ratelimit()) static void ghes_print_estatus(const char *pfx, struct ghes *ghes)
pr_warning(GHES_PFX {
"Unknown error record from generic hardware error source: %d\n", /* Not more than 2 messages every 5 seconds */
ghes->generic->header.source_id); static DEFINE_RATELIMIT_STATE(ratelimit, 5*HZ, 2);
if (pfx == NULL) {
if (ghes_severity(ghes->estatus->error_severity) <=
GHES_SEV_CORRECTED)
pfx = KERN_WARNING HW_ERR;
else
pfx = KERN_ERR HW_ERR;
}
if (__ratelimit(&ratelimit)) {
printk(
"%s""Hardware error from APEI Generic Hardware Error Source: %d\n",
pfx, ghes->generic->header.source_id);
apei_estatus_print(pfx, ghes->estatus);
}
} }
static int ghes_proc(struct ghes *ghes) static int ghes_proc(struct ghes *ghes)
@ -269,6 +285,7 @@ static int ghes_proc(struct ghes *ghes)
rc = ghes_read_estatus(ghes, 0); rc = ghes_read_estatus(ghes, 0);
if (rc) if (rc)
goto out; goto out;
ghes_print_estatus(NULL, ghes);
ghes_do_proc(ghes); ghes_do_proc(ghes);
out: out: