git: cc25cfc9cf8a - main - vtblk: Requeue inside vtblk_request_execute

From: Colin Percival <cperciva_at_FreeBSD.org>
Date: Tue, 18 Oct 2022 06:03:07 UTC
The branch main has been updated by cperciva:

URL: https://cgit.FreeBSD.org/src/commit/?id=cc25cfc9cf8a3d21d4f989eca9a4d1060d5d488e

commit cc25cfc9cf8a3d21d4f989eca9a4d1060d5d488e
Author:     Colin Percival <cperciva@FreeBSD.org>
AuthorDate: 2022-09-18 16:16:30 +0000
Commit:     Colin Percival <cperciva@FreeBSD.org>
CommitDate: 2022-10-18 06:02:21 +0000

    vtblk: Requeue inside vtblk_request_execute
    
    Most virtio_blk requests are launched from vtblk_startio; prior to this
    commit, if vtblk_request_execute failed (e.g. due to a lack of space on
    the virtio queue) vtblk_startio would requeue the request to be
    reattempted later.
    
    Add a flag "vbr_requeue_on_error" to requests and perform the requeuing
    from inside vtblk_request_execute instead.
    
    No functional change intended.
    
    Reviewed by:    bryanv, imp
    Sponsored by:   https://www.patreon.com/cperciva
    Differential Revision:  https://reviews.freebsd.org/D36665
---
 sys/dev/virtio/block/virtio_blk.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/sys/dev/virtio/block/virtio_blk.c b/sys/dev/virtio/block/virtio_blk.c
index 8d39d80a8c91..fca2d367c170 100644
--- a/sys/dev/virtio/block/virtio_blk.c
+++ b/sys/dev/virtio/block/virtio_blk.c
@@ -62,6 +62,7 @@ struct vtblk_request {
 	struct virtio_blk_outhdr	 vbr_hdr;
 	struct bio			*vbr_bp;
 	uint8_t				 vbr_ack;
+	uint8_t				 vbr_requeue_on_error;
 	int				 vbr_error;
 	TAILQ_ENTRY(vtblk_request)	 vbr_link;
 };
@@ -1008,6 +1009,8 @@ vtblk_request_execute(struct vtblk_softc *sc, struct vtblk_request *req)
 		sc->vtblk_req_ordered = req;
 
 out:
+	if (error && req->vbr_requeue_on_error)
+		vtblk_request_requeue_ready(sc, req);
 	req->vbr_error = error;
 }
 
@@ -1133,11 +1136,10 @@ vtblk_startio(struct vtblk_softc *sc)
 		if (req == NULL)
 			break;
 
+		req->vbr_requeue_on_error = 1;
 		vtblk_request_execute(sc, req);
-		if (req->vbr_error != 0) {
-			vtblk_request_requeue_ready(sc, req);
+		if (req->vbr_error != 0)
 			break;
-		}
 
 		enq++;
 	}