diff options
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_64.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 18 | ||||
| -rw-r--r-- | include/asm-x86/mce.h | 1 |
3 files changed, 11 insertions, 13 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce_64.c b/arch/x86/kernel/cpu/mcheck/mce_64.c index 65a339678ece..726a5fcdf341 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_64.c | |||
| @@ -759,6 +759,7 @@ static struct sysdev_class mce_sysclass = { | |||
| 759 | }; | 759 | }; |
| 760 | 760 | ||
| 761 | DEFINE_PER_CPU(struct sys_device, device_mce); | 761 | DEFINE_PER_CPU(struct sys_device, device_mce); |
| 762 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu) __cpuinitdata; | ||
| 762 | 763 | ||
| 763 | /* Why are there no generic functions for this? */ | 764 | /* Why are there no generic functions for this? */ |
| 764 | #define ACCESSOR(name, var, start) \ | 765 | #define ACCESSOR(name, var, start) \ |
| @@ -883,9 +884,13 @@ static int __cpuinit mce_cpu_callback(struct notifier_block *nfb, | |||
| 883 | case CPU_ONLINE: | 884 | case CPU_ONLINE: |
| 884 | case CPU_ONLINE_FROZEN: | 885 | case CPU_ONLINE_FROZEN: |
| 885 | mce_create_device(cpu); | 886 | mce_create_device(cpu); |
| 887 | if (threshold_cpu_callback) | ||
| 888 | threshold_cpu_callback(action, cpu); | ||
| 886 | break; | 889 | break; |
| 887 | case CPU_DEAD: | 890 | case CPU_DEAD: |
| 888 | case CPU_DEAD_FROZEN: | 891 | case CPU_DEAD_FROZEN: |
| 892 | if (threshold_cpu_callback) | ||
| 893 | threshold_cpu_callback(action, cpu); | ||
| 889 | mce_remove_device(cpu); | 894 | mce_remove_device(cpu); |
| 890 | break; | 895 | break; |
| 891 | } | 896 | } |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 88736cadbaa6..5eb390a4b2e9 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
| @@ -628,6 +628,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
| 628 | deallocate_threshold_block(cpu, bank); | 628 | deallocate_threshold_block(cpu, bank); |
| 629 | 629 | ||
| 630 | free_out: | 630 | free_out: |
| 631 | kobject_del(b->kobj); | ||
| 631 | kobject_put(b->kobj); | 632 | kobject_put(b->kobj); |
| 632 | kfree(b); | 633 | kfree(b); |
| 633 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 634 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
| @@ -645,14 +646,11 @@ static void threshold_remove_device(unsigned int cpu) | |||
| 645 | } | 646 | } |
| 646 | 647 | ||
| 647 | /* get notified when a cpu comes on/off */ | 648 | /* get notified when a cpu comes on/off */ |
| 648 | static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb, | 649 | static void __cpuinit amd_64_threshold_cpu_callback(unsigned long action, |
| 649 | unsigned long action, void *hcpu) | 650 | unsigned int cpu) |
| 650 | { | 651 | { |
| 651 | /* cpu was unsigned int to begin with */ | ||
| 652 | unsigned int cpu = (unsigned long)hcpu; | ||
| 653 | |||
| 654 | if (cpu >= NR_CPUS) | 652 | if (cpu >= NR_CPUS) |
| 655 | goto out; | 653 | return; |
| 656 | 654 | ||
| 657 | switch (action) { | 655 | switch (action) { |
| 658 | case CPU_ONLINE: | 656 | case CPU_ONLINE: |
| @@ -666,14 +664,8 @@ static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb, | |||
| 666 | default: | 664 | default: |
| 667 | break; | 665 | break; |
| 668 | } | 666 | } |
| 669 | out: | ||
| 670 | return NOTIFY_OK; | ||
| 671 | } | 667 | } |
| 672 | 668 | ||
| 673 | static struct notifier_block threshold_cpu_notifier __cpuinitdata = { | ||
| 674 | .notifier_call = threshold_cpu_callback, | ||
| 675 | }; | ||
| 676 | |||
| 677 | static __init int threshold_init_device(void) | 669 | static __init int threshold_init_device(void) |
| 678 | { | 670 | { |
| 679 | unsigned lcpu = 0; | 671 | unsigned lcpu = 0; |
| @@ -684,7 +676,7 @@ static __init int threshold_init_device(void) | |||
| 684 | if (err) | 676 | if (err) |
| 685 | return err; | 677 | return err; |
| 686 | } | 678 | } |
| 687 | register_hotcpu_notifier(&threshold_cpu_notifier); | 679 | threshold_cpu_callback = amd_64_threshold_cpu_callback; |
| 688 | return 0; | 680 | return 0; |
| 689 | } | 681 | } |
| 690 | 682 | ||
diff --git a/include/asm-x86/mce.h b/include/asm-x86/mce.h index 94f1fd79e22a..531eaa587455 100644 --- a/include/asm-x86/mce.h +++ b/include/asm-x86/mce.h | |||
| @@ -92,6 +92,7 @@ extern int mce_disabled; | |||
| 92 | 92 | ||
| 93 | void mce_log(struct mce *m); | 93 | void mce_log(struct mce *m); |
| 94 | DECLARE_PER_CPU(struct sys_device, device_mce); | 94 | DECLARE_PER_CPU(struct sys_device, device_mce); |
| 95 | extern void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); | ||
| 95 | 96 | ||
| 96 | #ifdef CONFIG_X86_MCE_INTEL | 97 | #ifdef CONFIG_X86_MCE_INTEL |
| 97 | void mce_intel_feature_init(struct cpuinfo_x86 *c); | 98 | void mce_intel_feature_init(struct cpuinfo_x86 *c); |
