Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Aug 2012 13:36:43 +0400
From:      Anton Yuzhaninov <citrin@citrin.ru>
To:        freebsd-stable@freebsd.org
Subject:   Problem with IPMI KCS driver
Message-ID:  <503DE2AB.6030702@citrin.ru>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?503DE2AB.6030702>