summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_clock.c')
-rw-r--r--sys/kern/kern_clock.c65
1 files changed, 52 insertions, 13 deletions
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c
index a04640ae7a3..8a34e63d16c 100644
--- a/sys/kern/kern_clock.c
+++ b/sys/kern/kern_clock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_clock.c,v 1.42 2003/06/02 23:28:05 millert Exp $ */
+/* $OpenBSD: kern_clock.c,v 1.43 2004/06/09 20:18:28 art Exp $ */
/* $NetBSD: kern_clock.c,v 1.34 1996/06/09 04:51:03 briggs Exp $ */
/*-
@@ -159,13 +159,15 @@ initclocks()
* The real-time timer, interrupting hz times per second.
*/
void
-hardclock(frame)
- register struct clockframe *frame;
+hardclock(struct clockframe *frame)
{
- register struct proc *p;
- register int delta;
+ struct proc *p;
+ int delta;
extern int tickdelta;
extern long timedelta;
+#ifdef __HAVE_CPUINFO
+ struct cpu_info *ci = curcpu();
+#endif
p = curproc;
if (p) {
@@ -190,6 +192,11 @@ hardclock(frame)
if (stathz == 0)
statclock(frame);
+#ifdef __HAVE_CPUINFO
+ if (--ci->ci_schedstate.spc_rrticks <= 0)
+ roundrobin(ci);
+#endif
+
/*
* Increment the time-of-day. The increment is normally just
* ``tick''. If the machine is one which has a clock frequency
@@ -388,18 +395,40 @@ stopprofclock(p)
* do process and kernel statistics.
*/
void
-statclock(frame)
- register struct clockframe *frame;
+statclock(struct clockframe *frame)
{
#ifdef GPROF
- register struct gmonparam *g;
- register int i;
+ struct gmonparam *g;
+ int i;
#endif
+#ifdef __HAVE_CPUINFO
+ struct cpu_info *ci = curcpu();
+ struct schedstate_percpu *spc = &ci->ci_schedstate;
+#else
static int schedclk;
- register struct proc *p;
+#endif
+ struct proc *p = curproc;
+
+#ifdef __HAVE_CPUINFO
+ /*
+ * Notice changes in divisor frequency, and adjust clock
+ * frequency accordingly.
+ */
+ if (spc->spc_psdiv != psdiv) {
+ spc->spc_psdiv = psdiv;
+ spc->spc_pscnt = psdiv;
+ if (psdiv == 1) {
+ setstatclockrate(stathz);
+ } else {
+ setstatclockrate(profhz);
+ }
+ }
+/* XXX Kludgey */
+#define pscnt spc->spc_pscnt
+#define cp_time spc->spc_cp_time
+#endif
if (CLKF_USERMODE(frame)) {
- p = curproc;
if (p->p_flag & P_PROFIL)
addupc_intr(p, CLKF_PC(frame));
if (--pscnt > 0)
@@ -441,7 +470,6 @@ statclock(frame)
* so that we know how much of its real time was spent
* in ``non-process'' (i.e., interrupt) work.
*/
- p = curproc;
if (CLKF_INTR(frame)) {
if (p != NULL)
p->p_iticks++;
@@ -454,15 +482,26 @@ statclock(frame)
}
pscnt = psdiv;
+#ifdef __HAVE_CPUINFO
+#undef pscnt
+#undef cp_time
+#endif
+
if (p != NULL) {
p->p_cpticks++;
/*
* If no schedclock is provided, call it here at ~~12-25 Hz;
* ~~16 Hz is best
*/
- if (schedhz == 0)
+ if (schedhz == 0) {
+#ifdef __HAVE_CPUINFO
+ if ((++curcpu()->ci_schedstate.spc_schedticks & 3) == 0)
+ schedclock(p);
+#else
if ((++schedclk & 3) == 0)
schedclock(p);
+#endif
+ }
}
}