diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 15:10:27 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 15:10:27 -0500 |
| commit | fab5669d556200c4dd119af705bff14085845d1e (patch) | |
| tree | 366d05fc858fc599177d687f37b227a4832c2f48 /arch | |
| parent | 74e8ee8262c3f93bbc41804037b43f07b95897bb (diff) | |
| parent | b769e014f3ae4af8a56c6327077b3c40410dedad (diff) | |
Merge branch 'x86-ras-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 RAS changes from Ingo Molnar:
- SCI reporting for other error types not only correctable ones
- GHES cleanups
- Add the functionality to override error reporting agents as some
machines are sporting a new extended error logging capability which,
if done properly in the BIOS, makes a corresponding EDAC module
redundant
- PCIe AER tracepoint severity levels fix
- Error path correction for the mce device init
- MCE timer fix
- Add more flexibility to the error injection (EINJ) debugfs interface
* 'x86-ras-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86, mce: Fix mce_start_timer semantics
ACPI, APEI, GHES: Cleanup ghes memory error handling
ACPI, APEI: Cleanup alignment-aware accesses
ACPI, APEI, GHES: Do not report only correctable errors with SCI
ACPI, APEI, EINJ: Changes to the ACPI/APEI/EINJ debugfs interface
ACPI, eMCA: Combine eMCA/EDAC event reporting priority
EDAC, sb_edac: Modify H/W event reporting policy
EDAC: Add an edac_report parameter to EDAC
PCI, AER: Fix severity usage in aer trace event
x86, mce: Call put_device on device_register failure
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-apei.c | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 12 |
2 files changed, 17 insertions, 9 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce-apei.c b/arch/x86/kernel/cpu/mcheck/mce-apei.c index de8b60a53f69..a1aef9533154 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-apei.c +++ b/arch/x86/kernel/cpu/mcheck/mce-apei.c | |||
| @@ -33,22 +33,28 @@ | |||
| 33 | #include <linux/acpi.h> | 33 | #include <linux/acpi.h> |
| 34 | #include <linux/cper.h> | 34 | #include <linux/cper.h> |
| 35 | #include <acpi/apei.h> | 35 | #include <acpi/apei.h> |
| 36 | #include <acpi/ghes.h> | ||
| 36 | #include <asm/mce.h> | 37 | #include <asm/mce.h> |
| 37 | 38 | ||
| 38 | #include "mce-internal.h" | 39 | #include "mce-internal.h" |
| 39 | 40 | ||
| 40 | void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err) | 41 | void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err) |
| 41 | { | 42 | { |
| 42 | struct mce m; | 43 | struct mce m; |
| 43 | 44 | ||
| 44 | /* Only corrected MC is reported */ | 45 | if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) |
| 45 | if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA)) | ||
| 46 | return; | 46 | return; |
| 47 | 47 | ||
| 48 | mce_setup(&m); | 48 | mce_setup(&m); |
| 49 | m.bank = 1; | 49 | m.bank = 1; |
| 50 | /* Fake a memory read corrected error with unknown channel */ | 50 | /* Fake a memory read error with unknown channel */ |
| 51 | m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; | 51 | m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; |
| 52 | |||
| 53 | if (severity >= GHES_SEV_RECOVERABLE) | ||
| 54 | m.status |= MCI_STATUS_UC; | ||
| 55 | if (severity >= GHES_SEV_PANIC) | ||
| 56 | m.status |= MCI_STATUS_PCC; | ||
| 57 | |||
| 52 | m.addr = mem_err->physical_addr; | 58 | m.addr = mem_err->physical_addr; |
| 53 | mce_log(&m); | 59 | mce_log(&m); |
| 54 | mce_notify_irq(); | 60 | mce_notify_irq(); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b3218cdee95f..4d5419b249da 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1638,15 +1638,15 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c) | |||
| 1638 | 1638 | ||
| 1639 | static void mce_start_timer(unsigned int cpu, struct timer_list *t) | 1639 | static void mce_start_timer(unsigned int cpu, struct timer_list *t) |
| 1640 | { | 1640 | { |
| 1641 | unsigned long iv = mce_adjust_timer(check_interval * HZ); | 1641 | unsigned long iv = check_interval * HZ; |
| 1642 | |||
| 1643 | __this_cpu_write(mce_next_interval, iv); | ||
| 1644 | 1642 | ||
| 1645 | if (mca_cfg.ignore_ce || !iv) | 1643 | if (mca_cfg.ignore_ce || !iv) |
| 1646 | return; | 1644 | return; |
| 1647 | 1645 | ||
| 1646 | per_cpu(mce_next_interval, cpu) = iv; | ||
| 1647 | |||
| 1648 | t->expires = round_jiffies(jiffies + iv); | 1648 | t->expires = round_jiffies(jiffies + iv); |
| 1649 | add_timer_on(t, smp_processor_id()); | 1649 | add_timer_on(t, cpu); |
| 1650 | } | 1650 | } |
| 1651 | 1651 | ||
| 1652 | static void __mcheck_cpu_init_timer(void) | 1652 | static void __mcheck_cpu_init_timer(void) |
| @@ -2272,8 +2272,10 @@ static int mce_device_create(unsigned int cpu) | |||
| 2272 | dev->release = &mce_device_release; | 2272 | dev->release = &mce_device_release; |
| 2273 | 2273 | ||
| 2274 | err = device_register(dev); | 2274 | err = device_register(dev); |
| 2275 | if (err) | 2275 | if (err) { |
| 2276 | put_device(dev); | ||
| 2276 | return err; | 2277 | return err; |
| 2278 | } | ||
| 2277 | 2279 | ||
| 2278 | for (i = 0; mce_device_attrs[i]; i++) { | 2280 | for (i = 0; mce_device_attrs[i]; i++) { |
| 2279 | err = device_create_file(dev, mce_device_attrs[i]); | 2281 | err = device_create_file(dev, mce_device_attrs[i]); |
