diff options
Diffstat (limited to 'arch/x86/kernel/cpu/mcheck/mce.c')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 204 |
1 files changed, 131 insertions, 73 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 2af127d4c3d1..5a11ae2e9e91 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/percpu.h> | 20 | #include <linux/percpu.h> |
21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
22 | #include <linux/sysdev.h> | 22 | #include <linux/device.h> |
23 | #include <linux/syscore_ops.h> | 23 | #include <linux/syscore_ops.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/ctype.h> | 25 | #include <linux/ctype.h> |
@@ -95,13 +95,6 @@ static DECLARE_WAIT_QUEUE_HEAD(mce_chrdev_wait); | |||
95 | static DEFINE_PER_CPU(struct mce, mces_seen); | 95 | static DEFINE_PER_CPU(struct mce, mces_seen); |
96 | static int cpu_missing; | 96 | static int cpu_missing; |
97 | 97 | ||
98 | /* | ||
99 | * CPU/chipset specific EDAC code can register a notifier call here to print | ||
100 | * MCE errors in a human-readable form. | ||
101 | */ | ||
102 | ATOMIC_NOTIFIER_HEAD(x86_mce_decoder_chain); | ||
103 | EXPORT_SYMBOL_GPL(x86_mce_decoder_chain); | ||
104 | |||
105 | /* MCA banks polled by the period polling timer for corrected events */ | 98 | /* MCA banks polled by the period polling timer for corrected events */ |
106 | DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = { | 99 | DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = { |
107 | [0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL | 100 | [0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL |
@@ -109,6 +102,12 @@ DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = { | |||
109 | 102 | ||
110 | static DEFINE_PER_CPU(struct work_struct, mce_work); | 103 | static DEFINE_PER_CPU(struct work_struct, mce_work); |
111 | 104 | ||
105 | /* | ||
106 | * CPU/chipset specific EDAC code can register a notifier call here to print | ||
107 | * MCE errors in a human-readable form. | ||
108 | */ | ||
109 | ATOMIC_NOTIFIER_HEAD(x86_mce_decoder_chain); | ||
110 | |||
112 | /* Do initial initialization of a struct mce */ | 111 | /* Do initial initialization of a struct mce */ |
113 | void mce_setup(struct mce *m) | 112 | void mce_setup(struct mce *m) |
114 | { | 113 | { |
@@ -119,9 +118,7 @@ void mce_setup(struct mce *m) | |||
119 | m->time = get_seconds(); | 118 | m->time = get_seconds(); |
120 | m->cpuvendor = boot_cpu_data.x86_vendor; | 119 | m->cpuvendor = boot_cpu_data.x86_vendor; |
121 | m->cpuid = cpuid_eax(1); | 120 | m->cpuid = cpuid_eax(1); |
122 | #ifdef CONFIG_SMP | ||
123 | m->socketid = cpu_data(m->extcpu).phys_proc_id; | 121 | m->socketid = cpu_data(m->extcpu).phys_proc_id; |
124 | #endif | ||
125 | m->apicid = cpu_data(m->extcpu).initial_apicid; | 122 | m->apicid = cpu_data(m->extcpu).initial_apicid; |
126 | rdmsrl(MSR_IA32_MCG_CAP, m->mcgcap); | 123 | rdmsrl(MSR_IA32_MCG_CAP, m->mcgcap); |
127 | } | 124 | } |
@@ -190,6 +187,57 @@ void mce_log(struct mce *mce) | |||
190 | set_bit(0, &mce_need_notify); | 187 | set_bit(0, &mce_need_notify); |
191 | } | 188 | } |
192 | 189 | ||
190 | static void drain_mcelog_buffer(void) | ||
191 | { | ||
192 | unsigned int next, i, prev = 0; | ||
193 | |||
194 | next = rcu_dereference_check_mce(mcelog.next); | ||
195 | |||
196 | do { | ||
197 | struct mce *m; | ||
198 | |||
199 | /* drain what was logged during boot */ | ||
200 | for (i = prev; i < next; i++) { | ||
201 | unsigned long start = jiffies; | ||
202 | unsigned retries = 1; | ||
203 | |||
204 | m = &mcelog.entry[i]; | ||
205 | |||
206 | while (!m->finished) { | ||
207 | if (time_after_eq(jiffies, start + 2*retries)) | ||
208 | retries++; | ||
209 | |||
210 | cpu_relax(); | ||
211 | |||
212 | if (!m->finished && retries >= 4) { | ||
213 | pr_err("MCE: skipping error being logged currently!\n"); | ||
214 | break; | ||
215 | } | ||
216 | } | ||
217 | smp_rmb(); | ||
218 | atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, m); | ||
219 | } | ||
220 | |||
221 | memset(mcelog.entry + prev, 0, (next - prev) * sizeof(*m)); | ||
222 | prev = next; | ||
223 | next = cmpxchg(&mcelog.next, prev, 0); | ||
224 | } while (next != prev); | ||
225 | } | ||
226 | |||
227 | |||
228 | void mce_register_decode_chain(struct notifier_block *nb) | ||
229 | { | ||
230 | atomic_notifier_chain_register(&x86_mce_decoder_chain, nb); | ||
231 | drain_mcelog_buffer(); | ||
232 | } | ||
233 | EXPORT_SYMBOL_GPL(mce_register_decode_chain); | ||
234 | |||
235 | void mce_unregister_decode_chain(struct notifier_block *nb) | ||
236 | { | ||
237 | atomic_notifier_chain_unregister(&x86_mce_decoder_chain, nb); | ||
238 | } | ||
239 | EXPORT_SYMBOL_GPL(mce_unregister_decode_chain); | ||
240 | |||
193 | static void print_mce(struct mce *m) | 241 | static void print_mce(struct mce *m) |
194 | { | 242 | { |
195 | int ret = 0; | 243 | int ret = 0; |
@@ -1770,7 +1818,7 @@ static struct syscore_ops mce_syscore_ops = { | |||
1770 | }; | 1818 | }; |
1771 | 1819 | ||
1772 | /* | 1820 | /* |
1773 | * mce_sysdev: Sysfs support | 1821 | * mce_device: Sysfs support |
1774 | */ | 1822 | */ |
1775 | 1823 | ||
1776 | static void mce_cpu_restart(void *data) | 1824 | static void mce_cpu_restart(void *data) |
@@ -1806,27 +1854,28 @@ static void mce_enable_ce(void *all) | |||
1806 | __mcheck_cpu_init_timer(); | 1854 | __mcheck_cpu_init_timer(); |
1807 | } | 1855 | } |
1808 | 1856 | ||
1809 | static struct sysdev_class mce_sysdev_class = { | 1857 | static struct bus_type mce_subsys = { |
1810 | .name = "machinecheck", | 1858 | .name = "machinecheck", |
1859 | .dev_name = "machinecheck", | ||
1811 | }; | 1860 | }; |
1812 | 1861 | ||
1813 | DEFINE_PER_CPU(struct sys_device, mce_sysdev); | 1862 | struct device *mce_device[CONFIG_NR_CPUS]; |
1814 | 1863 | ||
1815 | __cpuinitdata | 1864 | __cpuinitdata |
1816 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); | 1865 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); |
1817 | 1866 | ||
1818 | static inline struct mce_bank *attr_to_bank(struct sysdev_attribute *attr) | 1867 | static inline struct mce_bank *attr_to_bank(struct device_attribute *attr) |
1819 | { | 1868 | { |
1820 | return container_of(attr, struct mce_bank, attr); | 1869 | return container_of(attr, struct mce_bank, attr); |
1821 | } | 1870 | } |
1822 | 1871 | ||
1823 | static ssize_t show_bank(struct sys_device *s, struct sysdev_attribute *attr, | 1872 | static ssize_t show_bank(struct device *s, struct device_attribute *attr, |
1824 | char *buf) | 1873 | char *buf) |
1825 | { | 1874 | { |
1826 | return sprintf(buf, "%llx\n", attr_to_bank(attr)->ctl); | 1875 | return sprintf(buf, "%llx\n", attr_to_bank(attr)->ctl); |
1827 | } | 1876 | } |
1828 | 1877 | ||
1829 | static ssize_t set_bank(struct sys_device *s, struct sysdev_attribute *attr, | 1878 | static ssize_t set_bank(struct device *s, struct device_attribute *attr, |
1830 | const char *buf, size_t size) | 1879 | const char *buf, size_t size) |
1831 | { | 1880 | { |
1832 | u64 new; | 1881 | u64 new; |
@@ -1841,14 +1890,14 @@ static ssize_t set_bank(struct sys_device *s, struct sysdev_attribute *attr, | |||
1841 | } | 1890 | } |
1842 | 1891 | ||
1843 | static ssize_t | 1892 | static ssize_t |
1844 | show_trigger(struct sys_device *s, struct sysdev_attribute *attr, char *buf) | 1893 | show_trigger(struct device *s, struct device_attribute *attr, char *buf) |
1845 | { | 1894 | { |
1846 | strcpy(buf, mce_helper); | 1895 | strcpy(buf, mce_helper); |
1847 | strcat(buf, "\n"); | 1896 | strcat(buf, "\n"); |
1848 | return strlen(mce_helper) + 1; | 1897 | return strlen(mce_helper) + 1; |
1849 | } | 1898 | } |
1850 | 1899 | ||
1851 | static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr, | 1900 | static ssize_t set_trigger(struct device *s, struct device_attribute *attr, |
1852 | const char *buf, size_t siz) | 1901 | const char *buf, size_t siz) |
1853 | { | 1902 | { |
1854 | char *p; | 1903 | char *p; |
@@ -1863,8 +1912,8 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr, | |||
1863 | return strlen(mce_helper) + !!p; | 1912 | return strlen(mce_helper) + !!p; |
1864 | } | 1913 | } |
1865 | 1914 | ||
1866 | static ssize_t set_ignore_ce(struct sys_device *s, | 1915 | static ssize_t set_ignore_ce(struct device *s, |
1867 | struct sysdev_attribute *attr, | 1916 | struct device_attribute *attr, |
1868 | const char *buf, size_t size) | 1917 | const char *buf, size_t size) |
1869 | { | 1918 | { |
1870 | u64 new; | 1919 | u64 new; |
@@ -1887,8 +1936,8 @@ static ssize_t set_ignore_ce(struct sys_device *s, | |||
1887 | return size; | 1936 | return size; |
1888 | } | 1937 | } |
1889 | 1938 | ||
1890 | static ssize_t set_cmci_disabled(struct sys_device *s, | 1939 | static ssize_t set_cmci_disabled(struct device *s, |
1891 | struct sysdev_attribute *attr, | 1940 | struct device_attribute *attr, |
1892 | const char *buf, size_t size) | 1941 | const char *buf, size_t size) |
1893 | { | 1942 | { |
1894 | u64 new; | 1943 | u64 new; |
@@ -1910,108 +1959,117 @@ static ssize_t set_cmci_disabled(struct sys_device *s, | |||
1910 | return size; | 1959 | return size; |
1911 | } | 1960 | } |
1912 | 1961 | ||
1913 | static ssize_t store_int_with_restart(struct sys_device *s, | 1962 | static ssize_t store_int_with_restart(struct device *s, |
1914 | struct sysdev_attribute *attr, | 1963 | struct device_attribute *attr, |
1915 | const char *buf, size_t size) | 1964 | const char *buf, size_t size) |
1916 | { | 1965 | { |
1917 | ssize_t ret = sysdev_store_int(s, attr, buf, size); | 1966 | ssize_t ret = device_store_int(s, attr, buf, size); |
1918 | mce_restart(); | 1967 | mce_restart(); |
1919 | return ret; | 1968 | return ret; |
1920 | } | 1969 | } |
1921 | 1970 | ||
1922 | static SYSDEV_ATTR(trigger, 0644, show_trigger, set_trigger); | 1971 | static DEVICE_ATTR(trigger, 0644, show_trigger, set_trigger); |
1923 | static SYSDEV_INT_ATTR(tolerant, 0644, tolerant); | 1972 | static DEVICE_INT_ATTR(tolerant, 0644, tolerant); |
1924 | static SYSDEV_INT_ATTR(monarch_timeout, 0644, monarch_timeout); | 1973 | static DEVICE_INT_ATTR(monarch_timeout, 0644, monarch_timeout); |
1925 | static SYSDEV_INT_ATTR(dont_log_ce, 0644, mce_dont_log_ce); | 1974 | static DEVICE_INT_ATTR(dont_log_ce, 0644, mce_dont_log_ce); |
1926 | 1975 | ||
1927 | static struct sysdev_ext_attribute attr_check_interval = { | 1976 | static struct dev_ext_attribute dev_attr_check_interval = { |
1928 | _SYSDEV_ATTR(check_interval, 0644, sysdev_show_int, | 1977 | __ATTR(check_interval, 0644, device_show_int, store_int_with_restart), |
1929 | store_int_with_restart), | ||
1930 | &check_interval | 1978 | &check_interval |
1931 | }; | 1979 | }; |
1932 | 1980 | ||
1933 | static struct sysdev_ext_attribute attr_ignore_ce = { | 1981 | static struct dev_ext_attribute dev_attr_ignore_ce = { |
1934 | _SYSDEV_ATTR(ignore_ce, 0644, sysdev_show_int, set_ignore_ce), | 1982 | __ATTR(ignore_ce, 0644, device_show_int, set_ignore_ce), |
1935 | &mce_ignore_ce | 1983 | &mce_ignore_ce |
1936 | }; | 1984 | }; |
1937 | 1985 | ||
1938 | static struct sysdev_ext_attribute attr_cmci_disabled = { | 1986 | static struct dev_ext_attribute dev_attr_cmci_disabled = { |
1939 | _SYSDEV_ATTR(cmci_disabled, 0644, sysdev_show_int, set_cmci_disabled), | 1987 | __ATTR(cmci_disabled, 0644, device_show_int, set_cmci_disabled), |
1940 | &mce_cmci_disabled | 1988 | &mce_cmci_disabled |
1941 | }; | 1989 | }; |
1942 | 1990 | ||
1943 | static struct sysdev_attribute *mce_sysdev_attrs[] = { | 1991 | static struct device_attribute *mce_device_attrs[] = { |
1944 | &attr_tolerant.attr, | 1992 | &dev_attr_tolerant.attr, |
1945 | &attr_check_interval.attr, | 1993 | &dev_attr_check_interval.attr, |
1946 | &attr_trigger, | 1994 | &dev_attr_trigger, |
1947 | &attr_monarch_timeout.attr, | 1995 | &dev_attr_monarch_timeout.attr, |
1948 | &attr_dont_log_ce.attr, | 1996 | &dev_attr_dont_log_ce.attr, |
1949 | &attr_ignore_ce.attr, | 1997 | &dev_attr_ignore_ce.attr, |
1950 | &attr_cmci_disabled.attr, | 1998 | &dev_attr_cmci_disabled.attr, |
1951 | NULL | 1999 | NULL |
1952 | }; | 2000 | }; |
1953 | 2001 | ||
1954 | static cpumask_var_t mce_sysdev_initialized; | 2002 | static cpumask_var_t mce_device_initialized; |
2003 | |||
2004 | static void mce_device_release(struct device *dev) | ||
2005 | { | ||
2006 | kfree(dev); | ||
2007 | } | ||
1955 | 2008 | ||
1956 | /* Per cpu sysdev init. All of the cpus still share the same ctrl bank: */ | 2009 | /* Per cpu device init. All of the cpus still share the same ctrl bank: */ |
1957 | static __cpuinit int mce_sysdev_create(unsigned int cpu) | 2010 | static __cpuinit int mce_device_create(unsigned int cpu) |
1958 | { | 2011 | { |
1959 | struct sys_device *sysdev = &per_cpu(mce_sysdev, cpu); | 2012 | struct device *dev; |
1960 | int err; | 2013 | int err; |
1961 | int i, j; | 2014 | int i, j; |
1962 | 2015 | ||
1963 | if (!mce_available(&boot_cpu_data)) | 2016 | if (!mce_available(&boot_cpu_data)) |
1964 | return -EIO; | 2017 | return -EIO; |
1965 | 2018 | ||
1966 | memset(&sysdev->kobj, 0, sizeof(struct kobject)); | 2019 | dev = kzalloc(sizeof *dev, GFP_KERNEL); |
1967 | sysdev->id = cpu; | 2020 | if (!dev) |
1968 | sysdev->cls = &mce_sysdev_class; | 2021 | return -ENOMEM; |
2022 | dev->id = cpu; | ||
2023 | dev->bus = &mce_subsys; | ||
2024 | dev->release = &mce_device_release; | ||
1969 | 2025 | ||
1970 | err = sysdev_register(sysdev); | 2026 | err = device_register(dev); |
1971 | if (err) | 2027 | if (err) |
1972 | return err; | 2028 | return err; |
1973 | 2029 | ||
1974 | for (i = 0; mce_sysdev_attrs[i]; i++) { | 2030 | for (i = 0; mce_device_attrs[i]; i++) { |
1975 | err = sysdev_create_file(sysdev, mce_sysdev_attrs[i]); | 2031 | err = device_create_file(dev, mce_device_attrs[i]); |
1976 | if (err) | 2032 | if (err) |
1977 | goto error; | 2033 | goto error; |
1978 | } | 2034 | } |
1979 | for (j = 0; j < banks; j++) { | 2035 | for (j = 0; j < banks; j++) { |
1980 | err = sysdev_create_file(sysdev, &mce_banks[j].attr); | 2036 | err = device_create_file(dev, &mce_banks[j].attr); |
1981 | if (err) | 2037 | if (err) |
1982 | goto error2; | 2038 | goto error2; |
1983 | } | 2039 | } |
1984 | cpumask_set_cpu(cpu, mce_sysdev_initialized); | 2040 | cpumask_set_cpu(cpu, mce_device_initialized); |
2041 | mce_device[cpu] = dev; | ||
1985 | 2042 | ||
1986 | return 0; | 2043 | return 0; |
1987 | error2: | 2044 | error2: |
1988 | while (--j >= 0) | 2045 | while (--j >= 0) |
1989 | sysdev_remove_file(sysdev, &mce_banks[j].attr); | 2046 | device_remove_file(dev, &mce_banks[j].attr); |
1990 | error: | 2047 | error: |
1991 | while (--i >= 0) | 2048 | while (--i >= 0) |
1992 | sysdev_remove_file(sysdev, mce_sysdev_attrs[i]); | 2049 | device_remove_file(dev, mce_device_attrs[i]); |
1993 | 2050 | ||
1994 | sysdev_unregister(sysdev); | 2051 | device_unregister(dev); |
1995 | 2052 | ||
1996 | return err; | 2053 | return err; |
1997 | } | 2054 | } |
1998 | 2055 | ||
1999 | static __cpuinit void mce_sysdev_remove(unsigned int cpu) | 2056 | static __cpuinit void mce_device_remove(unsigned int cpu) |
2000 | { | 2057 | { |
2001 | struct sys_device *sysdev = &per_cpu(mce_sysdev, cpu); | 2058 | struct device *dev = mce_device[cpu]; |
2002 | int i; | 2059 | int i; |
2003 | 2060 | ||
2004 | if (!cpumask_test_cpu(cpu, mce_sysdev_initialized)) | 2061 | if (!cpumask_test_cpu(cpu, mce_device_initialized)) |
2005 | return; | 2062 | return; |
2006 | 2063 | ||
2007 | for (i = 0; mce_sysdev_attrs[i]; i++) | 2064 | for (i = 0; mce_device_attrs[i]; i++) |
2008 | sysdev_remove_file(sysdev, mce_sysdev_attrs[i]); | 2065 | device_remove_file(dev, mce_device_attrs[i]); |
2009 | 2066 | ||
2010 | for (i = 0; i < banks; i++) | 2067 | for (i = 0; i < banks; i++) |
2011 | sysdev_remove_file(sysdev, &mce_banks[i].attr); | 2068 | device_remove_file(dev, &mce_banks[i].attr); |
2012 | 2069 | ||
2013 | sysdev_unregister(sysdev); | 2070 | device_unregister(dev); |
2014 | cpumask_clear_cpu(cpu, mce_sysdev_initialized); | 2071 | cpumask_clear_cpu(cpu, mce_device_initialized); |
2072 | mce_device[cpu] = NULL; | ||
2015 | } | 2073 | } |
2016 | 2074 | ||
2017 | /* Make sure there are no machine checks on offlined CPUs. */ | 2075 | /* Make sure there are no machine checks on offlined CPUs. */ |
@@ -2061,7 +2119,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
2061 | switch (action) { | 2119 | switch (action) { |
2062 | case CPU_ONLINE: | 2120 | case CPU_ONLINE: |
2063 | case CPU_ONLINE_FROZEN: | 2121 | case CPU_ONLINE_FROZEN: |
2064 | mce_sysdev_create(cpu); | 2122 | mce_device_create(cpu); |
2065 | if (threshold_cpu_callback) | 2123 | if (threshold_cpu_callback) |
2066 | threshold_cpu_callback(action, cpu); | 2124 | threshold_cpu_callback(action, cpu); |
2067 | break; | 2125 | break; |
@@ -2069,7 +2127,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
2069 | case CPU_DEAD_FROZEN: | 2127 | case CPU_DEAD_FROZEN: |
2070 | if (threshold_cpu_callback) | 2128 | if (threshold_cpu_callback) |
2071 | threshold_cpu_callback(action, cpu); | 2129 | threshold_cpu_callback(action, cpu); |
2072 | mce_sysdev_remove(cpu); | 2130 | mce_device_remove(cpu); |
2073 | break; | 2131 | break; |
2074 | case CPU_DOWN_PREPARE: | 2132 | case CPU_DOWN_PREPARE: |
2075 | case CPU_DOWN_PREPARE_FROZEN: | 2133 | case CPU_DOWN_PREPARE_FROZEN: |
@@ -2103,7 +2161,7 @@ static __init void mce_init_banks(void) | |||
2103 | 2161 | ||
2104 | for (i = 0; i < banks; i++) { | 2162 | for (i = 0; i < banks; i++) { |
2105 | struct mce_bank *b = &mce_banks[i]; | 2163 | struct mce_bank *b = &mce_banks[i]; |
2106 | struct sysdev_attribute *a = &b->attr; | 2164 | struct device_attribute *a = &b->attr; |
2107 | 2165 | ||
2108 | sysfs_attr_init(&a->attr); | 2166 | sysfs_attr_init(&a->attr); |
2109 | a->attr.name = b->attrname; | 2167 | a->attr.name = b->attrname; |
@@ -2123,16 +2181,16 @@ static __init int mcheck_init_device(void) | |||
2123 | if (!mce_available(&boot_cpu_data)) | 2181 | if (!mce_available(&boot_cpu_data)) |
2124 | return -EIO; | 2182 | return -EIO; |
2125 | 2183 | ||
2126 | zalloc_cpumask_var(&mce_sysdev_initialized, GFP_KERNEL); | 2184 | zalloc_cpumask_var(&mce_device_initialized, GFP_KERNEL); |
2127 | 2185 | ||
2128 | mce_init_banks(); | 2186 | mce_init_banks(); |
2129 | 2187 | ||
2130 | err = sysdev_class_register(&mce_sysdev_class); | 2188 | err = subsys_system_register(&mce_subsys, NULL); |
2131 | if (err) | 2189 | if (err) |
2132 | return err; | 2190 | return err; |
2133 | 2191 | ||
2134 | for_each_online_cpu(i) { | 2192 | for_each_online_cpu(i) { |
2135 | err = mce_sysdev_create(i); | 2193 | err = mce_device_create(i); |
2136 | if (err) | 2194 | if (err) |
2137 | return err; | 2195 | return err; |
2138 | } | 2196 | } |