save cpus.intena in sched(), so we get the right EFLAGS.IF value once a
timer-preempted kernel thread resumes execution in trap() after yield(). otherwise the kernel could get an arbitrary number of nested timer intrs.
This commit is contained in:
parent
15ce79de14
commit
228e500a0c
1 changed files with 5 additions and 1 deletions
6
proc.c
6
proc.c
|
@ -207,7 +207,7 @@ scheduler(void)
|
||||||
|
|
||||||
c = &cpus[cpu()];
|
c = &cpus[cpu()];
|
||||||
for(;;){
|
for(;;){
|
||||||
// Enable interrupts on this processor.
|
// Enable interrupts on this processor, in lieu of saving intena.
|
||||||
sti();
|
sti();
|
||||||
|
|
||||||
// Loop over process table looking for process to run.
|
// Loop over process table looking for process to run.
|
||||||
|
@ -240,6 +240,8 @@ scheduler(void)
|
||||||
void
|
void
|
||||||
sched(void)
|
sched(void)
|
||||||
{
|
{
|
||||||
|
int intena;
|
||||||
|
|
||||||
if(read_eflags()&FL_IF)
|
if(read_eflags()&FL_IF)
|
||||||
panic("sched interruptible");
|
panic("sched interruptible");
|
||||||
if(cp->state == RUNNING)
|
if(cp->state == RUNNING)
|
||||||
|
@ -249,7 +251,9 @@ sched(void)
|
||||||
if(cpus[cpu()].ncli != 1)
|
if(cpus[cpu()].ncli != 1)
|
||||||
panic("sched locks");
|
panic("sched locks");
|
||||||
|
|
||||||
|
intena = cpus[cpu()].intena;
|
||||||
swtch(&cp->context, &cpus[cpu()].context);
|
swtch(&cp->context, &cpus[cpu()].context);
|
||||||
|
cpus[cpu()].intena = intena;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Give up the CPU for one scheduling round.
|
// Give up the CPU for one scheduling round.
|
||||||
|
|
Loading…
Reference in a new issue