Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 May 2002 20:06:35 +0900
From:      Seigo Tanimura <tanimura@r.dl.itc.u-tokyo.ac.jp>
To:        jhb@FreeBSD.org
Cc:        current@FreeBSD.org, tanimura@r.dl.itc.u-tokyo.ac.jp
Subject:   preemption across processors
Message-ID:  <200205151106.g4FB6Z3i059559@rina.r.dl.itc.u-tokyo.ac.jp>

next in thread | raw e-mail | index | archive | help
Currently, a new runnable thread cannot preempt the thread on any
processor other than the thread that called mi_switch().  For
instance, we do something like the following in _mtx_unlock_sleep():

--- v --- _mtx_unlock_sleep() --- v ---
setrunqueue(th_waken_up);
if (curthread->preemptable && th_waken_up->priority < curthread->priority) {
	setrunqueue(curthread);
	mi_switch();
}
--- ^ --- _mtx_unlock_sleep() --- ^ ---

If the priority of curthread is higher than th_waken_up, we cannot run
it immediately even if there is another processor running a thread
with a priority lower than th_waken_up.  th_waken_up should preempt
that processor, or we would end up with a priority inversion.

Maybe we have to dispatch a runnable thread to the processor running
a thread with the lowest priority.  Solaris seems to take the
following steps to do that:

1. If a new thread has slept for longer than 3/100 seconds (this
   should be tunable), linearly search the processor running a thread
   with the lowest priority.  Otherwise, choose the processor that ran
   the new thread most recently.

2. Make an inter-processor interrupt to the processor chosen in 1.

3. The chosen processor puts its current thread back to the dispatch
   queue and performs a context switch to run the new thread.

Above is only a rough sketch.  We have to watch out for a race of
inter-processor interrupts and a processor entering a critical section.

If no one is working on preemption across processors, I would like to
see if I can do that.

Thanks.

-- 
Seigo Tanimura <tanimura@r.dl.itc.u-tokyo.ac.jp> <tanimura@FreeBSD.org>

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200205151106.g4FB6Z3i059559>