Patches contributed by Eötvös Lorand University


commit 71415c6a0877d5944d5dc3060f3b03513746158d
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Jul 11 22:41:34 2008 +0200

    x86, xen, vdso: fix build error
    
    fix:
    
       arch/x86/xen/built-in.o: In function `xen_enable_syscall':
       (.cpuinit.text+0xdb): undefined reference to `sysctl_vsyscall32'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index 9cce4a92aac0..3e11779755c3 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -144,7 +144,9 @@ void __cpuinit xen_enable_syscall(void)
 		if (ret != 0) {
 			printk(KERN_INFO "Xen: 32-bit syscall not supported: disabling vdso\n");
 			setup_clear_cpu_cap(X86_FEATURE_SYSCALL32);
+#ifdef CONFIG_COMPAT
 			sysctl_vsyscall32 = 0;
+#endif
 		}
 	}
 #endif /* CONFIG_X86_64 */

commit 6596f2422306a05be2170efc114da49f26a047dd
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jul 9 22:32:33 2008 +0200

    Revert "x86_64: there's no need to preallocate level1_fixmap_pgt"
    
    This reverts commit 033786969d1d1b5af12a32a19d3a760314d05329.
    
    Suresh Siddha reported that this broke booting on his 2GB testbox.
    
    Reported-by: Suresh Siddha <suresh.b.siddha@intel.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 2240f823676a..db3280afe886 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -362,6 +362,12 @@ NEXT_PAGE(level3_kernel_pgt)
 	.quad	level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
 
 NEXT_PAGE(level2_fixmap_pgt)
+	.fill	506,8,0
+	.quad	level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
+	/* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */
+	.fill	5,8,0
+
+NEXT_PAGE(level1_fixmap_pgt)
 	.fill	512,8,0
 
 NEXT_PAGE(level2_ident_pgt)

commit 6717ef1aa750b54ddb9d8854b91707ee21f0ad23
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jul 9 22:17:01 2008 +0200

    Revert "suspend, xen: enable PM_SLEEP for CONFIG_XEN"
    
    This reverts commit 6fbbec428c8e7bb617da2e8a589af2e97bcf3bc4.
    
    Rafael doesnt like it - it breaks various assumptions.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index 1436c47cb39b..b45da40e8d25 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -82,7 +82,7 @@ config PM_SLEEP_SMP
 
 config PM_SLEEP
 	bool
-	depends on SUSPEND || HIBERNATION || XEN
+	depends on SUSPEND || HIBERNATION
 	default y
 
 config SUSPEND

commit b3fe124389f9dd97f0bbd954da2910e286648f0f
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jul 9 13:45:33 2008 +0200

    xen64: fix build error on 32-bit + !HIGHMEM
    
    fix:
    
    arch/x86/xen/enlighten.c: In function 'xen_set_fixmap':
    arch/x86/xen/enlighten.c:1127: error: 'FIX_KMAP_BEGIN' undeclared (first use in this function)
    arch/x86/xen/enlighten.c:1127: error: (Each undeclared identifier is reported only once
    arch/x86/xen/enlighten.c:1127: error: for each function it appears in.)
    arch/x86/xen/enlighten.c:1127: error: 'FIX_KMAP_END' undeclared (first use in this function)
    make[1]: *** [arch/x86/xen/enlighten.o] Error 1
    make: *** [arch/x86/xen/enlighten.o] Error 2
    
    FIX_KMAP_BEGIN is only available on HIGHMEM.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 776c0fb77d69..3da6acb7eafc 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1124,7 +1124,9 @@ static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot)
 #ifdef CONFIG_X86_32
 	case FIX_WP_TEST:
 	case FIX_VDSO:
+# ifdef CONFIG_HIGHMEM
 	case FIX_KMAP_BEGIN ... FIX_KMAP_END:
+# endif
 #else
 	case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE:
 #endif

commit 9c8a4420444801bd9d818f542eb4a5be8d5687f0
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jul 9 13:15:03 2008 +0200

    xen64: fix !HVC_XEN build dependency
    
    fix:
    
    arch/x86/xen/built-in.o: In function `set_page_prot':
    enlighten.c:(.text+0x111d): undefined reference to `xen_raw_printk'
    arch/x86/xen/built-in.o: In function `xen_start_kernel':
    : undefined reference to `xen_raw_console_write'
    arch/x86/xen/built-in.o: In function `xen_start_kernel':
    : undefined reference to `xen_raw_console_write'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/include/xen/hvc-console.h b/include/xen/hvc-console.h
index 98b79bc404dd..c3adde32669b 100644
--- a/include/xen/hvc-console.h
+++ b/include/xen/hvc-console.h
@@ -5,11 +5,12 @@ extern struct console xenboot_console;
 
 #ifdef CONFIG_HVC_XEN
 void xen_console_resume(void);
+void xen_raw_console_write(const char *str);
+void xen_raw_printk(const char *fmt, ...);
 #else
 static inline void xen_console_resume(void) { }
+static inline void xen_raw_console_write(const char *str) { }
+static inline void xen_raw_printk(const char *fmt, ...) { }
 #endif
 
-void xen_raw_console_write(const char *str);
-void xen_raw_printk(const char *fmt, ...);
-
 #endif	/* XEN_HVC_CONSOLE_H */

commit 82638844d9a8581bbf33201cc209a14876eca167
Merge: 9982fbface82 63cf13b77ab7
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jul 16 00:29:07 2008 +0200

    Merge branch 'linus' into cpus4096
    
    Conflicts:
    
            arch/x86/xen/smp.c
            kernel/sched_rt.c
            net/iucv/iucv.c
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc arch/x86/xen/smp.c
index 7a70638797ed,233156f39b7f..463adecc5cba
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@@ -349,23 -355,30 +355,30 @@@ static void xen_send_IPI_mask(cpumask_
  		xen_send_IPI_one(cpu, vector);
  }
  
+ void xen_smp_send_call_function_ipi(cpumask_t mask)
+ {
+ 	int cpu;
+ 
+ 	xen_send_IPI_mask(mask, XEN_CALL_FUNCTION_VECTOR);
+ 
+ 	/* Make sure other vcpus get a chance to run if they need to. */
 -	for_each_cpu_mask(cpu, mask) {
++	for_each_cpu_mask_nr(cpu, mask) {
+ 		if (xen_vcpu_stolen(cpu)) {
+ 			HYPERVISOR_sched_op(SCHEDOP_yield, 0);
+ 			break;
+ 		}
+ 	}
+ }
+ 
+ void xen_smp_send_call_function_single_ipi(int cpu)
+ {
+ 	xen_send_IPI_mask(cpumask_of_cpu(cpu), XEN_CALL_FUNCTION_SINGLE_VECTOR);
+ }
+ 
  static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
  {
- 	void (*func) (void *info) = call_data->func;
- 	void *info = call_data->info;
- 	int wait = call_data->wait;
- 
- 	/*
- 	 * Notify initiating CPU that I've grabbed the data and am
- 	 * about to execute the function
- 	 */
- 	mb();
- 	atomic_inc(&call_data->started);
- 	/*
- 	 * At this point the info structure may be out of scope unless wait==1
- 	 */
  	irq_enter();
- 	(*func)(info);
+ 	generic_smp_call_function_interrupt();
  	__get_cpu_var(irq_stat).irq_call_count++;
  	irq_exit();
  
diff --cc net/iucv/iucv.c
index 8de511070593,cc34ac769a3c..411b339a0c8a
--- a/net/iucv/iucv.c
+++ b/net/iucv/iucv.c
@@@ -497,8 -497,8 +497,8 @@@ static void iucv_setmask_up(void
  	/* Disable all cpu but the first in cpu_irq_cpumask. */
  	cpumask = iucv_irq_cpumask;
  	cpu_clear(first_cpu(iucv_irq_cpumask), cpumask);
 -	for_each_cpu_mask(cpu, cpumask)
 +	for_each_cpu_mask_nr(cpu, cpumask)
- 		smp_call_function_single(cpu, iucv_block_cpu, NULL, 0, 1);
+ 		smp_call_function_single(cpu, iucv_block_cpu, NULL, 1);
  }
  
  /**

commit 1e09481365ce248dbb4eb06dad70129bb5807037
Merge: 3e2f69fdd1b0 b9d2252c1e44
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jul 15 23:12:58 2008 +0200

    Merge branch 'linus' into core/softlockup
    
    Conflicts:
    
            kernel/softlockup.c
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit f6f88e9bfb6ced9871ed65ebe85c371de3c9e4be
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jul 15 22:08:52 2008 +0200

    generic-ipi: more merge fallout
    
    fix more API change fallout in recently merged upstream changes.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c
index b40df7d2cf44..54759f1669d3 100644
--- a/arch/mips/oprofile/op_model_mipsxx.c
+++ b/arch/mips/oprofile/op_model_mipsxx.c
@@ -313,7 +313,7 @@ static int __init mipsxx_init(void)
 	if (!cpu_has_mipsmt_pertccounters)
 		counters = counters_total_to_per_cpu(counters);
 #endif
-	on_each_cpu(reset_counters, (void *)(long)counters, 0, 1);
+	on_each_cpu(reset_counters, (void *)(long)counters, 1);
 
 	op_model_mipsxx_ops.num_counters = counters;
 	switch (current_cpu_type()) {
@@ -382,7 +382,7 @@ static void mipsxx_exit(void)
 	int counters = op_model_mipsxx_ops.num_counters;
 
 	counters = counters_per_cpu_to_total(counters);
-	on_each_cpu(reset_counters, (void *)(long)counters, 0, 1);
+	on_each_cpu(reset_counters, (void *)(long)counters, 1);
 
 	perf_irq = save_perf_irq;
 }
diff --git a/arch/ppc/kernel/smp.c b/arch/ppc/kernel/smp.c
index 055998575cb4..bcab0d210e30 100644
--- a/arch/ppc/kernel/smp.c
+++ b/arch/ppc/kernel/smp.c
@@ -152,7 +152,7 @@ static void stop_this_cpu(void *dummy)
 
 void smp_send_stop(void)
 {
-	smp_call_function(stop_this_cpu, NULL, 1, 0);
+	smp_call_function(stop_this_cpu, NULL, 0);
 }
 
 /*
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index 8051e9326dfc..f2cede3947b2 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -1432,7 +1432,7 @@ static void stp_work_fn(struct work_struct *work)
 	 */
 	memset(&stp_sync, 0, sizeof(stp_sync));
 	preempt_disable();
-	smp_call_function(clock_sync_cpu_start, &stp_sync, 0, 0);
+	smp_call_function(clock_sync_cpu_start, &stp_sync, 0);
 	local_irq_disable();
 	enable_sync_clock();
 
@@ -1465,7 +1465,7 @@ static void stp_work_fn(struct work_struct *work)
 		stp_sync.in_sync = 1;
 
 	local_irq_enable();
-	smp_call_function(clock_sync_cpu_end, NULL, 0, 0);
+	smp_call_function(clock_sync_cpu_end, NULL, 0);
 	preempt_enable();
 }
 
diff --git a/drivers/watchdog/booke_wdt.c b/drivers/watchdog/booke_wdt.c
index c1ba0db48501..770824458d45 100644
--- a/drivers/watchdog/booke_wdt.c
+++ b/drivers/watchdog/booke_wdt.c
@@ -55,7 +55,7 @@ static void __booke_wdt_ping(void *data)
 
 static void booke_wdt_ping(void)
 {
-	on_each_cpu(__booke_wdt_ping, NULL, 0, 0);
+	on_each_cpu(__booke_wdt_ping, NULL, 0);
 }
 
 static void __booke_wdt_enable(void *data)
@@ -131,7 +131,7 @@ static int booke_wdt_open(struct inode *inode, struct file *file)
 	spin_lock(&booke_wdt_lock);
 	if (booke_wdt_enabled == 0) {
 		booke_wdt_enabled = 1;
-		on_each_cpu(__booke_wdt_enable, NULL, 0, 0);
+		on_each_cpu(__booke_wdt_enable, NULL, 0);
 		printk(KERN_INFO "PowerPC Book-E Watchdog Timer Enabled "
 				"(wdt_period=%d)\n", booke_wdt_period);
 	}
@@ -177,7 +177,7 @@ static int __init booke_wdt_init(void)
 	if (booke_wdt_enabled == 1) {
 		printk(KERN_INFO "PowerPC Book-E Watchdog Timer Enabled "
 				"(wdt_period=%d)\n", booke_wdt_period);
-		on_each_cpu(__booke_wdt_enable, NULL, 0, 0);
+		on_each_cpu(__booke_wdt_enable, NULL, 0);
 	}
 	spin_unlock(&booke_wdt_lock);
 

commit b3c9816b9fa9a7b75ab36111eb76eca03e5bab78
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jul 15 22:03:56 2008 +0200

    generic-ipi: merge fix
    
    fix merge fallout:
    
    arch/x86/pci/amd_bus.c: In function ‘enable_pci_io_ecs':
    arch/x86/pci/amd_bus.c:581: error: too many arguments to function ‘on_each_cpu'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c
index a18141ae3f02..dbf532369711 100644
--- a/arch/x86/pci/amd_bus.c
+++ b/arch/x86/pci/amd_bus.c
@@ -578,7 +578,7 @@ static int __init enable_pci_io_ecs(void)
 	/* assume all cpus from fam10h have IO ECS */
         if (boot_cpu_data.x86 < 0x10)
 		return 0;
-	on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1, 1);
+	on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1);
 	pci_probe |= PCI_HAS_IO_ECS;
 	return 0;
 }

commit 1a781a777b2f6ac46523fe92396215762ced624d
Merge: b9d2252c1e44 42a2f217a5e3
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jul 15 21:55:59 2008 +0200

    Merge branch 'generic-ipi' into generic-ipi-for-linus
    
    Conflicts:
    
            arch/powerpc/Kconfig
            arch/s390/kernel/time.c
            arch/x86/kernel/apic_32.c
            arch/x86/kernel/cpu/perfctr-watchdog.c
            arch/x86/kernel/i8259_64.c
            arch/x86/kernel/ldt.c
            arch/x86/kernel/nmi_64.c
            arch/x86/kernel/smpboot.c
            arch/x86/xen/smp.c
            include/asm-x86/hw_irq_32.h
            include/asm-x86/hw_irq_64.h
            include/asm-x86/mach-default/irq_vectors.h
            include/asm-x86/mach-voyager/irq_vectors.h
            include/asm-x86/smp.h
            kernel/Makefile
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc arch/powerpc/Kconfig
index a5e9912e2d37,852d40c29637..20eacf2a8424
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@@ -111,7 -109,8 +111,8 @@@ config PP
  	select HAVE_KPROBES
  	select HAVE_KRETPROBES
  	select HAVE_LMB
+ 	select USE_GENERIC_SMP_HELPERS if SMP
 +	select HAVE_OPROFILE
  
  config EARLY_PRINTK
  	bool
diff --cc arch/s390/appldata/appldata_base.c
index 9cb3d92447a3,837a3b3e7759..a7f8979fb925
--- a/arch/s390/appldata/appldata_base.c
+++ b/arch/s390/appldata/appldata_base.c
@@@ -203,9 -209,10 +203,9 @@@ __appldata_vtimer_setup(int cmd
  			per_cpu(appldata_timer, i).expires = per_cpu_interval;
  			smp_call_function_single(i, add_virt_timer_periodic,
  						 &per_cpu(appldata_timer, i),
- 						 0, 1);
+ 						 1);
  		}
  		appldata_timer_active = 1;
 -		P_INFO("Monitoring timer started.\n");
  		break;
  	case APPLDATA_DEL_TIMER:
  		for_each_online_cpu(i)
diff --cc arch/s390/kernel/time.c
index 7418bebb547f,6037ed2b7471..8051e9326dfc
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@@ -707,9 -690,9 +707,9 @@@ static int etr_sync_clock(struct etr_ai
  	 */
  	memset(&etr_sync, 0, sizeof(etr_sync));
  	preempt_disable();
- 	smp_call_function(clock_sync_cpu_start, &etr_sync, 0, 0);
 -	smp_call_function(etr_sync_cpu_start, NULL, 0);
++	smp_call_function(clock_sync_cpu_start, &etr_sync, 0);
  	local_irq_disable();
 -	etr_enable_sync_clock();
 +	enable_sync_clock();
  
  	/* Set clock to next OTE. */
  	__ctl_set_bit(14, 21);
@@@ -746,7 -729,7 +746,7 @@@
  		rc = -EAGAIN;
  	}
  	local_irq_enable();
- 	smp_call_function(clock_sync_cpu_end, NULL, 0, 0);
 -	smp_call_function(etr_sync_cpu_end,NULL,0);
++	smp_call_function(clock_sync_cpu_end, NULL, 0);
  	preempt_enable();
  	return rc;
  }
@@@ -926,10 -909,10 +926,10 @@@ static void etr_work_fn(struct work_str
  	if (!eacr.ea) {
  		/* Both ports offline. Reset everything. */
  		eacr.dp = eacr.es = eacr.sl = 0;
- 		on_each_cpu(disable_sync_clock, NULL, 0, 1);
 -		on_each_cpu(etr_disable_sync_clock, NULL, 1);
++		on_each_cpu(disable_sync_clock, NULL, 1);
  		del_timer_sync(&etr_timer);
  		etr_update_eacr(eacr);
 -		set_bit(ETR_FLAG_EACCES, &etr_flags);
 +		clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags);
  		return;
  	}
  
diff --cc arch/x86/kernel/apic_32.c
index 3e58b676d23b,71017f71f4bc..a437d027f20b
--- a/arch/x86/kernel/apic_32.c
+++ b/arch/x86/kernel/apic_32.c
@@@ -1333,13 -1351,17 +1333,17 @@@ void __init smp_intr_init(void
  	 * The reschedule interrupt is a CPU-to-CPU reschedule-helper
  	 * IPI, driven by wakeup.
  	 */
 -	set_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
 +	alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
  
  	/* IPI for invalidation */
 -	set_intr_gate(INVALIDATE_TLB_VECTOR, invalidate_interrupt);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR, invalidate_interrupt);
  
  	/* IPI for generic function call */
 -	set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
 +	alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
+ 
+ 	/* IPI for single call function */
+ 	set_intr_gate(CALL_FUNCTION_SINGLE_VECTOR,
+ 				call_function_single_interrupt);
  }
  #endif
  
diff --cc arch/x86/kernel/cpu/perfctr-watchdog.c
index 2e9bef6e3aa3,58043f06d7e2..6d4bdc02388a
--- a/arch/x86/kernel/cpu/perfctr-watchdog.c
+++ b/arch/x86/kernel/cpu/perfctr-watchdog.c
@@@ -189,10 -180,8 +189,10 @@@ void disable_lapic_nmi_watchdog(void
  	if (atomic_read(&nmi_active) <= 0)
  		return;
  
- 	on_each_cpu(stop_apic_nmi_watchdog, NULL, 0, 1);
+ 	on_each_cpu(stop_apic_nmi_watchdog, NULL, 1);
 -	wd_ops->unreserve();
 +
 +	if (wd_ops)
 +		wd_ops->unreserve();
  
  	BUG_ON(atomic_read(&nmi_active) != 0);
  }
diff --cc arch/x86/kernel/io_apic_32.c
index 603261a5885c,720640ff36ca..558abf4c796a
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@@ -1567,9 -1563,9 +1567,9 @@@ void /*__init*/ print_local_APIC(void *
  	printk("\n");
  }
  
 -void print_all_local_APICs (void)
 +void print_all_local_APICs(void)
  {
- 	on_each_cpu(print_local_APIC, NULL, 1, 1);
+ 	on_each_cpu(print_local_APIC, NULL, 1);
  }
  
  void /*__init*/ print_PIC(void)
diff --cc arch/x86/kernel/irqinit_64.c
index 31f49e8f46a7,000000000000..0373e88de95a
mode 100644,000000..100644
--- a/arch/x86/kernel/irqinit_64.c
+++ b/arch/x86/kernel/irqinit_64.c
@@@ -1,217 -1,0 +1,221 @@@
 +#include <linux/linkage.h>
 +#include <linux/errno.h>
 +#include <linux/signal.h>
 +#include <linux/sched.h>
 +#include <linux/ioport.h>
 +#include <linux/interrupt.h>
 +#include <linux/timex.h>
 +#include <linux/slab.h>
 +#include <linux/random.h>
 +#include <linux/init.h>
 +#include <linux/kernel_stat.h>
 +#include <linux/sysdev.h>
 +#include <linux/bitops.h>
 +
 +#include <asm/acpi.h>
 +#include <asm/atomic.h>
 +#include <asm/system.h>
 +#include <asm/io.h>
 +#include <asm/hw_irq.h>
 +#include <asm/pgtable.h>
 +#include <asm/delay.h>
 +#include <asm/desc.h>
 +#include <asm/apic.h>
 +#include <asm/i8259.h>
 +
 +/*
 + * Common place to define all x86 IRQ vectors
 + *
 + * This builds up the IRQ handler stubs using some ugly macros in irq.h
 + *
 + * These macros create the low-level assembly IRQ routines that save
 + * register context and call do_IRQ(). do_IRQ() then does all the
 + * operations that are needed to keep the AT (or SMP IOAPIC)
 + * interrupt-controller happy.
 + */
 +
 +#define IRQ_NAME2(nr) nr##_interrupt(void)
 +#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)
 +
 +/*
 + *	SMP has a few special interrupts for IPI messages
 + */
 +
 +#define BUILD_IRQ(nr)				\
 +	asmlinkage void IRQ_NAME(nr);		\
 +	asm("\n.p2align\n"			\
 +	    "IRQ" #nr "_interrupt:\n\t"		\
 +	    "push $~(" #nr ") ; "		\
 +	    "jmp common_interrupt");
 +
 +#define BI(x,y) \
 +	BUILD_IRQ(x##y)
 +
 +#define BUILD_16_IRQS(x) \
 +	BI(x,0) BI(x,1) BI(x,2) BI(x,3) \
 +	BI(x,4) BI(x,5) BI(x,6) BI(x,7) \
 +	BI(x,8) BI(x,9) BI(x,a) BI(x,b) \
 +	BI(x,c) BI(x,d) BI(x,e) BI(x,f)
 +
 +/*
 + * ISA PIC or low IO-APIC triggered (INTA-cycle or APIC) interrupts:
 + * (these are usually mapped to vectors 0x30-0x3f)
 + */
 +
 +/*
 + * The IO-APIC gives us many more interrupt sources. Most of these
 + * are unused but an SMP system is supposed to have enough memory ...
 + * sometimes (mostly wrt. hw bugs) we get corrupted vectors all
 + * across the spectrum, so we really want to be prepared to get all
 + * of these. Plus, more powerful systems might have more than 64
 + * IO-APIC registers.
 + *
 + * (these are usually mapped into the 0x30-0xff vector range)
 + */
 +				      BUILD_16_IRQS(0x2) BUILD_16_IRQS(0x3)
 +BUILD_16_IRQS(0x4) BUILD_16_IRQS(0x5) BUILD_16_IRQS(0x6) BUILD_16_IRQS(0x7)
 +BUILD_16_IRQS(0x8) BUILD_16_IRQS(0x9) BUILD_16_IRQS(0xa) BUILD_16_IRQS(0xb)
 +BUILD_16_IRQS(0xc) BUILD_16_IRQS(0xd) BUILD_16_IRQS(0xe) BUILD_16_IRQS(0xf)
 +
 +#undef BUILD_16_IRQS
 +#undef BI
 +
 +
 +#define IRQ(x,y) \
 +	IRQ##x##y##_interrupt
 +
 +#define IRQLIST_16(x) \
 +	IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3), \
 +	IRQ(x,4), IRQ(x,5), IRQ(x,6), IRQ(x,7), \
 +	IRQ(x,8), IRQ(x,9), IRQ(x,a), IRQ(x,b), \
 +	IRQ(x,c), IRQ(x,d), IRQ(x,e), IRQ(x,f)
 +
 +/* for the irq vectors */
 +static void (*__initdata interrupt[NR_VECTORS - FIRST_EXTERNAL_VECTOR])(void) = {
 +					  IRQLIST_16(0x2), IRQLIST_16(0x3),
 +	IRQLIST_16(0x4), IRQLIST_16(0x5), IRQLIST_16(0x6), IRQLIST_16(0x7),
 +	IRQLIST_16(0x8), IRQLIST_16(0x9), IRQLIST_16(0xa), IRQLIST_16(0xb),
 +	IRQLIST_16(0xc), IRQLIST_16(0xd), IRQLIST_16(0xe), IRQLIST_16(0xf)
 +};
 +
 +#undef IRQ
 +#undef IRQLIST_16
 +
 +
 +
 +
 +/*
 + * IRQ2 is cascade interrupt to second interrupt controller
 + */
 +
 +static struct irqaction irq2 = {
 +	.handler = no_action,
 +	.mask = CPU_MASK_NONE,
 +	.name = "cascade",
 +};
 +DEFINE_PER_CPU(vector_irq_t, vector_irq) = {
 +	[0 ... IRQ0_VECTOR - 1] = -1,
 +	[IRQ0_VECTOR] = 0,
 +	[IRQ1_VECTOR] = 1,
 +	[IRQ2_VECTOR] = 2,
 +	[IRQ3_VECTOR] = 3,
 +	[IRQ4_VECTOR] = 4,
 +	[IRQ5_VECTOR] = 5,
 +	[IRQ6_VECTOR] = 6,
 +	[IRQ7_VECTOR] = 7,
 +	[IRQ8_VECTOR] = 8,
 +	[IRQ9_VECTOR] = 9,
 +	[IRQ10_VECTOR] = 10,
 +	[IRQ11_VECTOR] = 11,
 +	[IRQ12_VECTOR] = 12,
 +	[IRQ13_VECTOR] = 13,
 +	[IRQ14_VECTOR] = 14,
 +	[IRQ15_VECTOR] = 15,
 +	[IRQ15_VECTOR + 1 ... NR_VECTORS - 1] = -1
 +};
 +
 +static void __init init_ISA_irqs (void)
 +{
 +	int i;
 +
 +	init_bsp_APIC();
 +	init_8259A(0);
 +
 +	for (i = 0; i < NR_IRQS; i++) {
 +		irq_desc[i].status = IRQ_DISABLED;
 +		irq_desc[i].action = NULL;
 +		irq_desc[i].depth = 1;
 +
 +		if (i < 16) {
 +			/*
 +			 * 16 old-style INTA-cycle interrupts:
 +			 */
 +			set_irq_chip_and_handler_name(i, &i8259A_chip,
 +						      handle_level_irq, "XT");
 +		} else {
 +			/*
 +			 * 'high' PCI IRQs filled in on demand
 +			 */
 +			irq_desc[i].chip = &no_irq_chip;
 +		}
 +	}
 +}
 +
 +void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ")));
 +
 +void __init native_init_IRQ(void)
 +{
 +	int i;
 +
 +	init_ISA_irqs();
 +	/*
 +	 * Cover the whole vector space, no vector can escape
 +	 * us. (some of these will be overridden and become
 +	 * 'special' SMP interrupts)
 +	 */
 +	for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
 +		int vector = FIRST_EXTERNAL_VECTOR + i;
 +		if (vector != IA32_SYSCALL_VECTOR)
 +			set_intr_gate(vector, interrupt[i]);
 +	}
 +
 +#ifdef CONFIG_SMP
 +	/*
 +	 * The reschedule interrupt is a CPU-to-CPU reschedule-helper
 +	 * IPI, driven by wakeup.
 +	 */
 +	alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
 +
 +	/* IPIs for invalidation */
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0, invalidate_interrupt0);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+1, invalidate_interrupt1);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+2, invalidate_interrupt2);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+3, invalidate_interrupt3);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+4, invalidate_interrupt4);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+5, invalidate_interrupt5);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+6, invalidate_interrupt6);
 +	alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+7, invalidate_interrupt7);
 +
 +	/* IPI for generic function call */
 +	alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
 +
++	/* IPI for generic single function call */
++	alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR,
++			call_function_single_interrupt);
++
 +	/* Low priority IPI to cleanup after moving an irq */
 +	set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt);
 +#endif
 +	alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
 +	alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
 +
 +	/* self generated IPI for local APIC timer */
 +	alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt);
 +
 +	/* IPI vectors for APIC spurious and error interrupts */
 +	alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt);
 +	alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt);
 +
 +	if (!acpi_ioapic)
 +		setup_irq(2, &irq2);
 +}
diff --cc arch/x86/kernel/ldt.c
index 21f2bae98c15,cb0a6398c64b..a8449571858a
--- a/arch/x86/kernel/ldt.c
+++ b/arch/x86/kernel/ldt.c
@@@ -68,7 -68,7 +68,7 @@@ static int alloc_ldt(mm_context_t *pc, 
  		load_LDT(pc);
  		mask = cpumask_of_cpu(smp_processor_id());
  		if (!cpus_equal(current->mm->cpu_vm_mask, mask))
- 			smp_call_function(flush_ldt, current->mm, 1, 1);
 -			smp_call_function(flush_ldt, NULL, 1);
++			smp_call_function(flush_ldt, current->mm, 1);
  		preempt_enable();
  #else
  		load_LDT(pc);
diff --cc arch/x86/kernel/smpboot.c
index f35c2d8016ac,89647898f546..687376ab07e8
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@@ -327,12 -345,19 +327,12 @@@ static void __cpuinit start_secondary(v
  	 * lock helps us to not include this cpu in a currently in progress
  	 * smp_call_function().
  	 */
- 	lock_ipi_call_lock();
+ 	ipi_call_lock_irq();
 -#ifdef CONFIG_X86_64
 -	spin_lock(&vector_lock);
 -
 -	/* Setup the per cpu irq handling data structures */
 -	__setup_vector_irq(smp_processor_id());
 -	/*
 -	 * Allow the master to continue.
 -	 */
 -	spin_unlock(&vector_lock);
 +#ifdef CONFIG_X86_IO_APIC
 +	setup_vector_irq(smp_processor_id());
  #endif
  	cpu_set(smp_processor_id(), cpu_online_map);
- 	unlock_ipi_call_lock();
+ 	ipi_call_unlock_irq();
  	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
  
  	setup_secondary_clock();
diff --cc arch/x86/mach-voyager/voyager_smp.c
index 8dedd01e909f,abea08459a73..ee0fba092157
--- a/arch/x86/mach-voyager/voyager_smp.c
+++ b/arch/x86/mach-voyager/voyager_smp.c
@@@ -1129,9 -1072,18 +1067,9 @@@ static void do_flush_tlb_all(void *info
  /* flush the TLB of every active CPU in the system */
  void flush_tlb_all(void)
  {
- 	on_each_cpu(do_flush_tlb_all, 0, 1, 1);
+ 	on_each_cpu(do_flush_tlb_all, 0, 1);
  }
  
 -/* used to set up the trampoline for other CPUs when the memory manager
 - * is sorted out */
 -void __init smp_alloc_memory(void)
 -{
 -	trampoline_base = alloc_bootmem_low_pages(PAGE_SIZE);
 -	if (__pa(trampoline_base) >= 0x93000)
 -		BUG();
 -}
 -
  /* send a reschedule CPI to one CPU by physical CPU number*/
  static void voyager_smp_send_reschedule(int cpu)
  {
diff --cc arch/x86/oprofile/nmi_int.c
index 2b6ad5b9f9d5,3238ad32ffd8..7f3329b55d2e
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@@ -269,9 -269,9 +269,9 @@@ static void nmi_cpu_shutdown(void *dumm
  
  static void nmi_shutdown(void)
  {
 -	struct op_msrs *msrs = &__get_cpu_var(cpu_msrs);
 +	struct op_msrs *msrs = &get_cpu_var(cpu_msrs);
  	nmi_enabled = 0;
- 	on_each_cpu(nmi_cpu_shutdown, NULL, 0, 1);
+ 	on_each_cpu(nmi_cpu_shutdown, NULL, 1);
  	unregister_die_notifier(&profile_exceptions_nb);
  	model->shutdown(msrs);
  	free_msrs();
diff --cc arch/x86/xen/smp.c
index d2e3c20127d7,a1651d029ea8..233156f39b7f
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@@ -35,28 -35,15 +35,15 @@@
  #include "xen-ops.h"
  #include "mmu.h"
  
 -static cpumask_t xen_cpu_initialized_map;
 +cpumask_t xen_cpu_initialized_map;
- static DEFINE_PER_CPU(int, resched_irq) = -1;
- static DEFINE_PER_CPU(int, callfunc_irq) = -1;
- static DEFINE_PER_CPU(int, debug_irq) = -1;
- 
- /*
-  * Structure and data for smp_call_function(). This is designed to minimise
-  * static memory requirements. It also looks cleaner.
-  */
- static DEFINE_SPINLOCK(call_lock);
  
- struct call_data_struct {
- 	void (*func) (void *info);
- 	void *info;
- 	atomic_t started;
- 	atomic_t finished;
- 	int wait;
- };
+ static DEFINE_PER_CPU(int, resched_irq);
+ static DEFINE_PER_CPU(int, callfunc_irq);
+ static DEFINE_PER_CPU(int, callfuncsingle_irq);
+ static DEFINE_PER_CPU(int, debug_irq) = -1;
  
  static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
- 
- static struct call_data_struct *call_data;
+ static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
  
  /*
   * Reschedule call back. Nothing to do,
diff --cc arch/x86/xen/xen-ops.h
index d852ddbb3448,a636ab5e1341..6f4b1045c1c2
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@@ -55,16 -46,9 +55,11 @@@ void xen_smp_cpus_done(unsigned int max
  
  void xen_smp_send_stop(void);
  void xen_smp_send_reschedule(int cpu);
- int xen_smp_call_function (void (*func) (void *info), void *info, int nonatomic,
- 			   int wait);
- int xen_smp_call_function_single(int cpu, void (*func) (void *info), void *info,
- 				 int nonatomic, int wait);
- 
- int xen_smp_call_function_mask(cpumask_t mask, void (*func)(void *),
- 			       void *info, int wait);
+ void xen_smp_send_call_function_ipi(cpumask_t mask);
+ void xen_smp_send_call_function_single_ipi(int cpu);
  
 +extern cpumask_t xen_cpu_initialized_map;
 +
  
  /* Declare an asm function, along with symbols needed to make it
     inlineable */
diff --cc include/asm-x86/hw_irq.h
index 18f067c310f7,bf025399d939..77ba51df5668
--- a/include/asm-x86/hw_irq.h
+++ b/include/asm-x86/hw_irq.h
@@@ -1,106 -1,5 +1,107 @@@
 +#ifndef _ASM_HW_IRQ_H
 +#define _ASM_HW_IRQ_H
 +
 +/*
 + * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
 + *
 + * moved some of the old arch/i386/kernel/irq.h to here. VY
 + *
 + * IRQ/IPI changes taken from work by Thomas Radke
 + * <tomsoft@informatik.tu-chemnitz.de>
 + *
 + * hacked by Andi Kleen for x86-64.
 + * unified by tglx
 + */
 +
 +#include <asm/irq_vectors.h>
 +
 +#ifndef __ASSEMBLY__
 +
 +#include <linux/percpu.h>
 +#include <linux/profile.h>
 +#include <linux/smp.h>
 +
 +#include <asm/atomic.h>
 +#include <asm/irq.h>
 +#include <asm/sections.h>
 +
 +#define platform_legacy_irq(irq)	((irq) < 16)
 +
 +/* Interrupt handlers registered during init_IRQ */
 +extern void apic_timer_interrupt(void);
 +extern void error_interrupt(void);
 +extern void spurious_interrupt(void);
 +extern void thermal_interrupt(void);
 +extern void reschedule_interrupt(void);
 +
 +extern void invalidate_interrupt(void);
 +extern void invalidate_interrupt0(void);
 +extern void invalidate_interrupt1(void);
 +extern void invalidate_interrupt2(void);
 +extern void invalidate_interrupt3(void);
 +extern void invalidate_interrupt4(void);
 +extern void invalidate_interrupt5(void);
 +extern void invalidate_interrupt6(void);
 +extern void invalidate_interrupt7(void);
 +
 +extern void irq_move_cleanup_interrupt(void);
 +extern void threshold_interrupt(void);
 +
 +extern void call_function_interrupt(void);
++extern void call_function_single_interrupt(void);
 +
 +/* PIC specific functions */
 +extern void disable_8259A_irq(unsigned int irq);
 +extern void enable_8259A_irq(unsigned int irq);
 +extern int i8259A_irq_pending(unsigned int irq);
 +extern void make_8259A_irq(unsigned int irq);
 +extern void init_8259A(int aeoi);
 +
 +/* IOAPIC */
 +#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
 +extern unsigned long io_apic_irqs;
 +
 +extern void init_VISWS_APIC_irqs(void);
 +extern void setup_IO_APIC(void);
 +extern void disable_IO_APIC(void);
 +extern void print_IO_APIC(void);
 +extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
 +extern void setup_ioapic_dest(void);
 +
 +#ifdef CONFIG_X86_64
 +extern void enable_IO_APIC(void);
 +#endif
 +
 +/* IPI functions */
 +extern void send_IPI_self(int vector);
 +extern void send_IPI(int dest, int vector);
 +
 +/* Statistics */
 +extern atomic_t irq_err_count;
 +extern atomic_t irq_mis_count;
 +
 +/* EISA */
 +extern void eisa_set_level_irq(unsigned int irq);
 +
 +/* Voyager functions */
 +extern asmlinkage void vic_cpi_interrupt(void);
 +extern asmlinkage void vic_sys_interrupt(void);
 +extern asmlinkage void vic_cmn_interrupt(void);
 +extern asmlinkage void qic_timer_interrupt(void);
 +extern asmlinkage void qic_invalidate_interrupt(void);
 +extern asmlinkage void qic_reschedule_interrupt(void);
 +extern asmlinkage void qic_enable_irq_interrupt(void);
 +extern asmlinkage void qic_call_function_interrupt(void);
 +
  #ifdef CONFIG_X86_32
 -# include "hw_irq_32.h"
 +extern void (*const interrupt[NR_IRQS])(void);
  #else
 -# include "hw_irq_64.h"
 +typedef int vector_irq_t[NR_VECTORS];
 +DECLARE_PER_CPU(vector_irq_t, vector_irq);
 +extern spinlock_t vector_lock;
 +#endif
 +extern void setup_vector_irq(int cpu);
 +
 +#endif /* !ASSEMBLY_ */
 +
  #endif
diff --cc include/asm-x86/irq_vectors.h
index 0ac864ef3cd4,000000000000..90b1d1f12f08
mode 100644,000000..100644
--- a/include/asm-x86/irq_vectors.h
+++ b/include/asm-x86/irq_vectors.h
@@@ -1,169 -1,0 +1,173 @@@
 +#ifndef _ASM_IRQ_VECTORS_H
 +#define _ASM_IRQ_VECTORS_H
 +
 +#include <linux/threads.h>
 +
 +#define NMI_VECTOR		0x02
 +
 +/*
 + * IDT vectors usable for external interrupt sources start
 + * at 0x20:
 + */
 +#define FIRST_EXTERNAL_VECTOR	0x20
 +
 +#ifdef CONFIG_X86_32
 +# define SYSCALL_VECTOR		0x80
 +#else
 +# define IA32_SYSCALL_VECTOR	0x80
 +#endif
 +
 +/*
 + * Reserve the lowest usable priority level 0x20 - 0x2f for triggering
 + * cleanup after irq migration on 64 bit.
 + */
 +#define IRQ_MOVE_CLEANUP_VECTOR	FIRST_EXTERNAL_VECTOR
 +
 +/*
 + * Vectors 0x20-0x2f are used for ISA interrupts on 32 bit.
 + * Vectors 0x30-0x3f are used for ISA interrupts on 64 bit.
 + */
 +#ifdef CONFIG_X86_32
 +#define IRQ0_VECTOR		(FIRST_EXTERNAL_VECTOR)
 +#else
 +#define IRQ0_VECTOR		(FIRST_EXTERNAL_VECTOR + 0x10)
 +#endif
 +#define IRQ1_VECTOR		(IRQ0_VECTOR + 1)
 +#define IRQ2_VECTOR		(IRQ0_VECTOR + 2)
 +#define IRQ3_VECTOR		(IRQ0_VECTOR + 3)
 +#define IRQ4_VECTOR		(IRQ0_VECTOR + 4)
 +#define IRQ5_VECTOR		(IRQ0_VECTOR + 5)
 +#define IRQ6_VECTOR		(IRQ0_VECTOR + 6)
 +#define IRQ7_VECTOR		(IRQ0_VECTOR + 7)
 +#define IRQ8_VECTOR		(IRQ0_VECTOR + 8)
 +#define IRQ9_VECTOR		(IRQ0_VECTOR + 9)
 +#define IRQ10_VECTOR		(IRQ0_VECTOR + 10)
 +#define IRQ11_VECTOR		(IRQ0_VECTOR + 11)
 +#define IRQ12_VECTOR		(IRQ0_VECTOR + 12)
 +#define IRQ13_VECTOR		(IRQ0_VECTOR + 13)
 +#define IRQ14_VECTOR		(IRQ0_VECTOR + 14)
 +#define IRQ15_VECTOR		(IRQ0_VECTOR + 15)
 +
 +/*
 + * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
 + *
 + *  some of the following vectors are 'rare', they are merged
 + *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
 + *  TLB, reschedule and local APIC vectors are performance-critical.
 + *
 + *  Vectors 0xf0-0xfa are free (reserved for future Linux use).
 + */
 +#ifdef CONFIG_X86_32
 +
 +# define SPURIOUS_APIC_VECTOR		0xff
 +# define ERROR_APIC_VECTOR		0xfe
 +# define INVALIDATE_TLB_VECTOR		0xfd
 +# define RESCHEDULE_VECTOR		0xfc
 +# define CALL_FUNCTION_VECTOR		0xfb
++# define CALL_FUNCTION_SINGLE_VECTOR	0xfa
 +# define THERMAL_APIC_VECTOR		0xf0
 +
 +#else
 +
 +#define SPURIOUS_APIC_VECTOR		0xff
 +#define ERROR_APIC_VECTOR		0xfe
 +#define RESCHEDULE_VECTOR		0xfd
 +#define CALL_FUNCTION_VECTOR		0xfc
++#define CALL_FUNCTION_SINGLE_VECTOR	0xfb
 +#define THERMAL_APIC_VECTOR		0xfa
 +#define THRESHOLD_APIC_VECTOR		0xf9
 +#define INVALIDATE_TLB_VECTOR_END	0xf7
 +#define INVALIDATE_TLB_VECTOR_START	0xf0	/* f0-f7 used for TLB flush */
 +
 +#define NUM_INVALIDATE_TLB_VECTORS	8
 +
 +#endif
 +
 +/*
 + * Local APIC timer IRQ vector is on a different priority level,
 + * to work around the 'lost local interrupt if more than 2 IRQ
 + * sources per level' errata.
 + */
 +#define LOCAL_TIMER_VECTOR	0xef
 +
 +/*
 + * First APIC vector available to drivers: (vectors 0x30-0xee) we
 + * start at 0x31(0x41) to spread out vectors evenly between priority
 + * levels. (0x80 is the syscall vector)
 + */
 +#ifdef CONFIG_X86_32
 +# define FIRST_DEVICE_VECTOR	0x31
 +#else
 +# define FIRST_DEVICE_VECTOR	(IRQ15_VECTOR + 2)
 +#endif
 +
 +#define NR_VECTORS		256
 +
 +#define FPU_IRQ			13
 +
 +#define	FIRST_VM86_IRQ		3
 +#define LAST_VM86_IRQ		15
 +#define invalid_vm86_irq(irq)	((irq) < 3 || (irq) > 15)
 +
 +#if !defined(CONFIG_X86_VOYAGER)
 +
 +# if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT) || defined(CONFIG_X86_VISWS)
 +
 +#  define NR_IRQS		224
 +
 +#  if (224 >= 32 * NR_CPUS)
 +#   define NR_IRQ_VECTORS	NR_IRQS
 +#  else
 +#   define NR_IRQ_VECTORS	(32 * NR_CPUS)
 +#  endif
 +
 +# else /* IO_APIC || PARAVIRT */
 +
 +#  define NR_IRQS		16
 +#  define NR_IRQ_VECTORS	NR_IRQS
 +
 +# endif
 +
 +#else /* !VISWS && !VOYAGER */
 +
 +# define NR_IRQS		224
 +# define NR_IRQ_VECTORS		NR_IRQS
 +
 +#endif /* VISWS */
 +
 +/* Voyager specific defines */
 +/* These define the CPIs we use in linux */
 +#define VIC_CPI_LEVEL0			0
 +#define VIC_CPI_LEVEL1			1
 +/* now the fake CPIs */
 +#define VIC_TIMER_CPI			2
 +#define VIC_INVALIDATE_CPI		3
 +#define VIC_RESCHEDULE_CPI		4
 +#define VIC_ENABLE_IRQ_CPI		5
 +#define VIC_CALL_FUNCTION_CPI		6
++#define VIC_CALL_FUNCTION_SINGLE_CPI	7
 +
 +/* Now the QIC CPIs:  Since we don't need the two initial levels,
 + * these are 2 less than the VIC CPIs */
 +#define QIC_CPI_OFFSET			1
 +#define QIC_TIMER_CPI			(VIC_TIMER_CPI - QIC_CPI_OFFSET)
 +#define QIC_INVALIDATE_CPI		(VIC_INVALIDATE_CPI - QIC_CPI_OFFSET)
 +#define QIC_RESCHEDULE_CPI		(VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET)
 +#define QIC_ENABLE_IRQ_CPI		(VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET)
 +#define QIC_CALL_FUNCTION_CPI		(VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET)
++#define QIC_CALL_FUNCTION_SINGLE_CPI	(VIC_CALL_FUNCTION_SINGLE_CPI - QIC_CPI_OFFSET)
 +
 +#define VIC_START_FAKE_CPI		VIC_TIMER_CPI
- #define VIC_END_FAKE_CPI		VIC_CALL_FUNCTION_CPI
++#define VIC_END_FAKE_CPI		VIC_CALL_FUNCTION_SINGLE_CPI
 +
 +/* this is the SYS_INT CPI. */
 +#define VIC_SYS_INT			8
 +#define VIC_CMN_INT			15
 +
 +/* This is the boot CPI for alternate processors.  It gets overwritten
 + * by the above once the system has activated all available processors */
 +#define VIC_CPU_BOOT_CPI		VIC_CPI_LEVEL0
 +#define VIC_CPU_BOOT_ERRATA_CPI		(VIC_CPI_LEVEL0 + 8)
 +
 +
 +#endif /* _ASM_IRQ_VECTORS_H */
diff --cc include/asm-x86/smp.h
index 2e221f1ce0b2,e3c24807b59b..c2784b3e0b77
--- a/include/asm-x86/smp.h
+++ b/include/asm-x86/smp.h
@@@ -197,7 -205,7 +202,5 @@@ static inline int hard_smp_processor_id
  extern void cpu_uninit(void);
  #endif
  
- extern void lock_ipi_call_lock(void);
- extern void unlock_ipi_call_lock(void);
 -extern void smp_alloc_memory(void);
  #endif /* __ASSEMBLY__ */
  #endif
diff --cc kernel/Makefile
index f6328e16dfdd,9fa57976f252..0a7ed838984b
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@@ -39,7 -27,8 +39,8 @@@ obj-$(CONFIG_RT_MUTEXES) += rtmutex.
  obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
  obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o
  obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
 -obj-$(CONFIG_SMP) += cpu.o spinlock.o
+ obj-$(CONFIG_USE_GENERIC_SMP_HELPERS) += smp.o
 +obj-$(CONFIG_SMP) += spinlock.o
  obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o
  obj-$(CONFIG_PROVE_LOCKING) += spinlock.o
  obj-$(CONFIG_UID16) += uid16.o