Commit d53948eb authored by Mikael Pettersson's avatar Mikael Pettersson Committed by Linus Torvalds

[PATCH] shrink check_nmi_watchdog stack frame

This patch for 2.5.28 reduces the stack frame size of
arch/i386/kernel/nmi.c:check_nmi_watchdog() from 4096 bytes
in the worst case to 128 bytes.

The problem with the current code is that it copies the entire
irq_stat[] array, when only a single field (__nmi_count) is of
interest. The irq_stat_t element type is only 28 bytes, but it
is also ____cacheline_aligned, and that blows the array up to
4096 bytes on SMP P4 Xeons, 2048 bytes on SMP K7s, and 1024 bytes
on SMP P5/P6s. The patch reduces this to NR_CPUS*4==128 bytes.
parent a94a3303
...@@ -72,19 +72,20 @@ extern void show_registers(struct pt_regs *regs); ...@@ -72,19 +72,20 @@ extern void show_registers(struct pt_regs *regs);
int __init check_nmi_watchdog (void) int __init check_nmi_watchdog (void)
{ {
irq_cpustat_t tmp[NR_CPUS]; unsigned int prev_nmi_count[NR_CPUS];
int cpu; int cpu;
printk(KERN_INFO "testing NMI watchdog ... "); printk(KERN_INFO "testing NMI watchdog ... ");
memcpy(tmp, irq_stat, sizeof(tmp)); for (cpu = 0; cpu < NR_CPUS; cpu++)
prev_nmi_count[cpu] = irq_stat[cpu].__nmi_count;
local_irq_enable(); local_irq_enable();
mdelay((10*1000)/nmi_hz); // wait 10 ticks mdelay((10*1000)/nmi_hz); // wait 10 ticks
for (cpu = 0; cpu < NR_CPUS; cpu++) { for (cpu = 0; cpu < NR_CPUS; cpu++) {
if (!cpu_online(cpu)) if (!cpu_online(cpu))
continue; continue;
if (nmi_count(cpu) - tmp[cpu].__nmi_count <= 5) { if (nmi_count(cpu) - prev_nmi_count[cpu] <= 5) {
printk("CPU#%d: NMI appears to be stuck!\n", cpu); printk("CPU#%d: NMI appears to be stuck!\n", cpu);
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment