--- patch-2.6.12-9.23 2005-11-15 12:04:40.000000000 -0800 +++ patch-2.6.12-9.23-good 2005-11-15 12:38:56.000000000 -0800 @@ -6759,141 +6759,6 @@ bits = 0; while ((1 << bits) < c->x86_num_cores) -diff -Nur linux-source-2.6.12-2.6.12.orig/arch/x86_64/kernel/smp.c linux-source-2.6.12-2.6.12-9.23/arch/x86_64/kernel/smp.c ---- linux-source-2.6.12-2.6.12.orig/arch/x86_64/kernel/smp.c 2005-06-17 20:48:29.000000000 +0100 -+++ linux-source-2.6.12-2.6.12-9.23/arch/x86_64/kernel/smp.c 2005-10-10 13:12:25.754357737 +0100 -@@ -284,6 +284,71 @@ - static struct call_data_struct * call_data; - - /* -+ * this function sends a 'generic call function' IPI to one other CPU -+ * in the system. -+ */ -+static void __smp_call_function_single (int cpu, void (*func) (void *info), void *info, -+ int nonatomic, int wait) -+{ -+ struct call_data_struct data; -+ int cpus = 1; -+ -+ data.func = func; -+ data.info = info; -+ atomic_set(&data.started, 0); -+ data.wait = wait; -+ if (wait) -+ atomic_set(&data.finished, 0); -+ -+ call_data = &data; -+ wmb(); -+ /* Send a message to all other CPUs and wait for them to respond */ -+ send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR); -+ -+ /* Wait for response */ -+ while (atomic_read(&data.started) != cpus) -+ cpu_relax(); -+ -+ if (!wait) -+ return; -+ -+ while (atomic_read(&data.finished) != cpus) -+ cpu_relax(); -+} -+ -+/* -+ * Run a function on another CPU -+ * The function to run. This must be fast and non-blocking. -+ * An arbitrary pointer to pass to the function. -+ * Currently unused. -+ * If true, wait until function has completed on other CPUs. -+ * [RETURNS] 0 on success, else a negative status code. -+ * -+ * Does not return until the remote CPU is nearly ready to execute -+ * or is or has executed. -+ */ -+ -+int smp_call_function_single (int cpu, void (*func) (void *info), void *info, -+ int nonatomic, int wait) -+{ -+ -+ int me = get_cpu(); /* prevent preemption and reschedule on another processor */ -+ -+ if (cpu == me) { -+ printk("%s: trying to call self\n", __func__); -+ put_cpu(); -+ return -EBUSY; -+ } -+ spin_lock_bh(&call_lock); -+ -+ __smp_call_function_single(cpu, func,info,nonatomic,wait); -+ -+ spin_unlock_bh(&call_lock); -+ put_cpu(); -+ return 0; -+} -+ -+/* - * this function sends a 'generic call function' IPI to all other CPUs - * in the system. - */ -diff -Nur linux-source-2.6.12-2.6.12.orig/arch/x86_64/kernel/smpboot.c linux-source-2.6.12-2.6.12-9.23/arch/x86_64/kernel/smpboot.c ---- linux-source-2.6.12-2.6.12.orig/arch/x86_64/kernel/smpboot.c 2005-06-17 20:48:29.000000000 +0100 -+++ linux-source-2.6.12-2.6.12-9.23/arch/x86_64/kernel/smpboot.c 2005-10-10 13:12:25.754357737 +0100 -@@ -202,9 +202,6 @@ - { - unsigned long flags, i; - -- if (smp_processor_id() != boot_cpu_id) -- return; -- - go[MASTER] = 0; - - local_irq_save(flags); -@@ -253,7 +250,7 @@ - return tcenter - best_tm; - } - --static __cpuinit void sync_tsc(void) -+static __cpuinit void sync_tsc(unsigned int master) - { - int i, done = 0; - long delta, adj, adjust_latency = 0; -@@ -267,9 +264,17 @@ - } t[NUM_ROUNDS] __cpuinitdata; - #endif - -+ printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", -+ smp_processor_id(), master); -+ - go[MASTER] = 1; - -- smp_call_function(sync_master, NULL, 1, 0); -+ /* It is dangerous to broadcast IPI as cpus are coming up, -+ * as they may not be ready to accept them. So since -+ * we only need to send the ipi to the boot cpu direct -+ * the message, and avoid the race. -+ */ -+ smp_call_function_single(master, sync_master, NULL, 1, 0); - - while (go[MASTER]) /* wait for master to be ready */ - no_cpu_relax(); -@@ -313,16 +318,14 @@ - printk(KERN_INFO - "CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, " - "maxerr %lu cycles)\n", -- smp_processor_id(), boot_cpu_id, delta, rt); -+ smp_processor_id(), master, delta, rt); - } - - static void __cpuinit tsc_sync_wait(void) - { - if (notscsync || !cpu_has_tsc) - return; -- printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(), -- boot_cpu_id); -- sync_tsc(); -+ sync_tsc(0); - } - - static __init int notscsync_setup(char *s) diff -Nur linux-source-2.6.12-2.6.12.orig/cluster/Kconfig linux-source-2.6.12-2.6.12-9.23/cluster/Kconfig --- linux-source-2.6.12-2.6.12.orig/cluster/Kconfig 1970-01-01 01:00:00.000000000 +0100 +++ linux-source-2.6.12-2.6.12-9.23/cluster/Kconfig 2005-10-10 13:12:27.970269861 +0100 @@ -603806,18 +603671,6 @@ struct irq_routing_table *pcibios_get_irq_routing_table(void); int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); -diff -Nur linux-source-2.6.12-2.6.12.orig/include/asm-x86_64/smp.h linux-source-2.6.12-2.6.12-9.23/include/asm-x86_64/smp.h ---- linux-source-2.6.12-2.6.12.orig/include/asm-x86_64/smp.h 2005-06-17 20:48:29.000000000 +0100 -+++ linux-source-2.6.12-2.6.12-9.23/include/asm-x86_64/smp.h 2005-10-10 13:12:25.754357737 +0100 -@@ -46,6 +46,8 @@ - extern int smp_num_siblings; - extern void smp_flush_tlb(void); - extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); -+extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, -+ int retry, int wait); - extern void smp_send_reschedule(int cpu); - extern void smp_invalidate_rcv(void); /* Process an NMI */ - extern void zap_low_mappings(void); diff -Nur linux-source-2.6.12-2.6.12.orig/include/asm-x86_64/unistd.h linux-source-2.6.12-2.6.12-9.23/include/asm-x86_64/unistd.h --- linux-source-2.6.12-2.6.12.orig/include/asm-x86_64/unistd.h 2005-06-17 20:48:29.000000000 +0100 +++ linux-source-2.6.12-2.6.12-9.23/include/asm-x86_64/unistd.h 2005-10-10 13:12:26.021347149 +0100