x86: mce, inject: Use real inject-msg in raise_local
Current raise_local() uses a struct mce that comes from mce_write() as a parameter instead of the real inject-msg, so when we set mce.finished = 0 to clear injected MCE, the real inject stays valid. This will cause the remaining inject-msg affect the next injection, which is not desired. To fix this, real inject-msg is used in raise_local instead of the one on the stack. This patch is based on the diagnosis and the fixes by Dean Nelson. Reported-by: Dean Nelson <dnelson@redhat.com> Signed-off-by: Huang Ying <ying.huang@intel.com> Cc: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Cc: Andi Kleen <ak@linux.intel.com> LKML-Reference: <1253601357.15717.757.camel@yhuang-dev.sh.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
b417c9fd86
Коммит
14c0abf14a
|
@ -98,8 +98,9 @@ static struct notifier_block mce_raise_nb = {
|
|||
};
|
||||
|
||||
/* Inject mce on current CPU */
|
||||
static int raise_local(struct mce *m)
|
||||
static int raise_local(void)
|
||||
{
|
||||
struct mce *m = &__get_cpu_var(injectm);
|
||||
int context = MCJ_CTX(m->inject_flags);
|
||||
int ret = 0;
|
||||
int cpu = m->extcpu;
|
||||
|
@ -167,12 +168,12 @@ static void raise_mce(struct mce *m)
|
|||
}
|
||||
cpu_relax();
|
||||
}
|
||||
raise_local(m);
|
||||
raise_local();
|
||||
put_cpu();
|
||||
put_online_cpus();
|
||||
} else
|
||||
#endif
|
||||
raise_local(m);
|
||||
raise_local();
|
||||
}
|
||||
|
||||
/* Error injection interface */
|
||||
|
|
Загрузка…
Ссылка в новой задаче