diff options
| author | David Xu <davidxu@FreeBSD.org> | 2007-12-11 08:25:36 +0000 |
|---|---|---|
| committer | David Xu <davidxu@FreeBSD.org> | 2007-12-11 08:25:36 +0000 |
| commit | 435806d31b24866b50e3d30ba323ae3a5ca05a44 (patch) | |
| tree | db8a9074c62e65619a0ea9e604c0544a7ed3ac32 /sys/kern | |
| parent | 6a663207e7858a40398eb368e7739b656b1005a6 (diff) | |
Notes
Diffstat (limited to 'sys/kern')
| -rw-r--r-- | sys/kern/kern_resource.c | 9 | ||||
| -rw-r--r-- | sys/kern/sched_4bsd.c | 13 | ||||
| -rw-r--r-- | sys/kern/sched_ule.c | 12 |
3 files changed, 17 insertions, 17 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 5086a5921a9c..4e22054c34bc 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 8a421436710a..f6e702e2080f 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 b11f617ead50..e9d946860f13 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); + } } /* |
