Re: [PATCH 05/10] MCE: Mask out address mask bits below address granuality

Hidetoshi Seto
2011-06-10T08:07:44Z

(2011/06/10 6:33), Luck, Tony wrote:
> From: Andi Kleen <andi@firstfloor.org>
>
> SER enabled systems report the address granuality for each
> reported address in a machine check. But the bits below
> the granuality are undefined. Mask them out before
> logging the machine check.
>
> Signed-off-by: Andi Kleen <ak@linux.intel.com>
> Signed-off-by: Tony Luck <tony.luck@intel.com>
> ---
> arch/x86/kernel/cpu/mcheck/mce.c | 12 +++++++++++-
> 1 files changed, 11 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
> index 0349e87..ffc8d11 100644
> --- a/arch/x86/kernel/cpu/mcheck/mce.c
> +++ b/arch/x86/kernel/cpu/mcheck/mce.c
> @@ -539,8 +539,18 @@ static void mce_read_aux(struct mce *m, int i)
> {
> if (m->status & MCI_STATUS_MISCV)
> m->misc = mce_rdmsrl(MSR_IA32_MCx_MISC(i));
> - if (m->status & MCI_STATUS_ADDRV)
> + if (m->status & MCI_STATUS_ADDRV) {
> m->addr = mce_rdmsrl(MSR_IA32_MCx_ADDR(i));
> +
> + /*
> + * Mask the reported address by the reported granuality.
> + */
> + if (mce_ser && (m->status & MCI_STATUS_MISCV)) {
> + u8 shift = m->misc & 0x1f;
> + m->addr >>= shift;
> + m->addr <<= shift;
> + }
> + }
> }
>
> DEFINE_PER_CPU(unsigned, mce_poll_count);

Why do you have to mask it out in kernel, why not in user/logger?

One possible story is:
"... the brand-new Xeon XXXX has new MCx_***_VALID bit in ****
register, if it is set the lower bits of MCx_ADDR indicates
****, otherwise the bits are undefined ..."

So I think that kernel should convey the raw value from hardware to
userland. Even if it contains some noise on it, user can determine
whether it is useful or not. And more, since this is an error record,
there will be no second chance to retrieve the data afterward.

Thanks,
H.Seto