Skip to content

Commit

Permalink
[PATCH] m68knommu: fix scheduling and race problems in idle loop
Browse files Browse the repository at this point in the history
Re-work the m68knommu specific idle code according to suggestions
from Nick Piggin <[email protected]>.

A couple of rules that we need to follow:

1. Preempt should now disabled over idle routines. Should only be enabled
to call schedule() then disabled again.

3. When cpu_idle finds (need_resched() == 'true'), it should call schedule().
It should not call schedule() otherwise.

Also fix interrupt locking around the need_resched() and cpu stop state
so that there is no race condition.

Signed-off-by: Greg Ungerer <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Greg Ungerer authored and Linus Torvalds committed Jun 3, 2005
1 parent f4d340c commit b05a720
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions arch/m68knommu/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ asmlinkage void ret_from_fork(void);
*/
void default_idle(void)
{
while(1) {
if (need_resched())
__asm__("stop #0x2000" : : : "cc");
schedule();
local_irq_disable();
while (!need_resched()) {
/* This stop will re-enable interrupts */
__asm__("stop #0x2000" : : : "cc");
local_irq_disable();
}
local_irq_enable();
}

void (*idle)(void) = default_idle;
Expand All @@ -63,7 +65,12 @@ void (*idle)(void) = default_idle;
void cpu_idle(void)
{
/* endless idle loop with no priority at all */
idle();
while (1) {
idle();
preempt_enable_no_resched();
schedule();
preempt_disable();
}
}

void machine_restart(char * __unused)
Expand Down

0 comments on commit b05a720

Please sign in to comment.