Problem with IPMI KCS driver
Anton Yuzhaninov
citrin at citrin.ru
Wed Aug 29 09:36:51 UTC 2012
We use servers witch motherboard Supermicro X8DTT-H and meet with such problem:
when watchdogd started, server is rebooted by IPMI watchdog several times per week.
After some debugging I've found, that sometimes IPMI driver entered endless
loop, and watchdogd have no chances to reset watchdog timer.
In such situation top show:
PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
...
113 root -16 - 0K 16K CPU4 4 17:18 99.17% ipmi0: kcs
Endless loop located in file /sys/dev/ipmi/ipmi_kcs.c and function
kcs_wait_for_obf():
int status, start = ticks;
status = INB(sc, KCS_CTL_STS);
if (state == 0) {
/* WAIT FOR OBF = 0 */
while (ticks - start < MAX_TIMEOUT && status & KCS_STATUS_OBF) {
DELAY(100);
status = INB(sc, KCS_CTL_STS);
}
} else {
/* WAIT FOR OBF = 1 */
while (ticks - start < MAX_TIMEOUT &&
!(status & KCS_STATUS_OBF)) {
DELAY(100);
status = INB(sc, KCS_CTL_STS);
}
}
It seems to be, that this loop intended to run no more than MAX_TIMEOUT ticks.
but by some reason this timeout does not works and loop runs until reboot.
Questions:
1. Is it correct to check ticks to implement timeout here?
2. how to fix this timeout?
--
Anton Yuzhaninov
More information about the freebsd-stable
mailing list