Implement an architecture function cpu_mplock_contested() which is
commit743dc42682f3ed193ee4b1c09532fbe467a5796c
authordillon <dillon>
Mon, 2 Jul 2007 01:37:11 +0000 (2 01:37 +0000)
committerdillon <dillon>
Mon, 2 Jul 2007 01:37:11 +0000 (2 01:37 +0000)
tree25d7984ba28249fdd3a85ced35802a7f8b8697db
parent6f44a701962522aaf4a9702d42dd02bf0ee418eb
Implement an architecture function cpu_mplock_contested() which is
called by the LWKT thread scheduler when the only thread(s) it can
schedule need the MP lock and the scheduler was unable to acquire the
MP lock.

On real systems this function just executes the cpu 'pause' instruction,
and on virtual systems this functions sleeps for a millisecond.

Use umtx_sleep() instead of sigpause() in the virtual kernel's idle loop
to interlock threads scheduled via a signal with the idle loop sleep.
This fixes a race condition that caused the vkernel to stop scheduling
(but there may be more issues, stay tuned).
sys/kern/lwkt_thread.c
sys/platform/pc32/i386/machdep.c
sys/platform/vkernel/i386/cpu_regs.c
sys/sys/systm.h