aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/smp-tbsync.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2006-08-30 16:10:47 +1000
committerPaul Mackerras <paulus@samba.org>2006-08-30 16:10:47 +1000
commit467c37801c453849a2fe243c3226476ee3985868 (patch)
treeb1e9dedf59ff9144945cb711a96274f4ca9bce62 /arch/powerpc/kernel/smp-tbsync.c
parent[POWERPC] Fix problem with time not advancing on 32-bit platforms (diff)
downloadlinux-dev-467c37801c453849a2fe243c3226476ee3985868.tar.xz
linux-dev-467c37801c453849a2fe243c3226476ee3985868.zip
[POWERPC] Fix irq enable/disable in smp_generic_take_timebase
Eran Ben-Avi <eranpublic@yahoo.com> pointed out that the arch/ppc version of smp_generic_take_timebase disables interrupts on entry but exits without restoring them. However, both it and the arch/powerpc version have another problem, which is that they use local_irq_disable/enable rather than local_irq_save/restore, and they are called with interrupts disabled. This fixes both problems; it changes a return to a break in the arch/ppc version, and changes both versions to use local_irq_save/restore. Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/smp-tbsync.c')
-rw-r--r--arch/powerpc/kernel/smp-tbsync.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/smp-tbsync.c b/arch/powerpc/kernel/smp-tbsync.c
index f19e2e0e61e7..de59c6c31a5b 100644
--- a/arch/powerpc/kernel/smp-tbsync.c
+++ b/arch/powerpc/kernel/smp-tbsync.c
@@ -45,8 +45,9 @@ void __devinit smp_generic_take_timebase(void)
{
int cmd;
u64 tb;
+ unsigned long flags;
- local_irq_disable();
+ local_irq_save(flags);
while (!running)
barrier();
rmb();
@@ -70,7 +71,7 @@ void __devinit smp_generic_take_timebase(void)
set_tb(tb >> 32, tb & 0xfffffffful);
enter_contest(tbsync->mark, -1);
}
- local_irq_enable();
+ local_irq_restore(flags);
}
static int __devinit start_contest(int cmd, long offset, int num)