diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-25 15:29:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-25 15:29:55 -0400 |
commit | 5dae61b80564a5583ff4b56e357bdbc733fddb76 (patch) | |
tree | 75d9a103f5fed1d747f8aa2bf5d8d8b0c42e6185 /arch | |
parent | 2e561c7b7e705b619122e5386d6f99f28f2b6e5a (diff) | |
parent | 2664ef44cf5053d2b7dff01cecac70bc601a5f68 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
[SPARC64]: Wrap SMP IPIs with irq_enter()/irq_exit().
[SPARC64]: Fix args to 64-bit sys_semctl() via sys_ipc().
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sparc64/kernel/smp.c | 27 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc.c | 4 |
2 files changed, 24 insertions, 7 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 524b88920947..409dd71f2738 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -866,14 +866,21 @@ void smp_call_function_client(int irq, struct pt_regs *regs) | |||
866 | void *info = call_data->info; | 866 | void *info = call_data->info; |
867 | 867 | ||
868 | clear_softint(1 << irq); | 868 | clear_softint(1 << irq); |
869 | |||
870 | irq_enter(); | ||
871 | |||
872 | if (!call_data->wait) { | ||
873 | /* let initiator proceed after getting data */ | ||
874 | atomic_inc(&call_data->finished); | ||
875 | } | ||
876 | |||
877 | func(info); | ||
878 | |||
879 | irq_exit(); | ||
880 | |||
869 | if (call_data->wait) { | 881 | if (call_data->wait) { |
870 | /* let initiator proceed only after completion */ | 882 | /* let initiator proceed only after completion */ |
871 | func(info); | ||
872 | atomic_inc(&call_data->finished); | 883 | atomic_inc(&call_data->finished); |
873 | } else { | ||
874 | /* let initiator proceed after getting data */ | ||
875 | atomic_inc(&call_data->finished); | ||
876 | func(info); | ||
877 | } | 884 | } |
878 | } | 885 | } |
879 | 886 | ||
@@ -1032,7 +1039,9 @@ void smp_receive_signal(int cpu) | |||
1032 | 1039 | ||
1033 | void smp_receive_signal_client(int irq, struct pt_regs *regs) | 1040 | void smp_receive_signal_client(int irq, struct pt_regs *regs) |
1034 | { | 1041 | { |
1042 | irq_enter(); | ||
1035 | clear_softint(1 << irq); | 1043 | clear_softint(1 << irq); |
1044 | irq_exit(); | ||
1036 | } | 1045 | } |
1037 | 1046 | ||
1038 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | 1047 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) |
@@ -1040,6 +1049,8 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | |||
1040 | struct mm_struct *mm; | 1049 | struct mm_struct *mm; |
1041 | unsigned long flags; | 1050 | unsigned long flags; |
1042 | 1051 | ||
1052 | irq_enter(); | ||
1053 | |||
1043 | clear_softint(1 << irq); | 1054 | clear_softint(1 << irq); |
1044 | 1055 | ||
1045 | /* See if we need to allocate a new TLB context because | 1056 | /* See if we need to allocate a new TLB context because |
@@ -1059,6 +1070,8 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | |||
1059 | load_secondary_context(mm); | 1070 | load_secondary_context(mm); |
1060 | __flush_tlb_mm(CTX_HWBITS(mm->context), | 1071 | __flush_tlb_mm(CTX_HWBITS(mm->context), |
1061 | SECONDARY_CONTEXT); | 1072 | SECONDARY_CONTEXT); |
1073 | |||
1074 | irq_exit(); | ||
1062 | } | 1075 | } |
1063 | 1076 | ||
1064 | void smp_new_mmu_context_version(void) | 1077 | void smp_new_mmu_context_version(void) |
@@ -1217,6 +1230,8 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs) | |||
1217 | { | 1230 | { |
1218 | clear_softint(1 << irq); | 1231 | clear_softint(1 << irq); |
1219 | 1232 | ||
1233 | irq_enter(); | ||
1234 | |||
1220 | preempt_disable(); | 1235 | preempt_disable(); |
1221 | 1236 | ||
1222 | __asm__ __volatile__("flushw"); | 1237 | __asm__ __volatile__("flushw"); |
@@ -1229,6 +1244,8 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs) | |||
1229 | prom_world(0); | 1244 | prom_world(0); |
1230 | 1245 | ||
1231 | preempt_enable(); | 1246 | preempt_enable(); |
1247 | |||
1248 | irq_exit(); | ||
1232 | } | 1249 | } |
1233 | 1250 | ||
1234 | /* /proc/profile writes can call this, don't __init it please. */ | 1251 | /* /proc/profile writes can call this, don't __init it please. */ |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 73ed01ba40dc..8d4761f15fa9 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -454,8 +454,8 @@ asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second, | |||
454 | err = sys_semget(first, (int)second, (int)third); | 454 | err = sys_semget(first, (int)second, (int)third); |
455 | goto out; | 455 | goto out; |
456 | case SEMCTL: { | 456 | case SEMCTL: { |
457 | err = sys_semctl(first, third, | 457 | err = sys_semctl(first, second, |
458 | (int)second | IPC_64, | 458 | (int)third | IPC_64, |
459 | (union semun) ptr); | 459 | (union semun) ptr); |
460 | goto out; | 460 | goto out; |
461 | } | 461 | } |