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:
@ -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");
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user