Module Name:    src
Committed By:   jdolecek
Date:           Mon May 15 21:30:37 UTC 2017

Modified Files:
        src/sys/dev/pci: vioscsi.c

Log Message:
free the virtio slot _before_ calling scsipi_done(), so that driver is able
to accept another request immediatelly and doesn't trigger spurious
XS_RESOURCE_SHORTAGE

part of fix for PR kern/52199


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 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.18 src/sys/dev/pci/vioscsi.c:1.19
--- src/sys/dev/pci/vioscsi.c:1.18	Sat May 13 20:35:20 2017
+++ src/sys/dev/pci/vioscsi.c	Mon May 15 21:30:37 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: vioscsi.c,v 1.18 2017/05/13 20:35:20 jdolecek Exp $	*/
+/*	$NetBSD: vioscsi.c,v 1.19 2017/05/15 21:30:37 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.18 2017/05/13 20:35:20 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.19 2017/05/15 21:30:37 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -89,7 +89,7 @@ static void	 vioscsi_scsipi_request(stru
     scsipi_adapter_req_t, void *);
 static int	 vioscsi_vq_done(struct virtqueue *);
 static void	 vioscsi_req_done(struct vioscsi_softc *, struct virtio_softc *,
-    struct vioscsi_req *);
+    struct vioscsi_req *, struct virtqueue *, int);
 static struct vioscsi_req *vioscsi_req_get(struct vioscsi_softc *);
 static void	 vioscsi_bad_target(struct scsipi_xfer *);
 
@@ -450,7 +450,7 @@ stuffup:
 
 static void
 vioscsi_req_done(struct vioscsi_softc *sc, struct virtio_softc *vsc,
-    struct vioscsi_req *vr)
+    struct vioscsi_req *vr, struct virtqueue *vq, int slot)
 {
 	struct scsipi_xfer *xs = vr->vr_xs;
 	size_t sense_len;
@@ -493,6 +493,8 @@ vioscsi_req_done(struct vioscsi_softc *s
 	bus_dmamap_unload(virtio_dmat(vsc), vr->vr_data);
 	vr->vr_xs = NULL;
 
+	virtio_dequeue_commit(vsc, vq, slot);
+
 	mutex_exit(&sc->sc_mutex);
 	scsipi_done(xs);
 	mutex_enter(&sc->sc_mutex);
@@ -534,9 +536,7 @@ vioscsi_vq_done(struct virtqueue *vq)
 
 		DPRINTF(("%s: slot=%d\n", __func__, slot));
 
-		vioscsi_req_done(sc, vsc, &sc->sc_reqs[slot]);
-
-		virtio_dequeue_commit(vsc, vq, slot);
+		vioscsi_req_done(sc, vsc, &sc->sc_reqs[slot], vq, slot);
 
 		ret = 1;
 	}

Reply via email to