diff options
author | Ingo Molnar <mingo@elte.hu> | 2012-03-14 02:44:48 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2012-03-14 02:44:48 -0400 |
commit | ea281a9ebaba3287130dbe15bb0aad6f798bb06b (patch) | |
tree | cd365ac8eaa292df63ec183617c1f1c5128ebfca /arch/x86/kernel | |
parent | cd593accdcc27ccbe6498d9ad1c2b6cc8e1d830d (diff) | |
parent | fadd85f16a8ec3fee8af599e79a209682dc52348 (diff) |
Merge tag 'mce-for-tip' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras into x86/mce
Apply two miscellaneous MCE fixes.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 14 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd.c | 9 |
2 files changed, 15 insertions, 8 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index ad573d8baf10..c614bd4de0f3 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -1614,6 +1614,12 @@ static int __mce_read_apei(char __user **ubuf, size_t usize) | |||
1614 | /* Error or no more MCE record */ | 1614 | /* Error or no more MCE record */ |
1615 | if (rc <= 0) { | 1615 | if (rc <= 0) { |
1616 | mce_apei_read_done = 1; | 1616 | mce_apei_read_done = 1; |
1617 | /* | ||
1618 | * When ERST is disabled, mce_chrdev_read() should return | ||
1619 | * "no record" instead of "no device." | ||
1620 | */ | ||
1621 | if (rc == -ENODEV) | ||
1622 | return 0; | ||
1617 | return rc; | 1623 | return rc; |
1618 | } | 1624 | } |
1619 | rc = -EFAULT; | 1625 | rc = -EFAULT; |
@@ -1932,7 +1938,7 @@ static struct bus_type mce_subsys = { | |||
1932 | .dev_name = "machinecheck", | 1938 | .dev_name = "machinecheck", |
1933 | }; | 1939 | }; |
1934 | 1940 | ||
1935 | struct device *mce_device[CONFIG_NR_CPUS]; | 1941 | DEFINE_PER_CPU(struct device *, mce_device); |
1936 | 1942 | ||
1937 | __cpuinitdata | 1943 | __cpuinitdata |
1938 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); | 1944 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); |
@@ -2111,7 +2117,7 @@ static __cpuinit int mce_device_create(unsigned int cpu) | |||
2111 | goto error2; | 2117 | goto error2; |
2112 | } | 2118 | } |
2113 | cpumask_set_cpu(cpu, mce_device_initialized); | 2119 | cpumask_set_cpu(cpu, mce_device_initialized); |
2114 | mce_device[cpu] = dev; | 2120 | per_cpu(mce_device, cpu) = dev; |
2115 | 2121 | ||
2116 | return 0; | 2122 | return 0; |
2117 | error2: | 2123 | error2: |
@@ -2128,7 +2134,7 @@ error: | |||
2128 | 2134 | ||
2129 | static __cpuinit void mce_device_remove(unsigned int cpu) | 2135 | static __cpuinit void mce_device_remove(unsigned int cpu) |
2130 | { | 2136 | { |
2131 | struct device *dev = mce_device[cpu]; | 2137 | struct device *dev = per_cpu(mce_device, cpu); |
2132 | int i; | 2138 | int i; |
2133 | 2139 | ||
2134 | if (!cpumask_test_cpu(cpu, mce_device_initialized)) | 2140 | if (!cpumask_test_cpu(cpu, mce_device_initialized)) |
@@ -2142,7 +2148,7 @@ static __cpuinit void mce_device_remove(unsigned int cpu) | |||
2142 | 2148 | ||
2143 | device_unregister(dev); | 2149 | device_unregister(dev); |
2144 | cpumask_clear_cpu(cpu, mce_device_initialized); | 2150 | cpumask_clear_cpu(cpu, mce_device_initialized); |
2145 | mce_device[cpu] = NULL; | 2151 | per_cpu(mce_device, cpu) = NULL; |
2146 | } | 2152 | } |
2147 | 2153 | ||
2148 | /* Make sure there are no machine checks on offlined CPUs. */ | 2154 | /* Make sure there are no machine checks on offlined CPUs. */ |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index e4eeaaf58a47..99b57179f912 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
@@ -523,7 +523,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
523 | { | 523 | { |
524 | int i, err = 0; | 524 | int i, err = 0; |
525 | struct threshold_bank *b = NULL; | 525 | struct threshold_bank *b = NULL; |
526 | struct device *dev = mce_device[cpu]; | 526 | struct device *dev = per_cpu(mce_device, cpu); |
527 | char name[32]; | 527 | char name[32]; |
528 | 528 | ||
529 | sprintf(name, "threshold_bank%i", bank); | 529 | sprintf(name, "threshold_bank%i", bank); |
@@ -587,7 +587,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
587 | if (i == cpu) | 587 | if (i == cpu) |
588 | continue; | 588 | continue; |
589 | 589 | ||
590 | dev = mce_device[i]; | 590 | dev = per_cpu(mce_device, i); |
591 | if (dev) | 591 | if (dev) |
592 | err = sysfs_create_link(&dev->kobj,b->kobj, name); | 592 | err = sysfs_create_link(&dev->kobj,b->kobj, name); |
593 | if (err) | 593 | if (err) |
@@ -667,7 +667,8 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
667 | #ifdef CONFIG_SMP | 667 | #ifdef CONFIG_SMP |
668 | /* sibling symlink */ | 668 | /* sibling symlink */ |
669 | if (shared_bank[bank] && b->blocks->cpu != cpu) { | 669 | if (shared_bank[bank] && b->blocks->cpu != cpu) { |
670 | sysfs_remove_link(&mce_device[cpu]->kobj, name); | 670 | dev = per_cpu(mce_device, cpu); |
671 | sysfs_remove_link(&dev->kobj, name); | ||
671 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 672 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
672 | 673 | ||
673 | return; | 674 | return; |
@@ -679,7 +680,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
679 | if (i == cpu) | 680 | if (i == cpu) |
680 | continue; | 681 | continue; |
681 | 682 | ||
682 | dev = mce_device[i]; | 683 | dev = per_cpu(mce_device, i); |
683 | if (dev) | 684 | if (dev) |
684 | sysfs_remove_link(&dev->kobj, name); | 685 | sysfs_remove_link(&dev->kobj, name); |
685 | per_cpu(threshold_banks, i)[bank] = NULL; | 686 | per_cpu(threshold_banks, i)[bank] = NULL; |