summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_poll.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-04-17 18:20:38 +0000
committerjhb <jhb@FreeBSD.org>2006-04-17 18:20:38 +0000
commitd535a5cb818e93fdb882b2748621d7367c013113 (patch)
tree6e1e68443c878ae084bc35e7e36a8edf68ad3352 /sys/kern/kern_poll.c
parentb4b950d049176bd4834f960bca79c4a2bdfd88c4 (diff)
downloadFreeBSD-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_poll.c')
-rw-r--r--sys/kern/kern_poll.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sys/kern/kern_poll.c b/sys/kern/kern_poll.c
index 992116f..dadd7a3 100644
--- a/sys/kern/kern_poll.c
+++ b/sys/kern/kern_poll.c
@@ -577,13 +577,11 @@ poll_idle(void)
{
struct thread *td = curthread;
struct rtprio rtp;
- int pri;
rtp.prio = RTP_PRIO_MAX; /* lowest priority */
rtp.type = RTP_PRIO_IDLE;
mtx_lock_spin(&sched_lock);
rtp_to_pri(&rtp, td->td_ksegrp);
- pri = td->td_priority;
mtx_unlock_spin(&sched_lock);
for (;;) {
@@ -595,7 +593,7 @@ poll_idle(void)
mtx_unlock_spin(&sched_lock);
} else {
idlepoll_sleeping = 1;
- tsleep(&idlepoll_sleeping, pri, "pollid", hz * 3);
+ tsleep(&idlepoll_sleeping, 0, "pollid", hz * 3);
}
}
}
OpenPOWER on IntegriCloud