diff -ubrN linux-clean/arch/i386/kernel/ksyms.c linux/arch/i386/kernel/ksyms.c --- linux-clean/arch/i386/kernel/ksyms.c Tue Apr 8 11:47:45 1997 +++ linux/arch/i386/kernel/ksyms.c Wed Sep 10 18:25:16 1997 @@ -23,6 +23,7 @@ X(kernel_flag), X(kernel_counter), X(active_kernel_processor), + X(saved_active_kernel_processor), X(smp_invalidate_needed), #endif #include diff -ubrN linux-clean/include/asm-i386/smp.h linux/include/asm-i386/smp.h --- linux-clean/include/asm-i386/smp.h Fri Apr 26 03:37:21 1996 +++ linux/include/asm-i386/smp.h Wed Sep 10 18:27:19 1997 @@ -188,6 +188,7 @@ extern volatile unsigned long kernel_flag, kernel_counter; extern volatile unsigned long cpu_callin_map[NR_CPUS]; extern volatile unsigned char active_kernel_processor; +extern volatile unsigned char saved_active_kernel_processor; extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); extern void smp_reschedule_irq(int cpl, struct pt_regs *regs); extern unsigned long ipi_count; diff -ubrN linux-clean/include/asm-i386/smp_lock.h linux/include/asm-i386/smp_lock.h --- linux-clean/include/asm-i386/smp_lock.h Wed Apr 3 02:59:32 1996 +++ linux/include/asm-i386/smp_lock.h Wed Sep 10 18:24:17 1997 @@ -33,6 +33,12 @@ if (test_bit(proc, (void *)&smp_invalidate_needed)) if (clear_bit(proc, (void *)&smp_invalidate_needed)) local_flush_tlb(); + /* Enable interrupts for a moment while waiting + * to allow things like the timer to run. */ + __asm__("sti;" + "nop;" + "cli;"); + } while(test_bit(0, (void *)&kernel_flag)); } @@ -59,7 +65,8 @@ if(! --kernel_counter) { - active_kernel_processor = NO_PROC_ID; + active_kernel_processor = saved_active_kernel_processor; + if (active_kernel_processor == NO_PROC_ID) clear_bit(0, (void *)&kernel_flag); } restore_flags(flags);