Fixes irqsave issue with CVs
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 5 Nov 2012 21:22:34 +0000 (13:22 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 5 Nov 2012 21:22:34 +0000 (13:22 -0800)
commit13a74b883da91214350bb64ce19e66328413f8f5
tree795631d7d92176ed581092693042cbf105f30f09
parent7d9c5dc197258af17f3fab8840ffc678fdc0f255
Fixes irqsave issue with CVs

Using spinlock_irqsave like that isn't sufficient.  The spinlock_irqsave
really only works across a single lock/unlock pair (it saves the irq
state in the lock).  When we unlock, we potentially reenable irqs.

During the while loop (which enforces ordering), we basically are
holding a sort of lock.  Signallers run from irq context could interrupt
us, deadlocking the system.

Instead, we just have the caller of the CV tell us if we want IRQs off
or not.  Pay attention to the note in trap.c.

In the future, I might rewrite the kthread code to use CVs instead of
semaphores, which would get rid of the while loop/ordering.  Regardless,
I still prefer having the cv_*_irqsave() functions.
kern/arch/i686/trap.c
kern/include/kthread.h
kern/src/kthread.c