Make idle loop not miss a chance to schedule

Prevents the case where McKernel misses one chance to schedule a
task when an interrupt occurs just after enabling interrupt and
just before executing "halt" in the idle loop (in kernel/process.c).

refs #45
This commit is contained in:
Masamichi Takagi
2014-06-12 10:58:05 +09:00
parent bbb7f77706
commit a9bebf1e14
3 changed files with 12 additions and 6 deletions

View File

@ -510,6 +510,11 @@ void cpu_halt(void)
asm volatile("hlt");
}
void cpu_safe_halt(void)
{
asm volatile("sti; hlt");
}
void cpu_enable_interrupt(void)
{
asm volatile("sti");

View File

@ -1546,16 +1546,16 @@ void release_process(struct process *proc)
static void idle(void)
{
//unsigned int flags;
//flags = ihk_mc_spinlock_lock(&cpu_status_lock);
//ihk_mc_spinlock_unlock(&cpu_status_lock, flags);
cpu_local_var(status) = CPU_STATUS_IDLE;
cpu_enable_interrupt();
while (1) {
cpu_enable_interrupt();
schedule();
//cpu_local_var(status) = CPU_STATUS_IDLE;
cpu_halt();
cpu_disable_interrupt();
if (cpu_local_var(status) == CPU_STATUS_IDLE)
cpu_safe_halt();
else
cpu_enable_interrupt();
}
}

View File

@ -19,6 +19,7 @@
void cpu_enable_interrupt(void);
void cpu_disable_interrupt(void);
void cpu_halt(void);
void cpu_safe_halt(void);
void cpu_restore_interrupt(unsigned long);
void cpu_pause(void);