summaryrefslogtreecommitdiffstats
path: root/sys/kern/sched_ule.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-11-02 04:10:15 +0000
committerjeff <jeff@FreeBSD.org>2003-11-02 04:10:15 +0000
commit5c293e491d69436f938aa3d9c14f6604a3b091b1 (patch)
treec25930a4729db8e97275ceb1b51b929eb845665d /sys/kern/sched_ule.c
parent9bc370feb5a081c448d78c81b117ff22601aab4b (diff)
downloadFreeBSD-src-5c293e491d69436f938aa3d9c14f6604a3b091b1.zip
FreeBSD-src-5c293e491d69436f938aa3d9c14f6604a3b091b1.tar.gz
- Rename SCHED_PRI_NTHRESH to SCHED_SLICE_NTHRESH since it is only used in
slice assignment. Add a comment describing what it does. - Remove a stale XXX comment, the nice should not impact the interactivity, nice adjustments only effect non-interactive tasks in ULE. - Don't allow nice -20 tasks to totally starve nice 0 tasks. Give them at least SCHED_SLICE_MIN ticks. We still allow nice 0 tasks to starve nice +20 tasks as intended.
Diffstat (limited to 'sys/kern/sched_ule.c')
-rw-r--r--sys/kern/sched_ule.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c
index 7f8acd8..246adc4 100644
--- a/sys/kern/sched_ule.c
+++ b/sys/kern/sched_ule.c
@@ -140,7 +140,6 @@ struct td_sched *thread0_sched = &td_sched;
#define SCHED_PRI_RANGE (PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE + 1)
#define SCHED_PRI_NRESV ((PRIO_MAX - PRIO_MIN) + 1)
#define SCHED_PRI_NHALF (SCHED_PRI_NRESV / 2)
-#define SCHED_PRI_NTHRESH (SCHED_PRI_NHALF - 1)
#define SCHED_PRI_BASE (PRI_MIN_TIMESHARE)
#define SCHED_PRI_INTERACT(score) \
((score) * SCHED_PRI_RANGE / SCHED_INTERACT_MAX)
@@ -169,19 +168,19 @@ struct td_sched *thread0_sched = &td_sched;
* SLICE_RANGE: Range of available time slices scaled by hz.
* SLICE_SCALE: The number slices granted per val in the range of [0, max].
* SLICE_NICE: Determine the amount of slice granted to a scaled nice.
+ * SLICE_NTHRESH: The nice cutoff point for slice assignment.
*/
#define SCHED_SLICE_MIN (slice_min)
#define SCHED_SLICE_MAX (slice_max)
+#define SCHED_SLICE_NTHRESH (SCHED_PRI_NHALF - 1)
#define SCHED_SLICE_RANGE (SCHED_SLICE_MAX - SCHED_SLICE_MIN + 1)
#define SCHED_SLICE_SCALE(val, max) (((val) * SCHED_SLICE_RANGE) / (max))
#define SCHED_SLICE_NICE(nice) \
- (SCHED_SLICE_MAX - SCHED_SLICE_SCALE((nice), SCHED_PRI_NTHRESH))
+ (SCHED_SLICE_MAX - SCHED_SLICE_SCALE((nice), SCHED_SLICE_NTHRESH))
/*
* This macro determines whether or not the kse belongs on the current or
* next run queue.
- *
- * XXX nice value should effect how interactive a kg is.
*/
#define SCHED_INTERACTIVE(kg) \
(sched_interact_score(kg) < SCHED_INTERACT_THRESH)
@@ -764,12 +763,12 @@ sched_slice(struct kse *ke)
* nice kse on the run queue. Slice size is determined by
* the kse distance from the last nice ksegrp.
*
- * If you are outside of the window you will get no slice and
- * you will be reevaluated each time you are selected on the
- * run queue.
- *
+ * If the kse is outside of the window it will get no slice
+ * and will be reevaluated each time it is selected on the
+ * run queue. The exception to this is nice 0 ksegs when
+ * a nice -20 is running. They are always granted a minimum
+ * slice.
*/
-
if (!SCHED_INTERACTIVE(kg)) {
int nice;
@@ -777,8 +776,10 @@ sched_slice(struct kse *ke)
if (kseq->ksq_loads[PRI_TIMESHARE] == 0 ||
kg->kg_nice < kseq->ksq_nicemin)
ke->ke_slice = SCHED_SLICE_MAX;
- else if (nice <= SCHED_PRI_NTHRESH)
+ else if (nice <= SCHED_SLICE_NTHRESH)
ke->ke_slice = SCHED_SLICE_NICE(nice);
+ else if (kg->kg_nice == 0)
+ ke->ke_slice = SCHED_SLICE_MIN;
else
ke->ke_slice = 0;
} else
OpenPOWER on IntegriCloud