aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/sparc64/kernel/smp.c27
1 files changed, 5 insertions, 22 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 3aba47624df4..0d6403a630ac 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -865,21 +865,14 @@ void smp_call_function_client(int irq, struct pt_regs *regs)
865 void *info = call_data->info; 865 void *info = call_data->info;
866 866
867 clear_softint(1 << irq); 867 clear_softint(1 << irq);
868
869 irq_enter();
870
871 if (!call_data->wait) {
872 /* let initiator proceed after getting data */
873 atomic_inc(&call_data->finished);
874 }
875
876 func(info);
877
878 irq_exit();
879
880 if (call_data->wait) { 868 if (call_data->wait) {
881 /* let initiator proceed only after completion */ 869 /* let initiator proceed only after completion */
870 func(info);
882 atomic_inc(&call_data->finished); 871 atomic_inc(&call_data->finished);
872 } else {
873 /* let initiator proceed after getting data */
874 atomic_inc(&call_data->finished);
875 func(info);
883 } 876 }
884} 877}
885 878
@@ -1041,9 +1034,7 @@ void smp_receive_signal(int cpu)
1041 1034
1042void smp_receive_signal_client(int irq, struct pt_regs *regs) 1035void smp_receive_signal_client(int irq, struct pt_regs *regs)
1043{ 1036{
1044 irq_enter();
1045 clear_softint(1 << irq); 1037 clear_softint(1 << irq);
1046 irq_exit();
1047} 1038}
1048 1039
1049void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) 1040void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs)
@@ -1051,8 +1042,6 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs)
1051 struct mm_struct *mm; 1042 struct mm_struct *mm;
1052 unsigned long flags; 1043 unsigned long flags;
1053 1044
1054 irq_enter();
1055
1056 clear_softint(1 << irq); 1045 clear_softint(1 << irq);
1057 1046
1058 /* See if we need to allocate a new TLB context because 1047 /* See if we need to allocate a new TLB context because
@@ -1072,8 +1061,6 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs)
1072 load_secondary_context(mm); 1061 load_secondary_context(mm);
1073 __flush_tlb_mm(CTX_HWBITS(mm->context), 1062 __flush_tlb_mm(CTX_HWBITS(mm->context),
1074 SECONDARY_CONTEXT); 1063 SECONDARY_CONTEXT);
1075
1076 irq_exit();
1077} 1064}
1078 1065
1079void smp_new_mmu_context_version(void) 1066void smp_new_mmu_context_version(void)
@@ -1239,8 +1226,6 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs)
1239{ 1226{
1240 clear_softint(1 << irq); 1227 clear_softint(1 << irq);
1241 1228
1242 irq_enter();
1243
1244 preempt_disable(); 1229 preempt_disable();
1245 1230
1246 __asm__ __volatile__("flushw"); 1231 __asm__ __volatile__("flushw");
@@ -1253,8 +1238,6 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs)
1253 prom_world(0); 1238 prom_world(0);
1254 1239
1255 preempt_enable(); 1240 preempt_enable();
1256
1257 irq_exit();
1258} 1241}
1259 1242
1260/* /proc/profile writes can call this, don't __init it please. */ 1243/* /proc/profile writes can call this, don't __init it please. */