Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Fri, 5 Mar 1999 19:17:13 -0800 (PST) | From | Simon Kirby <> | Subject | [Stuck in wait_on_bh problem] possibly fixed (?) |
| |
Hey stuck in wait_on_bh people,
I stuck 2.2.2ac1 on the server that was getting the wait_on_bh stuckups and left on vacation for a week. When I got back, the logs show that the machine got a bunch of SCSI timeouts (around 30), which started to occur in the first place when the motherboard was swapped (probably a dumb problem somewhere), but also something rather interesting -- two of the timeouts were immediately followed by wait_on_bh messages...and the box recovered! Perhaps something in the SCSI code was fixed? The box has now been up 9 days and it hasn't locked up yet.
Has anybody else noticed this as well?
Syslog messages:
... Mar 1 11:00:31 peace kernel: (scsi0:-1:-1:-1) 6 commands found and queued for completion. Mar 1 11:00:31 peace kernel: Mar 1 11:00:31 peace kernel: wait_on_bh, CPU 1: Mar 1 11:00:31 peace kernel: irq: 0 [0 0] Mar 1 11:00:31 peace kernel: bh: 1 [1 0] Mar 1 11:00:33 peace kernel: <[c010adb1]> <[c01737f3]> <[c017ae5f]> <[c017add0]> <[c015bb2e]> <[c017add0]> <[c015bd45]> <[c015bcac]> <6>(scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 31. Mar 1 11:00:33 peace kernel: (scsi0:0:3:0) Synchronous at 40.0 Mbyte/sec, offset 31. Mar 1 11:00:33 peace kernel: (scsi0:0:4:0) Synchronous at 40.0 Mbyte/sec, offset 31.
and
... Mar 2 14:00:43 peace kernel: (scsi0:-1:-1:-1) 6 commands found and queued for completion. Mar 2 14:00:43 peace kernel: Mar 2 14:00:43 peace kernel: wait_on_bh, CPU 1: Mar 2 14:00:43 peace kernel: irq: 0 [0 0] Mar 2 14:00:43 peace kernel: bh: 1 [1 0] Mar 2 14:00:45 peace kernel: <[c010adb1]> <[c01737f3]> <[c017ae5f]> <[c017add0]> <[c015bb2e]> <[c017add0]> <[c015bd45]> <[c015bcac]> <6>(scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 31. Mar 2 14:00:45 peace kernel: (scsi0:0:3:0) Synchronous at 40.0 Mbyte/sec, offset 31. Mar 2 14:00:45 peace kernel: (scsi0:0:4:0) Synchronous at 40.0 Mbyte/sec, offset 31.
Stack trace:
> c010ad74 T synchronize_bh > c0173778 t tcp_v4_sendmsg > c017add0 T inet_sendmsg > c017ad28 T inet_recvmsg > c015baa4 T sock_sendmsg > c017ad28 T inet_recvmsg > c015bcac t sock_write > c015bc0c t sock_read
(Exactly the same for the last two times I decoded it, too...)
If you want to try ac7 and you use aic7xxx SCSI, you may want to apply the attached patch to revert a hunk to from the aic7xxx driver version 5.1.11 -> 5.1.12 patch that does some changes to the code that sets the "DSCOMMAND0" register -- I needed to do this to avoid seeing even more SCSI timeouts all over the place (but only one some revisions of the 7880 chipset).
I also attached my silly little perl script to less-painfully find stuff in System.map when it's not in an oops format. ksymoops probably already does it somehow, but why not.
Simon-
| Simon Kirby | Systems Administration | | mailto:sim@netnation.com | NetNation Communications | | http://www.netnation.com/ | Tech: (604) 684-6892 | --- linux/drivers/scsi/aic7xxx.c Fri Mar 5 19:06:22 1999 +++ linux/drivers/scsi/aic7xxx.c.orig Fri Mar 5 11:30:45 1999 @@ -9227,17 +9227,11 @@ /* * Set the DSCOMMAND0 register on these cards different from * on the 789x cards. Also, read the SEEPROM as well. + */ aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) | CACHETHEN | MPARCKEN) & ~DPARCKEN, DSCOMMAND0); - aic7xxx_load_seeprom(temp_p, &sxfrctl1); - break; - case AHC_AIC7870: case AHC_AIC7895: - */ - aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) | - MPARCKEN) & ~(DPARCKEN | CACHETHEN), - DSCOMMAND0); aic7xxx_load_seeprom(temp_p, &sxfrctl1); break; }#!/usr/bin/perl
# Cheap (linear-searching) but helpful System.map name matcher # Example input (stdin): # c010ad74 # c0173778 ...etc... # # Simon Kirby, 1999/03/05
$contextsize = 2; $f = $ARGV[0]; $f = '/System.map' if ($f eq '');
open(IN,"< $f") or die "open(): $!\n"; while (<IN>){ if (/^([a-z0-9]+) /){ push(@em,$1); chomp; $em{$1} = $_; } } close(IN);
@em = sort @em;
while (<STDIN>){ chomp; $d = hextodec($_); next unless ($d); print "$_:\n"; @ring = ((undef) x ($contextsize + 1)); $printnext = $found = 0; foreach (@em){ if ($printnext > 0){ $printnext--; print " $em{$_}\n"; last if (!$printnext); } if (!$found && hextodec($_) >= $d){ $found++; $gotcha = pop(@ring); foreach $r (@ring){ print " $em{$r}\n"; } print ">>> $em{$gotcha}\n"; push(@output,$em{$gotcha}); print " $em{$_}\n"; $printnext = $contextsize - 1; } shift(@ring); push(@ring,$_); } }
print "\nTrace:\n"; foreach (@output){ print "> $_\n"; }
exit 0;
sub hextodec { unpack("N", pack("H8", substr("0" x 8 . shift, -8))); }
| ![\](/images/icornerr.gif) |