diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-06-26 05:21:34 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-06-26 05:21:34 -0400 |
commit | 3d4422332711ef48ef0f132f1fcbfcbd56c7f3d1 (patch) | |
tree | 9fd3cfa9825e8cb0b7e08dfae85cc9a722442849 /arch/sparc64 | |
parent | 543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (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/sparc64')
-rw-r--r-- | arch/sparc64/kernel/smp.c | 11 |
1 files changed, 6 insertions, 5 deletions
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 | */ |
819 | static int smp_call_function_mask(void (*func)(void *info), void *info, | 819 | static 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: | |||
855 | int smp_call_function(void (*func)(void *info), void *info, | 856 | int 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 | ||
862 | void smp_call_function_client(int irq, struct pt_regs *regs) | 863 | void smp_call_function_client(int irq, struct pt_regs *regs) |
@@ -893,7 +894,7 @@ static void tsb_sync(void *info) | |||
893 | 894 | ||
894 | void smp_tsb_sync(struct mm_struct *mm) | 895 | void 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 | ||
899 | extern unsigned long xcall_flush_tlb_mm; | 900 | extern unsigned long xcall_flush_tlb_mm; |