diff options
author | neel <neel@FreeBSD.org> | 2010-02-10 06:29:43 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2010-02-10 06:29:43 +0000 |
commit | 823d0c1a027aec87a938317d38b3281a610e44d4 (patch) | |
tree | b4d1e2e36a43af40475192361566dd51f588eba5 /sys/mips | |
parent | 5b7c0a4237eaf85c61be9933d3f541c8b03609d3 (diff) | |
download | FreeBSD-src-823d0c1a027aec87a938317d38b3281a610e44d4.zip FreeBSD-src-823d0c1a027aec87a938317d38b3281a610e44d4.tar.gz |
Call profclock() and statclock() explicitly on all cpus. Prior to this
change these functions were called only on the BSP indirectly via hardclock().
top -P now shows usage statistics of all cpus.
Diffstat (limited to 'sys/mips')
-rw-r--r-- | sys/mips/mips/tick.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/sys/mips/mips/tick.c b/sys/mips/mips/tick.c index b374cae..76055fa 100644 --- a/sys/mips/mips/tick.c +++ b/sys/mips/mips/tick.c @@ -55,7 +55,7 @@ uint64_t counter_freq; uint64_t cycles_per_tick; uint64_t cycles_per_usec; uint64_t cycles_per_sec; -uint64_t cycles_per_hz; +uint64_t cycles_per_hz, cycles_per_stathz, cycles_per_profhz; u_int32_t counter_upper = 0; u_int32_t counter_lower_last = 0; @@ -136,6 +136,9 @@ void mips_timer_init_params(uint64_t platform_counter_freq, int double_count) { + stathz = hz; + profhz = hz; + /* * XXX: Do not use printf here: uart code 8250 may use DELAY so this * function should be called before cninit. @@ -151,18 +154,23 @@ mips_timer_init_params(uint64_t platform_counter_freq, int double_count) cycles_per_tick = counter_freq / 1000; cycles_per_hz = counter_freq / hz; + cycles_per_stathz = counter_freq / stathz; + cycles_per_profhz = counter_freq / profhz; cycles_per_usec = counter_freq / (1 * 1000 * 1000); cycles_per_sec = counter_freq ; counter_timecounter.tc_frequency = counter_freq; - printf("hz=%d cyl_per_hz:%jd cyl_per_usec:%jd freq:%jd cyl_per_hz:%jd cyl_per_sec:%jd\n", + printf("hz=%d cyl_per_tick:%jd cyl_per_usec:%jd freq:%jd " + "cyl_per_hz:%jd cyl_per_stathz:%jd cyl_per_profhz:%jd " + "cyl_per_sec:%jd\n", hz, cycles_per_tick, cycles_per_usec, counter_freq, cycles_per_hz, - cycles_per_sec - ); + cycles_per_stathz, + cycles_per_profhz, + cycles_per_sec); set_cputicker(tick_ticker, counter_freq, 1); } @@ -280,17 +288,18 @@ clock_intr(void *arg) else hardclock_cpu(USERMODE(tf->sr)); } + /* Fire statclock at stathz. */ - cpu_ticks->stat_ticks += stathz; - if (cpu_ticks->stat_ticks >= cycles_per_hz) { - cpu_ticks->stat_ticks -= cycles_per_hz; + cpu_ticks->stat_ticks += cycles_per_tick; + if (cpu_ticks->stat_ticks >= cycles_per_stathz) { + cpu_ticks->stat_ticks -= cycles_per_stathz; statclock(USERMODE(tf->sr)); } /* Fire profclock at profhz, but only when needed. */ - cpu_ticks->prof_ticks += profhz; - if (cpu_ticks->prof_ticks >= cycles_per_hz) { - cpu_ticks->prof_ticks -= cycles_per_hz; + cpu_ticks->prof_ticks += cycles_per_tick; + if (cpu_ticks->prof_ticks >= cycles_per_profhz) { + cpu_ticks->prof_ticks -= cycles_per_profhz; if (profprocs != 0) profclock(USERMODE(tf->sr), tf->pc); } |