Urk, I take it back (was Re: Bug in p_estcpu handling onprocess
exit in FBsd-4.x)
Dmitry Morozovsky
marck at rinet.ru
Tue Mar 23 04:31:13 PST 2004
On Sat, 20 Mar 2004, Matthew Dillon wrote:
MD> All right, I figured out a solution. Basically the solution for the
MD> 4.x scheduler (and the 4BSD scheduler in 5.x for people still using
MD> it) is to bump the child's estcpu in fork and recover any delta changes
MD> back to the parent in exit. The DFly patch set is rather DFly specific,
MD> so I will just explain it in case someone in FreeBSD land wants to fix
MD> the problem in FreeBSD-4.
[snip]
In case abyone interested the patch for stable as of today is attached.
Sincerely,
D.Marck [DM5020, MCK-RIPE, DM3-RIPN]
------------------------------------------------------------------------
*** Dmitry Morozovsky --- D.Marck --- Wild Woozle --- marck at rinet.ru ***
------------------------------------------------------------------------
-------------- next part --------------
# $Id: FreeBSD/Patches/contrib/matt-kernexit.patch,v 1.1 2004/03/23 11:00:44 marck Exp $
#
#-DSC-# DFBSD patch for fork-exit-priority bug
Index: sys/sys/proc.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/proc.h,v
retrieving revision 1.99.2.10
diff -u -r1.99.2.10 proc.h
--- sys/sys/proc.h 6 Jul 2003 16:35:47 -0000 1.99.2.10
+++ sys/sys/proc.h 23 Mar 2004 10:49:12 -0000
@@ -165,6 +165,7 @@
/* scheduling */
u_int p_estcpu; /* Time averaged value of p_cpticks. */
+ u_int p_estcpu_fork;
int p_cpticks; /* Ticks of cpu time. */
fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */
void *p_wchan; /* Sleep address. */
Index: sys/kern/kern_exit.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.92.2.13
diff -u -r1.92.2.13 kern_exit.c
--- sys/kern/kern_exit.c 3 Mar 2004 09:21:14 -0000 1.92.2.13
+++ sys/kern/kern_exit.c 23 Mar 2004 10:49:12 -0000
@@ -452,10 +452,16 @@
nfound++;
if (p->p_stat == SZOMB) {
- /* charge childs scheduling cpu usage to parent */
- if (curproc->p_pid != 1) {
- curproc->p_estcpu =
- ESTCPULIM(curproc->p_estcpu + p->p_estcpu);
+ /*
+ * Charge the parent for the child's change in
+ * estimated cpu as of when the child exits to
+ * account for batch scripts, large make's, etc.
+ */
+ if (q->p_pid != 1) {
+ if (p->p_estcpu > p->p_estcpu_fork) {
+ q->p_estcpu = ESTCPULIM(q->p_estcpu +
+ p->p_estcpu - p->p_estcpu_fork);
+ }
}
q->p_retval[0] = p->p_pid;
Index: sys/kern/kern_fork.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.72.2.16
diff -u -r1.72.2.16 kern_fork.c
--- sys/kern/kern_fork.c 11 Nov 2003 07:26:44 -0000 1.72.2.16
+++ sys/kern/kern_fork.c 23 Mar 2004 10:49:12 -0000
@@ -506,7 +506,8 @@
/*
* set priority of child to be that of parent
*/
- p2->p_estcpu = p1->p_estcpu;
+ p2->p_estcpu_fork = p2->p_estcpu =
+ ESTCPULIM(p1->p_estcpu + ESTCPURAMP);
/*
* This begins the section where we must prevent the parent
More information about the freebsd-stable
mailing list