From: Zwane Mwaikambo In really bad conditions this can keep printing for a while, throttle the output somewhat. Also change the "CPU%d" formatting to better match the other boot output. --- 25-akpm/arch/i386/kernel/cpu/mcheck/p4.c | 30 ++++++++++++++++++++---------- 1 files changed, 20 insertions(+), 10 deletions(-) diff -puN arch/i386/kernel/cpu/mcheck/p4.c~throttle-p4-thermal-warnings arch/i386/kernel/cpu/mcheck/p4.c --- 25/arch/i386/kernel/cpu/mcheck/p4.c~throttle-p4-thermal-warnings 2004-04-30 21:16:31.482030336 -0700 +++ 25-akpm/arch/i386/kernel/cpu/mcheck/p4.c 2004-04-30 21:19:10.982782536 -0700 @@ -38,7 +38,8 @@ static int mce_num_extended_msrs = 0; #ifdef CONFIG_X86_MCE_P4THERMAL static void unexpected_thermal_interrupt(struct pt_regs *regs) { - printk(KERN_ERR "CPU#%d: Unexpected LVT TMR interrupt!\n", smp_processor_id()); + printk(KERN_ERR "CPU%d: Unexpected LVT TMR interrupt!\n", + smp_processor_id()); } /* P4/Xeon Thermal transition interrupt handler */ @@ -46,15 +47,21 @@ static void intel_thermal_interrupt(stru { u32 l, h; unsigned int cpu = smp_processor_id(); + static unsigned long next[NR_CPUS]; ack_APIC_irq(); - rdmsr (MSR_IA32_THERM_STATUS, l, h); - if (l & 1) { - printk(KERN_EMERG "CPU#%d: Temperature above threshold\n", cpu); - printk(KERN_EMERG "CPU#%d: Running in modulated clock mode\n", cpu); + if (time_after(next[cpu], jiffies)) + return; + + next[cpu] = jiffies + HZ*5; + rdmsr(MSR_IA32_THERM_STATUS, l, h); + if (l & 0x1) { + printk(KERN_EMERG "CPU%d: Temperature above threshold\n", cpu); + printk(KERN_EMERG "CPU%d: Running in modulated clock mode\n", + cpu); } else { - printk(KERN_INFO "CPU#%d: Temperature/speed normal\n", cpu); + printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu); } } @@ -89,13 +96,15 @@ static void __init intel_init_thermal(st rdmsr (MSR_IA32_MISC_ENABLE, l, h); h = apic_read(APIC_LVTTHMR); if ((l & (1<<3)) && (h & APIC_DM_SMI)) { - printk(KERN_DEBUG "CPU#%d: Thermal monitoring handled by SMI\n", cpu); + printk(KERN_DEBUG "CPU%d: Thermal monitoring handled by SMI\n", + cpu); return; /* -EBUSY */ } /* check whether a vector already exists, temporarily masked? */ if (h & APIC_VECTOR_MASK) { - printk(KERN_DEBUG "CPU#%d: Thermal LVT vector (%#x) already installed\n", + printk(KERN_DEBUG "CPU%d: Thermal LVT vector (%#x) already " + "installed\n", cpu, (h & APIC_VECTOR_MASK)); return; /* -EBUSY */ } @@ -116,7 +125,7 @@ static void __init intel_init_thermal(st l = apic_read (APIC_LVTTHMR); apic_write_around (APIC_LVTTHMR, l & ~APIC_LVT_MASKED); - printk (KERN_INFO "CPU#%d: Thermal monitoring enabled\n", cpu); + printk (KERN_INFO "CPU%d: Thermal monitoring enabled\n", cpu); return; } #endif /* CONFIG_X86_MCE_P4THERMAL */ @@ -247,7 +256,8 @@ void __init intel_p4_mcheck_init(struct rdmsr (MSR_IA32_MCG_CAP, l, h); if (l & (1<<9)) {/* MCG_EXT_P */ mce_num_extended_msrs = (l >> 16) & 0xff; - printk (KERN_INFO "CPU#%d: Intel P4/Xeon Extended MCE MSRs (%d) available\n", + printk (KERN_INFO "CPU%d: Intel P4/Xeon Extended MCE MSRs (%d)" + " available\n", smp_processor_id(), mce_num_extended_msrs); #ifdef CONFIG_X86_MCE_P4THERMAL _