Subject: Re: bufcache cancer in -current?
To: Sean Doran <smd@ebone.net>
From: Patrick Welche <prlw1@newn.cam.ac.uk>
List: current-users
Date: 05/23/2000 18:18:32
On Tue, May 23, 2000 at 03:15:16AM +0200, Sean Doran wrote:
> 
> Incidentally, the suffering partition is on
> 
> sd1 at scsibus2 target 6 lun 0: <QUANTUM, QM318000TD-SW, N491> SCSI2 0/direct fixed
> sd1: 17366 MB, 8057 cyl, 20 head, 220 sec, 512 bytes/sect x 35566500 sectors
> 
> and this drive is one of those wonderful Quantums that have tag
> queueing woes.  The symptom under the old driver: exhaust tags on
> disk, disk gives QUEUE FULL condition, and drive never reconnects.
> Result: hanged disk, no unhang until reboot.
> 
> It strikes me that the sync loop and the changing block sizes
> would affect the time-of-hang in the old driver in much the same
> way as the time-of-corruption.
> 
> Is it possible that the new driver recovers from QUEUE FULL + non-
> reconnect in a way that triggers lossage?

For what it's worth, I pop a "options NOTAG" in my unhappy

sd0 at scsibus0 target 0 lun 0: <QUANTUM, XP34550S, LYK8> SCSI2 0/direct fixed
sd1 at scsibus0 target 2 lun 0: <QUANTUM, XP34550S, LYK8> SCSI2 0/direct fixed

kernel config with the following patch - all it does is removed tagged
queueing:
(Note we are now up to 1.50, I'm still on version 1.47)

Cheers,

Patrick

Index: aic7xxx.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ic/aic7xxx.c,v
retrieving revision 1.47
diff -c -r1.47 aic7xxx.c
*** aic7xxx.c	2000/05/14 18:22:13	1.47
--- aic7xxx.c	2000/05/23 17:09:40
***************
*** 86,91 ****
--- 86,95 ----
   *
   */
  
+ /* XXX checked that tagged works */
+ /* #define NOTAG 1 */
+ /* moved to options NOTAG */
+ 
  #include "opt_ddb.h"
  
  #include <sys/param.h>
***************
*** 325,331 ****
--- 329,337 ----
  static __inline struct scsipi_xfer *ahc_first_xs(struct ahc_softc *);
  static __inline void ahc_swap_hscb(struct hardware_scb *);
  static __inline void ahc_swap_sg(struct ahc_dma_seg *);
+ #ifndef NOTAG
  static void ahc_check_tags(struct ahc_softc *, struct scsipi_xfer *);
+ #endif
  static int ahc_istagged_device(struct ahc_softc *, struct scsipi_xfer *);
  
  #if defined(AHC_DEBUG) && 0
***************
*** 3424,3430 ****
--- 3430,3438 ----
  		splx(s);
  	} else {
  		xs->xs_status |= XS_STS_DONE;
+ #ifndef NOTAG
  		ahc_check_tags(ahc, xs);
+ #endif
  		scsipi_done(xs);
  	}
  
***************
*** 5577,5582 ****
--- 5585,5591 ----
  }
  #endif
  
+ #ifndef NOTAG
  static void
  ahc_check_tags(struct ahc_softc *ahc, struct scsipi_xfer *xs)
  {
***************
*** 5622,5627 ****
--- 5631,5637 ----
  		}
  	}
  }
+ #endif
  
  static int
  ahc_istagged_device(struct ahc_softc *ahc, struct scsipi_xfer *xs)