diff options
author | davidxu <davidxu@FreeBSD.org> | 2006-08-23 07:22:25 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2006-08-23 07:22:25 +0000 |
commit | 97c67e6558088fac965f8acb87287b370b351cd4 (patch) | |
tree | 078ac11799a299d461577ee1796937fd62d1f6a3 /sys/kern | |
parent | 9d8a6296286b3c0feb1c3eab11f1894f22259c9a (diff) | |
download | FreeBSD-src-97c67e6558088fac965f8acb87287b370b351cd4.zip FreeBSD-src-97c67e6558088fac965f8acb87287b370b351cd4.tar.gz |
POSIX requires that higher numerical values for the priority represent
higher priorities, so we should reverse the passed value here.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_thr.c | 78 |
1 files changed, 39 insertions, 39 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index a57e4a1..ba3c5fb 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -450,31 +450,32 @@ thr_setscheduler(struct thread *td, struct thr_setscheduler_args *uap) return (EINVAL); ret = copyin(uap->param, ¶m, sizeof(struct sched_param)); - if (ret) + if (ret != 0) return (ret); - + + ret = suser(td); + if (ret != 0) + return (ret); + switch(uap->policy) { case SCHED_FIFO: - if (suser(td) != 0) - return (EPERM); rtp.type = PRI_FIFO; + rtp.prio = RTP_PRIO_MAX - param.sched_priority; break; case SCHED_RR: - if (suser(td) != 0) - return (EPERM); rtp.type = PRI_REALTIME; + rtp.prio = RTP_PRIO_MAX - param.sched_priority; break; case SCHED_OTHER: rtp.type = PRI_TIMESHARE; + rtp.prio = 0; break; default: return (EINVAL); - } - rtp.prio = param.sched_priority; + } p = td->td_proc; PROC_LOCK(p); - ret = p_cansched(td, p); if (ret != 0) { PROC_UNLOCK(p); return (ret); @@ -487,12 +488,8 @@ thr_setscheduler(struct thread *td, struct thr_setscheduler_args *uap) } mtx_lock_spin(&sched_lock); ret = rtp_to_pri(&rtp, ttd->td_ksegrp); - if (ret == 0) { - if (TD_IS_RUNNING(ttd)) - ttd->td_flags |= TDF_NEEDRESCHED; - else if (ttd->td_priority > ttd->td_ksegrp->kg_user_pri) - sched_prio(ttd, ttd->td_ksegrp->kg_user_pri); - } + if (ret == 0) + ttd->td_flags |= TDF_NEEDRESCHED; mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); return (ret); @@ -519,24 +516,25 @@ thr_getscheduler(struct thread *td, struct thr_getscheduler_args *uap) return (ESRCH); } mtx_lock_spin(&sched_lock); + pri_to_rtp(ttd->td_ksegrp, &rtp); switch(ttd->td_ksegrp->kg_pri_class) { - case PRI_TIMESHARE: - policy = SCHED_OTHER; - break; case PRI_FIFO: policy = SCHED_FIFO; + param.sched_priority = RTP_PRIO_MAX - rtp.prio; break; case PRI_REALTIME: policy = SCHED_RR; + param.sched_priority = RTP_PRIO_MAX - rtp.prio; + break; + case PRI_TIMESHARE: + default: /* XXX SCHED_IDLE */ + policy = SCHED_OTHER; + param.sched_priority = 0; break; - default: - policy = SCHED_OTHER; /* XXX SCHED_IDLE */ } - pri_to_rtp(ttd->td_ksegrp, &rtp); mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); - param.sched_priority = rtp.prio; ret = copyout(&policy, uap->policy, sizeof(policy)); if (ret == 0) ret = copyout(¶m, uap->param, sizeof(param)); @@ -556,33 +554,35 @@ thr_setschedparam(struct thread *td, struct thr_setschedparam_args *uap) return (EINVAL); ret = copyin(uap->param, ¶m, sizeof(struct sched_param)); - if (ret) + if (ret != 0) + return (ret); + ret = suser(td); + if (ret != 0) return (ret); - p = td->td_proc; PROC_LOCK(p); - ret = p_cansched(td, p); - if (ret != 0) { - PROC_UNLOCK(p); - return (ret); - } - ttd = thread_find(p, uap->id); if (ttd == NULL) { PROC_UNLOCK(p); return (ESRCH); } - mtx_lock_spin(&sched_lock); - pri_to_rtp(ttd->td_ksegrp, &rtp); - rtp.prio = param.sched_priority; - ret = rtp_to_pri(&rtp, ttd->td_ksegrp); - if (ret == 0) { - if (TD_IS_RUNNING(ttd)) - ttd->td_flags |= TDF_NEEDRESCHED; - else if (ttd->td_priority > ttd->td_ksegrp->kg_user_pri) - sched_prio(ttd, ttd->td_ksegrp->kg_user_pri); + switch(ttd->td_ksegrp->kg_pri_class) { + case PRI_FIFO: + rtp.prio = RTP_PRIO_MAX - param.sched_priority; + break; + case PRI_REALTIME: + rtp.prio = RTP_PRIO_MAX - param.sched_priority; + break; + case PRI_TIMESHARE: + rtp.prio = 0; + break; + default: + return (EINVAL); } + ret = rtp_to_pri(&rtp, ttd->td_ksegrp); + if (ret == 0) + ttd->td_flags |= TDF_NEEDRESCHED; mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); return (ret); |