summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_resource.c10
-rw-r--r--sys/kern/ksched.c27
2 files changed, 27 insertions, 10 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 81a03ef0afd49..f867839590465 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -471,14 +471,20 @@ rtp_to_pri(struct rtprio *rtp, struct thread *td)
u_char newpri;
u_char oldpri;
- if (rtp->prio > RTP_PRIO_MAX)
- return (EINVAL);
thread_lock(td);
switch (RTP_PRIO_BASE(rtp->type)) {
case RTP_PRIO_REALTIME:
+ if (rtp->prio > RTP_PRIO_MAX) {
+ thread_unlock(td);
+ return (EINVAL);
+ }
newpri = PRI_MIN_REALTIME + rtp->prio;
break;
case RTP_PRIO_NORMAL:
+ if (rtp->prio > (PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE)) {
+ thread_unlock(td);
+ return (EINVAL);
+ }
newpri = PRI_MIN_TIMESHARE + rtp->prio;
break;
case RTP_PRIO_IDLE:
diff --git a/sys/kern/ksched.c b/sys/kern/ksched.c
index 192034fec9cd2..2d11363c94a04 100644
--- a/sys/kern/ksched.c
+++ b/sys/kern/ksched.c
@@ -81,9 +81,8 @@ ksched_detach(struct ksched *ks)
* higher priority. It also permits sched_setparam to be
* implementation defined for SCHED_OTHER. I don't like
* the notion of inverted priorites for normal processes when
- * you can use "setpriority" for that.
+ * you can use "setpriority" for that.
*
- * I'm rejecting sched_setparam for SCHED_OTHER with EINVAL.
*/
/* Macros to convert between the unix (lower numerically is higher priority)
@@ -93,6 +92,9 @@ ksched_detach(struct ksched *ks)
#define p4prio_to_rtpprio(P) (RTP_PRIO_MAX - (P))
#define rtpprio_to_p4prio(P) (RTP_PRIO_MAX - (P))
+#define p4prio_to_tsprio(P) ((PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE) - (P))
+#define tsprio_to_p4prio(P) ((PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE) - (P))
+
/* These improve readability a bit for me:
*/
#define P1B_PRIO_MIN rtpprio_to_p4prio(RTP_PRIO_MAX)
@@ -134,9 +136,6 @@ ksched_setparam(struct ksched *ksched,
if (e == 0)
{
- if (policy == SCHED_OTHER)
- e = EINVAL;
- else
e = ksched_setscheduler(ksched, td, policy, param);
}
@@ -152,7 +151,16 @@ ksched_getparam(struct ksched *ksched,
pri_to_rtp(td, &rtp);
if (RTP_PRIO_IS_REALTIME(rtp.type))
param->sched_priority = rtpprio_to_p4prio(rtp.prio);
-
+ else {
+ if (PRI_MIN_TIMESHARE < rtp.prio)
+ /*
+ * The interactive score has it to min realtime
+ * so we must show max (64 most likely
+ */
+ param->sched_priority = (PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE);
+ else
+ param->sched_priority = tsprio_to_p4prio(rtp.prio);
+ }
return 0;
}
@@ -191,11 +199,14 @@ ksched_setscheduler(struct ksched *ksched,
break;
case SCHED_OTHER:
- {
+ if (param->sched_priority >= 0 &&
+ param->sched_priority <= (PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE)) {
rtp.type = RTP_PRIO_NORMAL;
rtp.prio = p4prio_to_rtpprio(param->sched_priority);
rtp_to_pri(&rtp, td);
- }
+ } else
+ e = EINVAL;
+
break;
default: