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