aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2008-06-26 05:21:34 -0400
committerJens Axboe <jens.axboe@oracle.com>2008-06-26 05:21:34 -0400
commit3d4422332711ef48ef0f132f1fcbfcbd56c7f3d1 (patch)
tree9fd3cfa9825e8cb0b7e08dfae85cc9a722442849 /arch
parent543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff)
Add generic helpers for arch IPI function calls
This adds kernel/smp.c which contains helpers for IPI function calls. In addition to supporting the existing smp_call_function() in a more efficient manner, it also adds a more scalable variant called smp_call_function_single() for calling a given function on a single CPU only. The core of this is based on the x86-64 patch from Nick Piggin, lots of changes since then. "Alan D. Brunelle" <Alan.Brunelle@hp.com> has contributed lots of fixes and suggestions as well. Also thanks to Paul E. McKenney <paulmck@linux.vnet.ibm.com> for reviewing RCU usage and getting rid of the data allocation fallback deadlock. Acked-by: Ingo Molnar <mingo@elte.hu> Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/Kconfig3
-rw-r--r--arch/sparc64/kernel/smp.c11
2 files changed, 9 insertions, 5 deletions
diff --git a/arch/Kconfig b/arch/Kconfig
index 3ea332b009e5..ad89a33d8c6e 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -39,3 +39,6 @@ config HAVE_KRETPROBES
39 39
40config HAVE_DMA_ATTRS 40config HAVE_DMA_ATTRS
41 def_bool n 41 def_bool n
42
43config USE_GENERIC_SMP_HELPERS
44 def_bool n
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index fa63c68a1819..b82d017a1744 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -816,8 +816,9 @@ extern unsigned long xcall_call_function;
816 * You must not call this function with disabled interrupts or from a 816 * You must not call this function with disabled interrupts or from a
817 * hardware interrupt handler or from a bottom half handler. 817 * hardware interrupt handler or from a bottom half handler.
818 */ 818 */
819static int smp_call_function_mask(void (*func)(void *info), void *info, 819static int sparc64_smp_call_function_mask(void (*func)(void *info), void *info,
820 int nonatomic, int wait, cpumask_t mask) 820 int nonatomic, int wait,
821 cpumask_t mask)
821{ 822{
822 struct call_data_struct data; 823 struct call_data_struct data;
823 int cpus; 824 int cpus;
@@ -855,8 +856,8 @@ out_unlock:
855int smp_call_function(void (*func)(void *info), void *info, 856int smp_call_function(void (*func)(void *info), void *info,
856 int nonatomic, int wait) 857 int nonatomic, int wait)
857{ 858{
858 return smp_call_function_mask(func, info, nonatomic, wait, 859 return sparc64_smp_call_function_mask(func, info, nonatomic, wait,
859 cpu_online_map); 860 cpu_online_map);
860} 861}
861 862
862void smp_call_function_client(int irq, struct pt_regs *regs) 863void smp_call_function_client(int irq, struct pt_regs *regs)
@@ -893,7 +894,7 @@ static void tsb_sync(void *info)
893 894
894void smp_tsb_sync(struct mm_struct *mm) 895void smp_tsb_sync(struct mm_struct *mm)
895{ 896{
896 smp_call_function_mask(tsb_sync, mm, 0, 1, mm->cpu_vm_mask); 897 sparc64_smp_call_function_mask(tsb_sync, mm, 0, 1, mm->cpu_vm_mask);
897} 898}
898 899
899extern unsigned long xcall_flush_tlb_mm; 900extern unsigned long xcall_flush_tlb_mm;