]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
x86, mce: support more than 256 CPUs in struct mce
authorAndi Kleen <andi@firstfloor.org>
Wed, 27 May 2009 19:56:56 +0000 (21:56 +0200)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 3 Jun 2009 21:40:38 +0000 (14:40 -0700)
The old struct mce had a limitation to 256 CPUs. But x86 Linux supports
more than that now with x2apic. Add a new field extcpu to report the
extended number.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/mce.h
arch/x86/kernel/cpu/mcheck/mce-inject.c
arch/x86/kernel/cpu/mcheck/mce.c

index 0a61946d4396a71095e0564b33daaff634aa55e1..b4a04b60b7409ae75a406c739f7bffbd8c01cac5 100644 (file)
@@ -40,9 +40,9 @@ struct mce {
        __u64 res2;     /* dito. */
        __u8  cs;               /* code segment */
        __u8  bank;     /* machine check bank */
-       __u8  cpu;      /* cpu that raised the error */
+       __u8  cpu;      /* cpu number; obsolete; use extcpu now */
        __u8  finished;   /* entry is valid */
-       __u32 pad;
+       __u32 extcpu;   /* linux cpu number that detected the error */
 };
 
 /*
index 7b3a5428396ace58945ac9a4b4e3ca805b5e51ab..7d858fb4ce676c1855fffbac279914e837a1aa56 100644 (file)
 /* Update fake mce registers on current CPU. */
 static void inject_mce(struct mce *m)
 {
-       struct mce *i = &per_cpu(injectm, m->cpu);
+       struct mce *i = &per_cpu(injectm, m->extcpu);
 
        /* Make sure noone reads partially written injectm */
        i->finished = 0;
        mb();
        m->finished = 0;
        /* First set the fields after finished */
-       i->cpu = m->cpu;
+       i->extcpu = m->extcpu;
        mb();
        /* Now write record in order, finished last (except above) */
        memcpy(i, m, sizeof(struct mce));
@@ -49,7 +49,7 @@ static void raise_mce(unsigned long data)
 {
        struct delayed_mce *dm = (struct delayed_mce *)data;
        struct mce *m = &dm->m;
-       int cpu = m->cpu;
+       int cpu = m->extcpu;
 
        inject_mce(m);
        if (m->status & MCI_STATUS_UC) {
@@ -93,7 +93,7 @@ static ssize_t mce_write(struct file *filp, const char __user *ubuf,
        if (copy_from_user(&m, ubuf, usize))
                return -EFAULT;
 
-       if (m.cpu >= num_possible_cpus() || !cpu_online(m.cpu))
+       if (m.extcpu >= num_possible_cpus() || !cpu_online(m.extcpu))
                return -EINVAL;
 
        dm = kmalloc(sizeof(struct delayed_mce), GFP_KERNEL);
@@ -108,7 +108,7 @@ static ssize_t mce_write(struct file *filp, const char __user *ubuf,
        memcpy(&dm->m, &m, sizeof(struct mce));
        setup_timer(&dm->timer, raise_mce, (unsigned long)dm);
        dm->timer.expires = jiffies + 2;
-       add_timer_on(&dm->timer, m.cpu);
+       add_timer_on(&dm->timer, m.extcpu);
        return usize;
 }
 
index 3db047e7a0fb93eb6d6df543019ecf3c55b2bcd4..2c4dd6c422c3a0dd1b822cd1223ebe6aad5329a2 100644 (file)
@@ -94,7 +94,7 @@ static inline int skip_bank_init(int i)
 void mce_setup(struct mce *m)
 {
        memset(m, 0, sizeof(struct mce));
-       m->cpu = smp_processor_id();
+       m->cpu = m->extcpu = smp_processor_id();
        rdtscll(m->tsc);
 }
 
@@ -158,7 +158,7 @@ static void print_mce(struct mce *m)
               KERN_EMERG "HARDWARE ERROR\n"
               KERN_EMERG
               "CPU %d: Machine Check Exception: %16Lx Bank %d: %016Lx\n",
-              m->cpu, m->mcgstatus, m->bank, m->status);
+              m->extcpu, m->mcgstatus, m->bank, m->status);
        if (m->ip) {
                printk(KERN_EMERG "RIP%s %02x:<%016Lx> ",
                       !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "",