Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, MCE, AMD: Assign interrupt handler only when bank supports it

There are some AMD CPU models which have thresholding banks but which
cannot generate a thresholding interrupt. This is denoted by the bit
MCi_MISC[IntP]. Make sure to check that bit before assigning the
thresholding interrupt handler.

Signed-off-by: Chen Yucong <slaoub@gmail.com>
[ Boris: save an indentation level and rewrite commit message. ]
Link: http://lkml.kernel.org/r/1412662128.28440.18.camel@debian
Signed-off-by: Borislav Petkov <bp@suse.de>

authored by

Chen Yucong and committed by
Borislav Petkov
8dcf32ea a3a529d1

+10 -7
+10 -7
arch/x86/kernel/cpu/mcheck/mce_amd.c
··· 212 212 unsigned int cpu = smp_processor_id(); 213 213 u32 low = 0, high = 0, address = 0; 214 214 unsigned int bank, block; 215 - int offset = -1; 215 + int offset = -1, new; 216 216 217 217 for (bank = 0; bank < mca_cfg.banks; ++bank) { 218 218 for (block = 0; block < NR_BLOCKS; ++block) { ··· 247 247 b.address = address; 248 248 b.interrupt_capable = lvt_interrupt_supported(bank, high); 249 249 250 - if (b.interrupt_capable) { 251 - int new = (high & MASK_LVTOFF_HI) >> 20; 252 - offset = setup_APIC_mce(offset, new); 253 - } 250 + if (!b.interrupt_capable) 251 + goto init; 254 252 255 - mce_threshold_block_init(&b, offset); 253 + new = (high & MASK_LVTOFF_HI) >> 20; 254 + offset = setup_APIC_mce(offset, new); 256 255 257 - if (mce_threshold_vector != amd_threshold_interrupt) 256 + if ((offset == new) && 257 + (mce_threshold_vector != amd_threshold_interrupt)) 258 258 mce_threshold_vector = amd_threshold_interrupt; 259 + 260 + init: 261 + mce_threshold_block_init(&b, offset); 259 262 } 260 263 } 261 264 }