Skip to content

Commit

Permalink
[POWERPC] Fix irq enable/disable in smp_generic_take_timebase
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Mackerras committed Aug 30, 2006
1 parent e0d872d commit 467c378
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 5 deletions.
5 changes: 3 additions & 2 deletions arch/powerpc/kernel/smp-tbsync.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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)
Expand Down
7 changes: 4 additions & 3 deletions arch/ppc/kernel/smp-tbsync.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ void __devinit
smp_generic_take_timebase( void )
{
int cmd, tbl, tbu;
unsigned long flags;

local_irq_disable();
local_irq_save(flags);
while( !running )
;
rmb();
Expand All @@ -64,7 +65,7 @@ smp_generic_take_timebase( void )
tbu = tbsync->tbu;
tbsync->ack = 0;
if( cmd == kExit )
return;
break;

if( cmd == kSetAndTest ) {
while( tbsync->handshake )
Expand All @@ -77,7 +78,7 @@ smp_generic_take_timebase( void )
}
enter_contest( tbsync->mark, -1 );
}
local_irq_enable();
local_irq_restore(flags);
}

static int __devinit
Expand Down

0 comments on commit 467c378

Please sign in to comment.