summaryrefslogtreecommitdiff
path: root/sys/kern/ksched.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/ksched.c')
-rw-r--r--sys/kern/ksched.c27
1 files changed, 19 insertions, 8 deletions
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: