The branch main has been updated by cperciva:

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

commit cc25cfc9cf8a3d21d4f989eca9a4d1060d5d488e
Author:     Colin Percival <[email protected]>
AuthorDate: 2022-09-18 16:16:30 +0000
Commit:     Colin Percival <[email protected]>
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++;
        }

Reply via email to