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)