MCE changes for v3.4
Subsystems (7)
Linus,
Please pull the latest x86-mce-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-mce-for-linus
HEAD: ea281a9ebaba3287130dbe15bb0aad6f798bb06b Merge tag 'mce-for-tip' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras into x86/mce
out-of-topic modifications in x86-mce-for-linus:
------------------------------------------------drivers/base/memory.c # cd42f4a: HWPOISON: Clean up memory_failureinclude/linux/mm.h # 7329bbe: HWPOISON: Add code to handle "act
# cd42f4a: HWPOISON: Clean up memory_failure
mm/hwpoison-inject.c # cd42f4a: HWPOISON: Clean up memory_failure mm/madvise.c # cd42f4a: HWPOISON: Clean up memory_failure mm/memory-failure.c # 7329bbe: HWPOISON: Add code to handle "act
# cd42f4a: HWPOISON: Clean up memory_failure
Thanks,
Ingo
------------------>
Greg Kroah-Hartman (1):
x86/mce: Convert static array of pointers to per-cpu variables
Naoya Horiguchi (1):
x86/mce: Fix return value of mce_chrdev_read() when erst is disabled
Tony Luck (7):
HWPOISON: Clean up memory_failure() vs. __memory_failure()
HWPOISON: Add code to handle "action required" errors. x86/mce: Create helper function to save addr/misc when needed x86/mce: Add mechanism to safely save information in MCE handler x86/mce: Handle "action required" errors
x86/mce: Recognise machine check bank signature for data path error x86/mce: Replace hard coded hex constants with symbolic defines
arch/x86/include/asm/mce.h | 2 +- arch/x86/kernel/cpu/mcheck/mce-severity.c | 26 ++++- arch/x86/kernel/cpu/mcheck/mce.c | 193 ++++++++++++++++++++--------- arch/x86/kernel/cpu/mcheck/mce_amd.c | 9 +- drivers/base/memory.c | 2 +- include/linux/mm.h | 4 +- mm/hwpoison-inject.c | 4 +- mm/madvise.c | 2 +- mm/memory-failure.c | 96 ++++++++------- 9 files changed, 221 insertions(+), 117 deletions(-)
arch/x86/include/asm/mce.h +1 -1
@@ -151,7 +151,7 @@ static inline void enable_p5_mce(void) {}void mce_setup (struct mce *m);void mce_log (struct mce *m); -extern struct device *mce_device[CONFIG_NR_CPUS ]; +DECLARE_PER_CPU(struct device *, mce_device);/* * Maximum banks number.
arch/x86/kernel/cpu/mcheck/mce-severity.c +23 -3
@@ -54,7 +54,14 @@ static struct severity {#define MASK (x, y) .mask = x, .result = y#define MCI_UC_S (MCI_STATUS_UC|MCI_STATUS_S)#define MCI_UC_SAR (MCI_STATUS_UC|MCI_STATUS_S|MCI_STATUS_AR) +#define MCI_ADDR (MCI_STATUS_ADDRV|MCI_STATUS_MISCV)#define MCACOD 0xffff +/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ +#define MCACOD_SCRUB 0x00C0/* 0xC0-0xCF Memory Scrubbing */ +#define MCACOD_SCRUBMSK 0xfff0 +#define MCACOD_L3WB 0x017A/* L3 Explicit Writeback */ +#define MCACOD_DATA 0x0134/* Data Load */ +#define MCACOD_INSTR 0x0150/* Instruction Fetch */ MCESEV( NO, "Invalid",
@@ -102,11 +109,24 @@ static struct severity { SER, BITCLR(MCI_STATUS_S) ), -/* AR add known MCACODs here */ MCESEV( PANIC, "Action required with lost events", SER, BITSET(MCI_STATUS_OVER|MCI_UC_SAR) ), + +/* known AR MCACODs: */ +#ifdef CONFIG_MEMORY_FAILURE +MCESEV ( +KEEP ,"HT thread notices Action required: data load error" , +SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |MCI_ADDR |MCACOD ,MCI_UC_SAR |MCI_ADDR |MCACOD_DATA ), +MCGMASK (MCG_STATUS_EIPV ,0 ) + ), +MCESEV ( +AR ,"Action required: data load error" , +SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |MCI_ADDR |MCACOD ,MCI_UC_SAR |MCI_ADDR |MCACOD_DATA ), +USER + ), +#endifMCESEV (PANIC ,"Action required: unknown MCACOD" , SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR, MCI_UC_SAR)
@@ -115,11 +135,11 @@ static struct severity {/* known AO MCACODs: */ MCESEV (AO ,"Action optional: memory scrubbing error" , -SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |0xfff0 ,MCI_UC_S |0x00c0 ) +SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |MCACOD_SCRUBMSK ,MCI_UC_S |MCACOD_SCRUB ) ),MCESEV (AO ,"Action optional: last level cache writeback error" , -SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |MCACOD ,MCI_UC_S |0x017a ) +SER ,MASK (MCI_STATUS_OVER |MCI_UC_SAR |MCACOD ,MCI_UC_S |MCACOD_L3WB ) ), MCESEV( SOME, "Action optional: unknown MCACOD",
arch/x86/kernel/cpu/mcheck/mce.c +136 -57
290 lines not on this page · raw message
arch/x86/kernel/cpu/mcheck/mce_amd.c +5 -4
@@ -523,7 +523,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) {int i, err =0 ;struct threshold_bank *b =NULL ; -struct device *dev = mce_device[cpu]; +struct device *dev =per_cpu (mce_device, cpu);char name[32 ];sprintf (name,"threshold_bank%i" , bank);
@@ -587,7 +587,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)if (i == cpu)continue ; - dev = mce_device[i]; + dev =per_cpu (mce_device, i);if (dev) err =sysfs_create_link (&dev->kobj,b->kobj, name);if (err)
@@ -667,7 +667,8 @@ static void threshold_remove_bank(unsigned int cpu, int bank)#ifdef CONFIG_SMP /* sibling symlink */ if (shared_bank[bank] && b->blocks->cpu != cpu) { -sysfs_remove_link (&mce_device[cpu]->kobj, name); + dev =per_cpu (mce_device, cpu); +sysfs_remove_link (&dev->kobj, name);per_cpu (threshold_banks, cpu)[bank] =NULL ;return ;
@@ -679,7 +680,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)if (i == cpu)continue ; - dev = mce_device[i]; + dev =per_cpu (mce_device, i);if (dev)sysfs_remove_link (&dev->kobj, name);per_cpu (threshold_banks, i)[bank] =NULL ;
drivers/base/memory.c +1 -1
@@ -466,7 +466,7 @@ store_hard_offline_page(struct device *dev,if (strict_strtoull (buf,0 , &pfn) <0 )return -EINVAL ; pfn >>=PAGE_SHIFT ; - ret =__memory_failure (pfn,0 ,0 ); + ret =memory_failure (pfn,0 ,0 );return ret ? ret : count; }
include/linux/mm.h +2 -2
@@ -1598,9 +1598,9 @@ void vmemmap_populate_print_last(void);enum mf_flags {MF_COUNT_INCREASED =1 <<0 , +MF_ACTION_REQUIRED =1 <<1 , }; -extern void memory_failure (unsigned long pfn,int trapno); -extern int __memory_failure (unsigned long pfn,int trapno,int 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 int unpoison_memory (unsigned long pfn);extern int sysctl_memory_failure_early_kill;
mm/hwpoison-inject.c +2 -2
@@ -45,7 +45,7 @@ static int hwpoison_inject(void *data, u64 val)* do a racy check with elevated page count, to make sure PG_hwpoison * will only be set for the targeted owner (or on a free page). * We temporarily take page lock for try_get_mem_cgroup_from_page(). -* __memory_failure() will redo the check reliably inside page lock. +* memory_failure() will redo the check reliably inside page lock. */ lock_page (hpage); err =hwpoison_filter (hpage);
@@ -55,7 +55,7 @@ static int hwpoison_inject(void *data, u64 val) inject:printk (KERN_INFO "Injecting memory failure at pfn %lx\n" , pfn); -return __memory_failure (pfn,18 ,MF_COUNT_INCREASED ); +return memory_failure (pfn,18 ,MF_COUNT_INCREASED ); }static int hwpoison_unpoison (void *data,u64 val)
mm/madvise.c +1 -1
@@ -251,7 +251,7 @@ static int madvise_hwpoison(int bhv, unsigned long start, unsigned long end)printk (KERN_INFO "Injecting memory failure for page %lx at %lx\n" ,page_to_pfn (p), start);/* Ignore return value for now */ -__memory_failure (page_to_pfn (p),0 ,MF_COUNT_INCREASED ); +memory_failure (page_to_pfn (p),0 ,MF_COUNT_INCREASED ); }return ret; }
mm/memory-failure.c +50 -46
164 lines not on this page · raw message