cvs commit: src/sys/kern kern_condvar.c kern_lock.c kern_sig.c
kern_sx.c kern_synch.c kern_thread.c subr_sleepqueue.c
src/sys/sys proc.h sleepqueue.h src/sys/vm vm_glue.c
Attilio Rao
attilio at freebsd.org
Wed Aug 6 15:04:55 UTC 2008
2008/8/5, John Baldwin <jhb at freebsd.org>:
> jhb 2008-08-05 20:02:31 UTC
>
> FreeBSD src repository
>
> Modified files:
> sys/kern kern_condvar.c kern_lock.c kern_sig.c
> kern_sx.c kern_synch.c kern_thread.c
> subr_sleepqueue.c
> sys/sys proc.h sleepqueue.h
> sys/vm vm_glue.c
> Log:
> SVN rev 181334 on 2008-08-05 20:02:31Z by jhb
>
> If a thread that is swapped out is made runnable, then the setrunnable()
> routine wakes up proc0 so that proc0 can swap the thread back in.
> Historically, this has been done by waking up proc0 directly from
> setrunnable() itself via a wakeup(). When waking up a sleeping thread
> that was swapped out (the usual case when waking proc0 since only sleeping
> threads are eligible to be swapped out), this resulted in a bit of
> recursion (e.g. wakeup() -> setrunnable() -> wakeup()).
>
> With sleep queues having separate locks in 6.x and later, this caused a
> spin lock LOR (sleepq lock -> sched_lock/thread lock -> sleepq lock).
> An attempt was made to fix this in 7.0 by making the proc0 wakeup use
> the ithread mechanism for doing the wakeup. However, this required
> grabbing proc0's thread lock to perform the wakeup. If proc0 was asleep
> elsewhere in the kernel (e.g. waiting for disk I/O), then this degenerated
> into the same LOR since the thread lock would be some other sleepq lock.
>
> Fix this by deferring the wakeup of the swapper until after the sleepq
> lock held by the upper layer has been locked. The setrunnable() routine
> now returns a boolean value to indicate whether or not proc0 needs to be
> woken up. The end result is that consumers of the sleepq API such as
> *sleep/wakeup, condition variables, sx locks, and lockmgr, have to wakeup
> proc0 if they get a non-zero return value from sleepq_abort(),
> sleepq_broadcast(), or sleepq_signal().
Could you please update sleepqueue(9) manpages reflecting prototipes
changes for sleepq_* functions?
Thanks,
Attilio
--
Peace can only be achieved by understanding - A. Einstein
More information about the cvs-src
mailing list