summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2007-12-11 08:25:36 +0000
committerdavidxu <davidxu@FreeBSD.org>2007-12-11 08:25:36 +0000
commit3695a7888976774d0e42b137f3ffa7d6f8aa6519 (patch)
treedb8a9074c62e65619a0ea9e604c0544a7ed3ac32
parent50439b0991ca4d4578f2860fd70d8ac7a4e45adc (diff)
downloadFreeBSD-src-3695a7888976774d0e42b137f3ffa7d6f8aa6519.zip
FreeBSD-src-3695a7888976774d0e42b137f3ffa7d6f8aa6519.tar.gz
Fix LOR of thread lock and umtx's priority propagation mutex due
to the reworking of scheduler lock. MFC: after 3 days
-rw-r--r--sys/kern/kern_resource.c9
-rw-r--r--sys/kern/sched_4bsd.c13
-rw-r--r--sys/kern/sched_ule.c12
3 files changed, 17 insertions, 17 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 5086a59..4e22054 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/syscallsubr.h>
#include <sys/sysent.h>
#include <sys/time.h>
+#include <sys/umtx.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -482,6 +483,7 @@ int
rtp_to_pri(struct rtprio *rtp, struct thread *td)
{
u_char newpri;
+ u_char oldpri;
if (rtp->prio > RTP_PRIO_MAX)
return (EINVAL);
@@ -501,10 +503,15 @@ rtp_to_pri(struct rtprio *rtp, struct thread *td)
return (EINVAL);
}
sched_class(td, rtp->type); /* XXX fix */
+ oldpri = td->td_user_pri;
sched_user_prio(td, newpri);
if (curthread == td)
sched_prio(curthread, td->td_user_pri); /* XXX dubious */
- thread_unlock(td);
+ if (TD_ON_UPILOCK(td) && oldpri != newpri) {
+ thread_unlock(td);
+ umtx_pi_adjust(td, oldpri);
+ } else
+ thread_unlock(td);
return (0);
}
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 8a42143..f6e702e 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -762,14 +762,12 @@ sched_user_prio(struct thread *td, u_char prio)
{
u_char oldprio;
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
td->td_base_user_pri = prio;
if (td->td_flags & TDF_UBORROWING && td->td_user_pri <= prio)
return;
oldprio = td->td_user_pri;
td->td_user_pri = prio;
-
- if (TD_ON_UPILOCK(td) && oldprio != prio)
- umtx_pi_adjust(td, oldprio);
}
void
@@ -777,13 +775,10 @@ sched_lend_user_prio(struct thread *td, u_char prio)
{
u_char oldprio;
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
td->td_flags |= TDF_UBORROWING;
-
oldprio = td->td_user_pri;
td->td_user_pri = prio;
-
- if (TD_ON_UPILOCK(td) && oldprio != prio)
- umtx_pi_adjust(td, oldprio);
}
void
@@ -791,12 +786,14 @@ sched_unlend_user_prio(struct thread *td, u_char prio)
{
u_char base_pri;
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
base_pri = td->td_base_user_pri;
if (prio >= base_pri) {
td->td_flags &= ~TDF_UBORROWING;
sched_user_prio(td, base_pri);
- } else
+ } else {
sched_lend_user_prio(td, prio);
+ }
}
void
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c
index b11f617..e9d9468 100644
--- a/sys/kern/sched_ule.c
+++ b/sys/kern/sched_ule.c
@@ -1709,9 +1709,6 @@ sched_user_prio(struct thread *td, u_char prio)
return;
oldprio = td->td_user_pri;
td->td_user_pri = prio;
-
- if (TD_ON_UPILOCK(td) && oldprio != prio)
- umtx_pi_adjust(td, oldprio);
}
void
@@ -1719,13 +1716,10 @@ sched_lend_user_prio(struct thread *td, u_char prio)
{
u_char oldprio;
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
td->td_flags |= TDF_UBORROWING;
-
oldprio = td->td_user_pri;
td->td_user_pri = prio;
-
- if (TD_ON_UPILOCK(td) && oldprio != prio)
- umtx_pi_adjust(td, oldprio);
}
void
@@ -1733,12 +1727,14 @@ sched_unlend_user_prio(struct thread *td, u_char prio)
{
u_char base_pri;
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
base_pri = td->td_base_user_pri;
if (prio >= base_pri) {
td->td_flags &= ~TDF_UBORROWING;
sched_user_prio(td, base_pri);
- } else
+ } else {
sched_lend_user_prio(td, prio);
+ }
}
/*
OpenPOWER on IntegriCloud