[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Machine Check Exception?



On Tue, Apr 15, 2008 at 10:59:18PM +0200, Dario D. wrote:

>> con quali kernel riesci ad andare senza "nomce"?
>
> A questo punto, nessuno.
> A parte il "muletto" del SystemRescueCd (detto anche "alternativo").
> Ma, credo, perchè ha il "nomce" attivato.

Allora, scaricato al volo SystemRescueCd, lanciato con qemu e verificato
in /proc/config.gz che in effetti il kernel ha il flag CONFIG_X86_MCE
non attivato.

Per rassicurarti sul fatto che puoi tranquillamente usare la macchina
con l'opzione "nomce" senza perdita di performance, ho visto ora in giro
che knoppix è avviato di default con "nomce", e anche qui [1] su gentoo
è scritto:

"nomce  Already out of kernel since it doesn't affect performance.
MCE=Machine Check Exception allows the processor to notify the kernel if
it detects a problem (e.g. overheating, component failure). The action
the kernel takes depends on the severity of the problem."

Ti ricordo anche che nella descrizione del flag nel kernel [2] è
scritto:

"Note that some older Pentium systems have a design flaw which leads to
false MCE events - hence MCE is disabled on all P5 processors, unless
explicitly enabled with "mce" as a boot argument.  Similarly, if MCE is
built in and creates a problem on some new non-standard machine, you can
boot with "nomce" to disable it."

Per un poco di chiarenzza, puoi dare uno sguardo a [3], dove vedrai che
l'opzione "nomce" in pratica imposta mce_disabled=1, ovvero disabilita
la funzione mcheck_init() (poco più in alto), funzione generica che
richiama una delle diverse *_mcheck_init() relative all'inizializzazione
del Machine Check Exception per specifiche cpu Amd e Intel.  La stessa
cosa accade impostando CONFIG_X86_MCE=n, infatti in [4] viene definita
una mcheck_init() vuota in questo modo:

#ifdef CONFIG_X86_MCE
extern void mcheck_init(struct cpuinfo_x86 *c);
#else
#define mcheck_init(c) do {} while(0)
#endif

Se spulci i files sotto [5], soprattutto quelli che riguardano
architetture x86_64, vedrai il codice lato kernel scritto da Andi Kleen,
autore di mcelog, che permette a quest'ultimo programma di andare a
leggere in user space i messaggi del kernel in /dev/mcelog sugli x86_64.

Infine, se hai voglia di vedere in quale punto si pianta esattamente il
kernel quando compare quella scritta (e non so quanto sia felice giocare
a far piantare il kernel sulla tua macchina personale), puoi giocare con
uno tra [6] [7] [8] (non so come identificare la cpu con esattezza, puoi
provarli uno alla volta!), modificando le funzioni specifiche
*_mcheck_init() di cui scrivevo prima: noterai la scritta che leggi
prima del freeze, e poche righe dopo, in ogni funzione, un ciclo for
simile:

	for (i=1; i<nr_mce_banks; i++)
		wrmsr (MSR_IA32_MC0_CTL+4*i, 0xffffffff, 0xffffffff);

Questo sembra essere il problema noto sin dal 2.4 e da allora risolvibile
solo con "nomce". Questo l'ho scoperto leggendo [9] [10] [11] (nota che
hanno tutti un P3 Katmai...).

Spero davvero di esserti stato utile (e di non aver scritto cavolate ;).
Se dovesso scroprire ancora qualcosa, magari provando altre distro,
tienimi aggiornato.

Cristian


[1] http://www.xs4all.nl/~wegewijs/linux/IBM-Thinkpad-A31/IBM-Thinkpad-A31.html
[2] linux-2.6.24/arch/x86/Kconfig
[3] linux-2.6.24/arch/x86/kernel/cpu/mcheck/mce_32.c
[4] linux-2.6.24/include/asm-x86/mce.h
[5] linux-2.6.24/arx/x86/kernel/cpu/mcheck/
[6] linux-2.6.24/rch/x86/kernel/cpu/mcheck/k7.c
[7] linux-2.6.24/rch/x86/kernel/cpu/mcheck/p4.c
[8] linux-2.6.24/rch/x86/kernel/cpu/mcheck/p6.c
[9] http://www.ussg.iu.edu/hypermail/linux/kernel/0203.1/0560.html
[10] http://search.luky.org/linux-kernel.2002/msg17386.html
[11] http://lkml.org/lkml/2002/3/18/178


Reply to: