From 4a88273db5df00c5d3397ad5bcef50eb68f4bef8 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Mon, 17 Oct 2022 04:07:24 -0400 Subject: oops. scheduler() inherits the interrupt status of the most recent process to run, so it must explicitly turn them on again. It would be better if cpu->intena were really thread->intena. --- kernel/proc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'kernel/proc.c') diff --git a/kernel/proc.c b/kernel/proc.c index bc4b274..809d112 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -447,12 +447,12 @@ scheduler(void) struct proc *p; struct cpu *c = mycpu(); - // Interrupts are disabled at first, but they must be - // enabled in order for the shell to get input. - intr_on(); - c->proc = 0; for(;;){ + // The most recent process to run may have had interrupts + // turned off; turn them on to avoid deadlock. + intr_on(); + for(p = proc; p < &proc[NPROC]; p++) { acquire(&p->lock); if(p->state == RUNNABLE) { -- cgit v1.2.3