http://defect.opensolaris.org/bz/show_bug.cgi?id=6577
Bill Holler <bill.holler at sun.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|CAUSEKNOWN |FIXINPROGRESS
--- Comment #3 from Bill Holler <bill.holler at sun.com> 2009-02-11 19:24:08
---
The root cause was the code added to hpet_use_hpet_timer() to detect
changes of hpet_state (disable etc) caused the function to some times
return with the LAPIC Timer disabled by writing a large value to it.
When the CPU wakes up it reprogrammed the LAPIC Timer with this large value
+ current time which was too large of a value to fit in the LAPIC Timer
Current Count register. The fix is to fully switch back to using the
LAPIC Timer in the early exit scenario. Stress tests have been running
well with this fix:
@@ -1213,17 +1225,21 @@
lapic_count = apic_timer_stop_count();
now = gethrtime();
*lapic_expire = expire = now + lapic_count;
- if ((lapic_count == (hrtime_t)-1) ||
- (hpet_state.cpr == B_TRUE) ||
- (hpet_state.cpu_deep_idle == B_FALSE) ||
- (hpet_state.proxy_installed == B_FALSE) ||
- (hpet_state.uni_cstate == B_TRUE)) {
+ if (lapic_count == (hrtime_t)-1) {
/*
* LAPIC timer is currently disabled.
* Will not use the HPET as a LAPIC Timer proxy.
*/
*lapic_expire = (hrtime_t)HPET_INFINITY;
return (B_TRUE);
+ }
+ if ((hpet_state.cpr == B_TRUE) ||
+ (hpet_state.cpu_deep_idle == B_FALSE) ||
+ (hpet_state.proxy_installed == B_FALSE) ||
+ (hpet_state.uni_cstate == B_TRUE)) {
+ apic_timer_restart(expire);
+ *lapic_expire = (hrtime_t)HPET_INFINITY;
+ return (B_FALSE);
}
}
--
Configure bugmail: http://defect.opensolaris.org/bz/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.