diff options
author | jeff <jeff@FreeBSD.org> | 2008-03-12 06:31:06 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2008-03-12 06:31:06 +0000 |
commit | 3b1acbdce295a5ace27e22dba0ae318570aea5bf (patch) | |
tree | 20ec4b3ab190fc07828f6c3f536e039ecdead59a /sys/kern/sched_4bsd.c | |
parent | ce12a09ced75026eed87f8a2a64d05ba98bb98d3 (diff) | |
download | FreeBSD-src-3b1acbdce295a5ace27e22dba0ae318570aea5bf.zip FreeBSD-src-3b1acbdce295a5ace27e22dba0ae318570aea5bf.tar.gz |
- Pass the priority argument from *sleep() into sleepq and down into
sched_sleep(). This removes extra thread_lock() acquisition and
allows the scheduler to decide what to do with the static boost.
- Change the priority arguments to cv_* to match sleepq/msleep/etc.
where 0 means no priority change. Catch -1 in cv_broadcastpri() and
convert it to 0 for now.
- Set a flag when sleeping in a way that is compatible with swapping
since direct priority comparisons are meaningless now.
- Add a sysctl to ule, kern.sched.static_boost, that defaults to on which
controls the boost behavior. Turning it off gives better performance
in some workloads but needs more investigation.
- While we're modifying sleepq, change signal and broadcast to both
return with the lock held as the lock was held on enter.
Reviewed by: jhb, peter
Diffstat (limited to 'sys/kern/sched_4bsd.c')
-rw-r--r-- | sys/kern/sched_4bsd.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 834788c..0232e09 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -799,12 +799,16 @@ sched_unlend_user_prio(struct thread *td, u_char prio) } void -sched_sleep(struct thread *td) +sched_sleep(struct thread *td, int pri) { THREAD_LOCK_ASSERT(td, MA_OWNED); td->td_slptick = ticks; td->td_sched->ts_slptime = 0; + if (pri) + sched_prio(td, pri); + if (TD_IS_SUSPENDED(td) || pri <= PSOCK) + td->td_flags |= TDF_CANSWAP; } void @@ -922,6 +926,7 @@ sched_wakeup(struct thread *td) THREAD_LOCK_ASSERT(td, MA_OWNED); ts = td->td_sched; + td->td_flags &= ~TDF_CANSWAP; if (ts->ts_slptime > 1) { updatepri(td); resetpriority(td); |