Module Name: src Committed By: bouyer Date: Wed Apr 24 09:21:01 UTC 2019
Modified Files: src/sys/dev/pci: mfii.c Log Message: 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 -r1.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 src/sys/dev/pci/mfii.c:1.4 --- src/sys/dev/pci/mfii.c:1.3 Mon Dec 3 22:34:36 2018 +++ src/sys/dev/pci/mfii.c Wed Apr 24 09:21:01 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: mfii.c,v 1.3 2018/12/03 22:34:36 bouyer Exp $ */ +/* $NetBSD: mfii.c,v 1.4 2019/04/24 09:21:01 bouyer Exp $ */ /* $OpenBSD: mfii.c,v 1.58 2018/08/14 05:22:21 jmatthew Exp $ */ /* @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.3 2018/12/03 22:34:36 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.4 2019/04/24 09:21:01 bouyer Exp $"); #include "bio.h" @@ -265,7 +265,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); @@ -2160,7 +2159,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; @@ -2177,10 +2175,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: @@ -2202,10 +2199,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 @@ -2344,7 +2339,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); @@ -2544,10 +2538,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; } @@ -2592,12 +2585,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 * @@ -2628,8 +2620,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);