[PATCH][2.6] throttle P4 thermal warnings

From: Zwane Mwaikambo
Date: Fri Apr 30 2004 - 09:23:21 EST


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.

Index: linux-2.6.6-rc2-mm2/arch/i386/kernel/cpu/mcheck/p4.c
===================================================================
RCS file: /home/cvsroot/linux-2.6.6-rc2-mm2/arch/i386/kernel/cpu/mcheck/p4.c,v
retrieving revision 1.1.1.1
diff -u -p -B -r1.1.1.1 p4.c
--- linux-2.6.6-rc2-mm2/arch/i386/kernel/cpu/mcheck/p4.c 26 Apr 2004 16:55:53 -0000 1.1.1.1
+++ linux-2.6.6-rc2-mm2/arch/i386/kernel/cpu/mcheck/p4.c 30 Apr 2004 12:51:51 -0000
@@ -38,7 +38,7 @@ 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 +46,20 @@ 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 +94,13 @@ 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 +121,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 +252,7 @@ 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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/