The ia64_mca_cpe_int_handler() in 2.6.24 goes something like this: ia64_mca_cpe_int_handler (int cpe_irq, void *arg) { ... /* SAL spec states this should run w/ interrupts enabled */ local_irq_enable(); spin_lock(&cpe_history_lock); ... spin_unlock(&cpe_history_lock); ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); } I think the interrupts are enabled too early. I just have caught a dead lock: I have got nested ia64_mca_cpe_int_handler()-s, the first instance has been interrupted somewhere between spin_lock(&cpe_history_lock) and spin_unlock(&cpe_history_lock). Obviously, the second instance will never get the lock. The previous versions, e.g. 2.6.18, were not safe either: ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs) { ... /* SAL spec states this should run w/ interrupts enabled */ local_irq_enable(); /* Get the CPE error record and log it */ ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); spin_lock(&cpe_history_lock); ... spin_unlock(&cpe_history_lock); } I think the interrupts have to be blocked while we are inside the lock- protected region. I can think of something like this below. Please have a look at this patch. Thanks, Zoltan Menyhart