aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorBrian Feldman <green@FreeBSD.org>2000-04-30 18:33:43 +0000
committerBrian Feldman <green@FreeBSD.org>2000-04-30 18:33:43 +0000
commit226f14bc833581b7ea5ba4725ccab1b2b6311cd6 (patch)
treeb4f77345a77257afd96e28cfb010af0653ada6e1 /sys/kern
parent85a23112fdf24643c7df2afc9a0f4b19e95c9515 (diff)
downloadsrc-226f14bc833581b7ea5ba4725ccab1b2b6311cd6.tar.gz
src-226f14bc833581b7ea5ba4725ccab1b2b6311cd6.zip
Change the scheduler to actually respect the PUSER barrier. It's been
wrong for many years that negative niceness would lower the priority of a process below PUSER, and once below PUSER, there were conditionals in the code that are required to test for whether a process was in the kernel which would break. The breakage could (and did) cause lock-ups, basically nothing else but the least nice program being able to run in some conditions. The algorithm which adjusts the priority now subtracts PRIO_MIN to do things properly, and the ESTCPULIM() algorithm was updated to use PRIO_TOTAL (PRIO_MAX - PRIO_MIN) to calculate the estcpu. NICE_WEIGHT is now 1 to accomodate the full range of priorities better (a -20 process with full CPU time has the priority of a +0 process with no CPU time). There are now 20 queues (exactly; 80 priorities) for use in user processes' scheduling, and PUSER has been lowered to 48 to accomplish this. This means, to the user, that things will be scheduled more correctly (noticeable), there is no lock-up anymore WRT a niced -20 process never releasing the CPU time for other processes. In this fair system, tsleep()ed < PUSER processes now will get the proper higher priority than priority >= PUSER user processes. The detective work of this was done by me, along with part of the solution. Luoqi Chen has provided most of the solution, and really helped me understand what was happening better, to boot :) Submitted by: luoqi Concept reviewed by: bde
Notes
Notes: svn path=/head/; revision=59792
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_synch.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 3ae903d39d52..17547de96403 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -916,7 +916,7 @@ resetpriority(p)
if (p->p_rtprio.type == RTP_PRIO_NORMAL) {
newpriority = PUSER + p->p_estcpu / INVERSE_ESTCPU_WEIGHT +
- NICE_WEIGHT * p->p_nice;
+ NICE_WEIGHT * (p->p_nice - PRIO_MIN);
newpriority = min(newpriority, MAXPRI);
p->p_usrpri = newpriority;
}