Module Name:    src
Committed By:   martin
Date:           Fri Apr 26 19:04:19 UTC 2019

Modified Files:
        src/sys/dev/pci [netbsd-8]: mfii.c

Log Message:
Pull up following revision(s) (requested by bouyer in ticket #1247):

        sys/dev/pci/mfii.c: revision 1.4

Clean up timeout logic. Now the system survives to a ccb timeout; before
the filesystem would stall because one I/O did never completes.


To generate a diff of this commit:
cvs rdiff -u -r1.3.2.3 -r1.3.2.4 src/sys/dev/pci/mfii.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/mfii.c
diff -u src/sys/dev/pci/mfii.c:1.3.2.3 src/sys/dev/pci/mfii.c:1.3.2.4
--- src/sys/dev/pci/mfii.c:1.3.2.3	Sat Dec  8 12:17:13 2018
+++ src/sys/dev/pci/mfii.c	Fri Apr 26 19:04:19 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: mfii.c,v 1.3.2.3 2018/12/08 12:17:13 martin Exp $ */
+/* $NetBSD: mfii.c,v 1.3.2.4 2019/04/26 19:04:19 martin Exp $ */
 /* $OpenBSD: mfii.c,v 1.58 2018/08/14 05:22:21 jmatthew Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.3.2.3 2018/12/08 12:17:13 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.3.2.4 2019/04/26 19:04:19 martin Exp $");
 
 #include "bio.h"
 
@@ -264,7 +264,6 @@ struct mfii_ccb {
 	u_int32_t		ccb_flags;
 #define MFI_CCB_F_ERR			(1<<0)
 	u_int			ccb_smid;
-	u_int			ccb_refcnt;
 	SIMPLEQ_ENTRY(mfii_ccb)	ccb_link;
 };
 SIMPLEQ_HEAD(mfii_ccb_list, mfii_ccb);
@@ -2159,7 +2158,6 @@ mfii_scsipi_request(struct scsipi_channe
 		return;
 	}
 
-	ccb->ccb_refcnt = 2; /* one for the chip, one for the timeout */
 	mfii_start(sc, ccb);
 
 	return;
@@ -2176,10 +2174,9 @@ mfii_scsi_cmd_done(struct mfii_softc *sc
 	struct scsipi_xfer *xs = ccb->ccb_cookie;
 	struct mpii_msg_scsi_io *io = ccb->ccb_request;
 	struct mfii_raid_context *ctx = (struct mfii_raid_context *)(io + 1);
-	u_int refs = 2;
 
 	if (callout_stop(&xs->xs_callout) != 0)
-		refs = 1;
+		return;
 
 	switch (ctx->status) {
 	case MFI_STAT_OK:
@@ -2201,10 +2198,8 @@ mfii_scsi_cmd_done(struct mfii_softc *sc
 		break;
 	}
 
-	if (atomic_add_int_nv(&ccb->ccb_refcnt, -refs) == 0) {
-		scsipi_done(xs);
-		mfii_put_ccb(sc, ccb);
-	}
+	scsipi_done(xs);
+	mfii_put_ccb(sc, ccb);
 }
 
 int
@@ -2343,7 +2338,6 @@ mfii_pd_scsi_cmd(struct scsipi_xfer *xs)
 		return;
 	}
 
-	ccb->ccb_refcnt = 2; /* one for the chip, one for the timeout */
 	// XXX timeout_add_msec(&xs->stimeout, xs->timeout);
 	mfii_start(sc, ccb);
 
@@ -2543,10 +2537,9 @@ mfii_abort_task(struct work *wk, void *s
 
 		if (!sc->sc_ld[periph->periph_target].ld_present) {
 			/* device is gone */
-			if (atomic_dec_uint_nv(&ccb->ccb_refcnt) == 0) {
-				scsipi_done(xs);
-				mfii_put_ccb(sc, ccb);
-			}
+			xs->error = XS_SELTIMEOUT;
+			scsipi_done(xs);
+			mfii_put_ccb(sc, ccb);
 			continue;
 		}
 
@@ -2591,12 +2584,11 @@ mfii_scsi_cmd_abort_done(struct mfii_sof
 	/* XXX check accb completion? */
 
 	mfii_put_ccb(sc, accb);
+	printf("%s: cmd aborted ccb %p\n", DEVNAME(sc), ccb);
 
-	if (atomic_dec_uint_nv(&ccb->ccb_refcnt) == 0) {
-		xs->error = XS_TIMEOUT;
-		scsipi_done(xs);
-		mfii_put_ccb(sc, ccb);
-	}
+	xs->error = XS_TIMEOUT;
+	scsipi_done(xs);
+	mfii_put_ccb(sc, ccb);
 }
 
 struct mfii_ccb *
@@ -2627,8 +2619,6 @@ mfii_scrub_ccb(struct mfii_ccb *ccb)
 	ccb->ccb_dma64 = false;
 	ccb->ccb_len = 0;
 	ccb->ccb_sgl_len = 0;
-	ccb->ccb_refcnt = 1;
-
 	memset(&ccb->ccb_req, 0, sizeof(ccb->ccb_req));
 	memset(ccb->ccb_request, 0, MFII_REQUEST_SIZE);
 	memset(ccb->ccb_mfi, 0, MFI_FRAME_SIZE);

Reply via email to