summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_resource.c')
-rw-r--r--sys/kern/kern_resource.c9
1 files changed, 8 insertions, 1 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);
}
OpenPOWER on IntegriCloud