log_buf_len_setup() is called on the start_kernel->parse_args() path. It must not enable interrupts. kernel/printk.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff -puN kernel/printk.c~log_buf_len_setup-irq-fix kernel/printk.c --- 25/kernel/printk.c~log_buf_len_setup-irq-fix 2003-12-24 04:17:33.000000000 -0800 +++ 25-akpm/kernel/printk.c 2003-12-24 04:17:33.000000000 -0800 @@ -150,6 +150,7 @@ __setup("console=", console_setup); static int __init log_buf_len_setup(char *str) { unsigned long size = memparse(str, &str); + unsigned long flags; if (size > log_buf_len) { unsigned long start, dest_idx, offset; @@ -161,7 +162,7 @@ static int __init log_buf_len_setup(char goto out; } - spin_lock_irq(&logbuf_lock); + spin_lock_irqsave(&logbuf_lock, flags); log_buf_len = size; log_buf = new_log_buf; @@ -175,7 +176,7 @@ static int __init log_buf_len_setup(char log_start -= offset; con_start -= offset; log_end -= offset; - spin_unlock_irq(&logbuf_lock); + spin_unlock_irqrestore(&logbuf_lock, flags); printk("log_buf_len: %d\n", log_buf_len); } _