Module Name: src Committed By: jdolecek Date: Sat May 13 20:35:20 UTC 2017
Modified Files: src/sys/dev/pci: vioscsi.c Log Message: refactor error handling in vioscsi_scsipi_request() to avoid the goto maze, and add missing virtio_enqueue_abort() call when bus_dmamap_load() fails; abort is only done implicitely when virtio_enqueue_reserve() fails, must do it explicitely if there is other reason also now always print error when bus_dmamap_load() or virtio_enqueue_reserve() fail - the former shouldn't fail due to BUS_DMA_ALLOCNOW, and the latter shouldn't ever fail now after the maxnsegs fix for virtio_alloc_vq(), so error there means driver bug To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/dev/pci/vioscsi.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/vioscsi.c diff -u src/sys/dev/pci/vioscsi.c:1.17 src/sys/dev/pci/vioscsi.c:1.18 --- src/sys/dev/pci/vioscsi.c:1.17 Sat May 13 20:17:42 2017 +++ src/sys/dev/pci/vioscsi.c Sat May 13 20:35:20 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vioscsi.c,v 1.17 2017/05/13 20:17:42 jdolecek Exp $ */ +/* $NetBSD: vioscsi.c,v 1.18 2017/05/13 20:35:20 jdolecek Exp $ */ /* $OpenBSD: vioscsi.c,v 1.3 2015/03/14 03:38:49 jsg Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.17 2017/05/13 20:17:42 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.18 2017/05/13 20:35:20 jdolecek Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -362,20 +362,23 @@ vioscsi_scsipi_request(struct scsipi_cha error = bus_dmamap_load(virtio_dmat(vsc), vr->vr_data, xs->data, xs->datalen, NULL, XS2DMA(xs)); - switch (error) { - case 0: - break; - case ENOMEM: - case EAGAIN: - xs->error = XS_RESOURCE_SHORTAGE; - goto nomore; - default: - aprint_error_dev(sc->sc_dev, "error %d loading DMA map\n", - error); + if (error) { + aprint_error_dev(sc->sc_dev, "%s: error %d loading DMA map\n", + __func__, error); + + if (error == ENOMEM || error == EAGAIN) { + /* + * Map is allocated with ALLOCNOW, so this should + * actually never ever happen. + */ + xs->error = XS_RESOURCE_SHORTAGE; + } else { stuffup: - xs->error = XS_DRIVER_STUFFUP; -nomore: - /* nothing else to free */ + /* not a temporary condition */ + xs->error = XS_DRIVER_STUFFUP; + } + + virtio_enqueue_abort(vsc, vq, slot); scsipi_done(xs); return; } @@ -386,10 +389,13 @@ nomore: error = virtio_enqueue_reserve(vsc, vq, slot, nsegs); if (error) { - DPRINTF(("%s: error reserving %d\n", __func__, error)); + aprint_error_dev(sc->sc_dev, "error reserving %d (nsegs %d)\n", + error, nsegs); bus_dmamap_unload(virtio_dmat(vsc), vr->vr_data); + /* slot already freed by virtio_enqueue_reserve() */ xs->error = XS_RESOURCE_SHORTAGE; - goto nomore; + scsipi_done(xs); + return; } vr->vr_xs = xs;