diff options
author | jhb <jhb@FreeBSD.org> | 2006-04-17 18:20:38 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-04-17 18:20:38 +0000 |
commit | d535a5cb818e93fdb882b2748621d7367c013113 (patch) | |
tree | 6e1e68443c878ae084bc35e7e36a8edf68ad3352 /sys/kern/kern_thr.c | |
parent | b4b950d049176bd4834f960bca79c4a2bdfd88c4 (diff) | |
download | FreeBSD-src-d535a5cb818e93fdb882b2748621d7367c013113.zip FreeBSD-src-d535a5cb818e93fdb882b2748621d7367c013113.tar.gz |
Change msleep() and tsleep() to not alter the calling thread's priority
if the specified priority is zero. This avoids a race where the calling
thread could read a snapshot of it's current priority, then a different
thread could change the first thread's priority, then the original thread
would call sched_prio() inside msleep() undoing the change made by the
second thread. I used a priority of zero as no thread that calls msleep()
or tsleep() should be specifying a priority of zero anyway.
The various places that passed 'curthread->td_priority' or some variant
as the priority now pass 0.
Diffstat (limited to 'sys/kern/kern_thr.c')
-rw-r--r-- | sys/kern/kern_thr.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index f589160..d0f786e 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -368,8 +368,8 @@ thr_suspend(struct thread *td, struct thr_suspend_args *uap) } PROC_LOCK(td->td_proc); if ((td->td_flags & TDF_THRWAKEUP) == 0) - error = msleep((void *)td, &td->td_proc->p_mtx, - td->td_priority | PCATCH, "lthr", hz); + error = msleep((void *)td, &td->td_proc->p_mtx, PCATCH, "lthr", + hz); if (td->td_flags & TDF_THRWAKEUP) { mtx_lock_spin(&sched_lock); td->td_flags &= ~TDF_THRWAKEUP; |