projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
UPAGES 8; dumpstack 96; msgbufmap; kernacc rounding bug fixed
[unix-history]
/
usr
/
src
/
sys
/
kern
/
kern_clock.c
diff --git
a/usr/src/sys/kern/kern_clock.c
b/usr/src/sys/kern/kern_clock.c
index
e538074
..
fc68fc6
100644
(file)
--- a/
usr/src/sys/kern/kern_clock.c
+++ b/
usr/src/sys/kern/kern_clock.c
@@
-1,7
+1,8
@@
-/* kern_clock.c
3.8 %H
% */
+/* kern_clock.c
4.5 %G
% */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
+#include "../h/dk.h"
#include "../h/callo.h"
#include "../h/seg.h"
#include "../h/dir.h"
#include "../h/callo.h"
#include "../h/seg.h"
#include "../h/dir.h"
@@
-12,12
+13,22
@@
#include "../h/vm.h"
#include "../h/buf.h"
#include "../h/text.h"
#include "../h/vm.h"
#include "../h/buf.h"
#include "../h/text.h"
+#include "../h/vlimit.h"
+#include "../h/mtpr.h"
+#include "../h/clock.h"
+
+#include "dh.h"
+#include "dz.h"
#define SCHMAG 9/10
#define SCHMAG 9/10
+/*
+ * Constant for decay filter for cpu usage.
+ */
+double ccpu = 0.95122942450071400909; /* exp(-1/20) */
/*
/*
- *
c
lock is called straight from
+ *
C
lock is called straight from
* the real time clock interrupt.
*
* Functions:
* the real time clock interrupt.
*
* Functions:
@@
-46,7
+57,7
@@
caddr_t pc;
register struct callo *p1, *p2;
register struct proc *pp;
register int s;
register struct callo *p1, *p2;
register struct proc *pp;
register int s;
- int a;
+ int a
, cpstate, i
;
/*
* reprime clock
/*
* reprime clock
@@
-108,11
+119,18
@@
out:
* so we can't enter them recursively and transpose characters.
*/
if (rcnt >= rintvl) {
* so we can't enter them recursively and transpose characters.
*/
if (rcnt >= rintvl) {
+#if NDH11 > 0
dhtimer();
dhtimer();
+#endif
+#if NDZ11 > 0
dztimer();
dztimer();
+#endif
rcnt = 0;
} else
rcnt++;
rcnt = 0;
} else
rcnt++;
+#ifdef CHAOS
+ ch_clock();
+#endif
if (!noproc) {
s = u.u_procp->p_rssize;
u.u_vm.vm_idsrss += s;
if (!noproc) {
s = u.u_procp->p_rssize;
u.u_vm.vm_idsrss += s;
@@
-124,22
+142,32
@@
out:
}
if (s > u.u_vm.vm_maxrss)
u.u_vm.vm_maxrss = s;
}
if (s > u.u_vm.vm_maxrss)
u.u_vm.vm_maxrss = s;
+ if ((u.u_vm.vm_utime+u.u_vm.vm_stime+1)/HZ > u.u_limit[LIM_CPU]) {
+ psignal(u.u_procp, SIGXCPU);
+ if (u.u_limit[LIM_CPU] < INFINITY - 5)
+ u.u_limit[LIM_CPU] += 5;
+ }
}
}
- a = dk_busy&07;
if (USERMODE(ps)) {
u.u_vm.vm_utime++;
if(u.u_procp->p_nice > NZERO)
if (USERMODE(ps)) {
u.u_vm.vm_utime++;
if(u.u_procp->p_nice > NZERO)
- a += 8;
+ cpstate = CP_NICE;
+ else
+ cpstate = CP_USER;
} else {
} else {
-
a += 16
;
+
cpstate = CP_SYS
;
if (noproc)
if (noproc)
-
a += 8
;
+
cpstate = CP_IDLE
;
else
u.u_vm.vm_stime++;
}
else
u.u_vm.vm_stime++;
}
- dk_time[a]++;
+ cp_time[cpstate]++;
+ for (i = 0; i < DK_NDRIVE; i++)
+ if (dk_busy&(1<<i))
+ dk_time[i]++;
if (!noproc) {
pp = u.u_procp;
if (!noproc) {
pp = u.u_procp;
+ pp->p_cpticks++;
if(++pp->p_cpu == 0)
pp->p_cpu--;
if(pp->p_cpu % 16 == 0) {
if(++pp->p_cpu == 0)
pp->p_cpu--;
if(pp->p_cpu % 16 == 0) {
@@
-154,23
+182,45
@@
out:
runrun++;
}
if (lbolt >= HZ) {
runrun++;
}
if (lbolt >= HZ) {
+#if VAX==780
+ extern int hangcnt;
+#endif
+
if (BASEPRI(ps))
return;
lbolt -= HZ;
++time;
(void) spl1();
if (BASEPRI(ps))
return;
lbolt -= HZ;
++time;
(void) spl1();
+#if VAX==780
+ /*
+ * machdep.c:unhang uses hangcnt to make sure uba
+ * doesn't forget to interrupt (this has been observed).
+ * This prevents an accumulation of < 5 second uba failures
+ * from summing to a uba reset.
+ */
+ if (hangcnt)
+ hangcnt--;
+#endif
runrun++;
wakeup((caddr_t)&lbolt);
for(pp = &proc[0]; pp < &proc[NPROC]; pp++)
runrun++;
wakeup((caddr_t)&lbolt);
for(pp = &proc[0]; pp < &proc[NPROC]; pp++)
- if (pp->p_stat && pp->p_stat
<
SZOMB) {
+ if (pp->p_stat && pp->p_stat
!=
SZOMB) {
if(pp->p_time != 127)
pp->p_time++;
if(pp->p_clktim)
if(--pp->p_clktim == 0)
if (pp->p_flag & STIMO) {
s = spl6();
if(pp->p_time != 127)
pp->p_time++;
if(pp->p_clktim)
if(--pp->p_clktim == 0)
if (pp->p_flag & STIMO) {
s = spl6();
- if (pp->p_stat == SSLEEP)
+ switch (pp->p_stat) {
+
+ case SSLEEP:
setrun(pp);
setrun(pp);
+ break;
+
+ case SSTOP:
+ unsleep(pp);
+ break;
+ }
pp->p_flag &= ~STIMO;
splx(s);
} else
pp->p_flag &= ~STIMO;
splx(s);
} else
@@
-178,10
+228,10
@@
out:
if(pp->p_stat==SSLEEP||pp->p_stat==SSTOP)
if (pp->p_slptime != 127)
pp->p_slptime++;
if(pp->p_stat==SSLEEP||pp->p_stat==SSTOP)
if (pp->p_slptime != 127)
pp->p_slptime++;
- if
(pp->p_flag&SLOAD) {
- ave(pp->p_aveflt, pp->p_faults, 5);
-
pp->p_faults = 0
;
- }
+ if
(pp->p_flag&SLOAD)
+ pp->p_pctcpu = ccpu * pp->p_pctcpu +
+
(1.0 - ccpu) * (pp->p_cpticks/(float)HZ)
;
+ pp->p_cpticks = 0;
a = (pp->p_cpu & 0377)*SCHMAG + pp->p_nice - NZERO;
if(a < 0)
a = 0;
a = (pp->p_cpu & 0377)*SCHMAG + pp->p_nice - NZERO;
if(a < 0)
a = 0;
@@
-217,7
+267,6
@@
out:
*/
if (bclnlist != NULL)
wakeup((caddr_t)&proc[2]);
*/
if (bclnlist != NULL)
wakeup((caddr_t)&proc[2]);
-#ifdef ERNIE
if (USERMODE(ps)) {
pp = u.u_procp;
if (pp->p_uid)
if (USERMODE(ps)) {
pp = u.u_procp;
if (pp->p_uid)
@@
-226,8
+275,11
@@
out:
(void) setpri(pp);
pp->p_pri = pp->p_usrpri;
}
(void) setpri(pp);
pp->p_pri = pp->p_usrpri;
}
-#endif
}
}
+#if VAX==780
+ if (!BASEPRI(ps))
+ unhang();
+#endif
if (USERMODE(ps)) {
/*
* We do this last since it
if (USERMODE(ps)) {
/*
* We do this last since it