NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/38019: some kind of undetected deadlock slowly kills NetBSD-4.0_STABLE GENERIC.MP



The following reply was made to PR kern/38019; it has been noted by GNATS.

From: "Greg A. Woods; Planix, Inc." <woods%planix.ca@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: kern/38019: some kind of undetected deadlock slowly kills 
NetBSD-4.0_STABLE GENERIC.MP
Date: Fri, 22 Feb 2008 16:15:37 -0500

 Well in the way these things sometimes go, my machine has been  
 relatively stable since booting a kernel built with LOCKDEBUG.
 
 Curiously though there are occasional "pauses", and some of the  
 former problems with processes getting stuck in vmmapva are now  
 eventually getting unstuck, apparently all by themselves (though  
 sometimes coincidentally with larger amounts of disk I/O occurring).
 
 Also curiously I began to see the words "write", and sometimes  
 "rstart" and "rend" appear on the console.  Finally after much  
 searching I found printf()s containing these very poor clues in sys/ 
 arch/x86/x86/ipmi.c.  I don't know if they're related to the hangs  
 and other weirdness, or not.  The following patch might make them a  
 little less obtuse, or at least a little easier to find in the sources:
 
 Index: sys/arch/x86/x86/ipmi.c
 ===================================================================
 RCS file: /cvs/master/m-NetBSD/main/src/sys/arch/x86/x86/ipmi.c,v
 retrieving revision 1.4.4.2
 diff -u -r1.4.4.2 ipmi.c
 --- sys/arch/x86/x86/ipmi.c     19 Dec 2007 19:38:52 -0000      1.4.4.2
 +++ sys/arch/x86/x86/ipmi.c     21 Feb 2008 02:53:11 -0000
 @@ -527,13 +527,13 @@
          int v;
 
          /* Wait for expected flag bits */
 -       v = bmc_io_wait(sc, _SMIC_FLAG_REG, mask, val, "smicwait");
 +       v = bmc_io_wait(sc, _SMIC_FLAG_REG, mask, val, "smicwait"); / 
 * XXX should that be passing lbl */
          if (v < 0)
                  return (-1);
 
          /* Return current status */
          v = bmc_read(sc, _SMIC_CTRL_REG);
 -       dbg_printf(99, "smic_wait = %.2x\n", v);
 +       dbg_printf(99, "smic_wait = %.2x %s\n", v, lbl);
          return (v);
   }
 
 @@ -581,11 +581,11 @@
          int sts, idx;
 
          sts = smic_write_cmd_data(sc, SMS_CC_START_TRANSFER, &data[0]);
 -       ErrStat(sts != SMS_SC_WRITE_START, "wstart");
 +       ErrStat(sts != SMS_SC_WRITE_START, "smic_sendmsg: wstart\n");
          for (idx = 1; idx < len - 1; idx++) {
                  sts = smic_write_cmd_data(sc, SMS_CC_NEXT_TRANSFER,
                      &data[idx]);
 -               ErrStat(sts != SMS_SC_WRITE_NEXT, "write");
 +               ErrStat(sts != SMS_SC_WRITE_NEXT, "smic_sendmsg: write 
 \n");
          }
          sts = smic_write_cmd_data(sc, SMS_CC_END_TRANSFER, &data[idx]);
          if (sts != SMS_SC_WRITE_END) {
 @@ -607,14 +607,14 @@
                  return (-1);
 
          sts = smic_write_cmd_data(sc, SMS_CC_START_RECEIVE, NULL);
 -       ErrStat(sts != SMS_SC_READ_START, "rstart");
 +       ErrStat(sts != SMS_SC_READ_START, "smic_recvmsg: rstart\n");
          for (idx = 0;; ) {
                  sts = smic_read_data(sc, &data[idx++]);
                  if (sts != SMS_SC_READ_START && sts !=  
 SMS_SC_READ_NEXT)
                          break;
                  smic_write_cmd_data(sc, SMS_CC_NEXT_RECEIVE, NULL);
          }
 -       ErrStat(sts != SMS_SC_READ_END, "rend");
 +       ErrStat(sts != SMS_SC_READ_END, "smic_recvmsg: rend\n");
 
          *len = idx;
 
 
 
 -- 
                                        Greg A. Woods; Planix, Inc.
                                        <woods%planix.ca@localhost>
 
 
 


Home | Main Index | Thread Index | Old Index