Deadlock on linux 2.6.0-test10

Richard Bass rbass at netraverse.com
Mon Nov 24 15:19:55 PST 2003


Sigh.  Well... it turns out that someone has already fixed this:

    http://linux-scsi.bkbits.net:8080/scsi-bugfixes-2.6/ChangeSet@-1d?nav=index.html

Sorry for the extra noise.

Richard <rwb>

-- 
Richard W. Bass
Systems Software Architect
NeTraverse, Inc.



Richard Bass wrote:
> I am not sure whether this is the right mailing list to report this to,
> but please excuse me if not.
> 
> There was a deadlock introduced in going from linux-2.6.0-test9 to 
> linux-2.6.0-test10
> The hardware info is as follows (when printed out by the test9 kernel):
> -------------------------
> scsi0 : Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev 6.2.35
>         <Adaptec 19160B Ultra160 SCSI adapter>
>         aic7892: Ultra160 Wide Channel A, SCSI Id=8, 32/253 SCBs
> 
> (scsi0:A:1): 160.000MB/s transfers (80.000MHz DT, offset 63, 16bit)
> (scsi0:A:4): 10.000MB/s transfers (10.000MHz, offset 16)
>   Vendor: QUANTUM   Model: ATLAS_V_18_WLS    Rev: 0230
>   Type:   Direct-Access                      ANSI SCSI revision: 03
> scsi0:A:1:0: Tagged Queuing enabled.  Depth 253
>   Vendor: TOSHIBA   Model: CD-ROM XM-6401TA  Rev: 1009
>   Type:   CD-ROM                             ANSI SCSI revision: 02
> SCSI device sda: 35861388 512-byte hdwr sectors (18361 MB)
> SCSI device sda: drive cache: write back
>  sda: sda1 sda2
> --------------------------
> 
> Now, the change that got made was in the generic Linux code, but
> after doing a little hunting around, it looks like maybe the problem
> is in the Adaptec driver.  In any event, here is the traceback:
> 
> ahc_linux_register_host
> 
>   ahc_lock(ahd, &s)
>      spin_lock_irqsave(&ahc->platform_data->spin_lock, *flags);
>        (obtains the spinlock)
> 
>   scsi_assign_lock(host, &ahc->platform_data->spin_lock);
>      (assigns ahc->platform_data->spin_lock to shost->host_lock
> 
>   ahc_linux_initialize_scsi_bus
>       ahc_reset_channel(ahc, 'A', /*initiate_reset*/TRUE);
>           ahc_send_async
>             scsi_report_device_reset
>                 shost_for_each_device(sdev, shost)
>                     __scsi_iterate_devices
>                     spin_lock_irqsave(shost->host_lock, flags);
>                         ^^^
>                        DEADLOCK
> 
> 
> The change was that shost_for_each_device() now uses 
> __scsi_iterate_devices()
> which goes and gets the host_lock spinlock.  It kind of looked like you
> shouldn't call ahc_send_async() with a lock, but I could be wrong here.
> The problem may be in the generic stuff.  If so, I am sure the aic7xxx
> maintainer can better explain what is going wrong there.
> 
> Hope this helps,
> 
> Richard <rwb>
> 




More information about the aic7xxx mailing list