From 435806d31b24866b50e3d30ba323ae3a5ca05a44 Mon Sep 17 00:00:00 2001 From: David Xu Date: Tue, 11 Dec 2007 08:25:36 +0000 Subject: Fix LOR of thread lock and umtx's priority propagation mutex due to the reworking of scheduler lock. MFC: after 3 days --- sys/kern/kern_resource.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'sys/kern/kern_resource.c') 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 #include #include +#include #include #include @@ -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); } -- cgit v1.2.3