[Devel] [PATCH RHEL10 COMMIT] drivers/vhost/blk: improve vhostblk_vq_err() usage
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Jun 19 19:36:05 MSK 2026
The commit is pushed to "branch-rh10-6.12.0-211.16.1.12.x.vz10-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh10-6.12.0-211.16.1.12.4.vz10
------>
commit 331f787731307f03e662affe0e5791723162a798
Author: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
Date: Fri Jun 19 16:33:10 2026 +0300
drivers/vhost/blk: improve vhostblk_vq_err() usage
As this triggers vq->error_ctx eventfd, we should be a bit more
careful.
- do not call this if we get unsupported request, just set the
error via request status
- move it from vhost_blk_set_status() to vhost_blk_handle_host_kick()
to avoid triggering it twice if on vhost_blk_handle_guest_kick()->
vhost_blk_req_handle()->vhost_blk_set_status() path, as
vhost_blk_handle_guest_kick() will already report it
https://virtuozzo.atlassian.net/browse/VSTOR-134034
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
======
Patchset description:
vhost-blk: handling of failing requests
This series mainly addresses the handling of failing requests.
Previously the driver will always retry all requests failed at
processing and will always complete the requests if they are
past bio submission point.
Using vhost-net and vhost-scsi as a model, we adopt the following
approach:
- requests failed at processing phase with ENOMEM/EAGAIN are re-tried
- requests failed at processing phase with other errors are not
reported completed and are not processed further. It is higly likely
they are just incorrect
- requests failed at status write after the completion are not
reported completed
This may sometime lead to guests stalling, but the alternatives are
always worse.
Also the patchset improves logging and adds a few sanity checks.
Feature: vhost-blk: in-kernel accelerator for virtio-blk guests
Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
drivers/vhost/blk.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/vhost/blk.c b/drivers/vhost/blk.c
index 6a1a2bab3bed8..ef39ab92eee11 100644
--- a/drivers/vhost/blk.c
+++ b/drivers/vhost/blk.c
@@ -141,10 +141,8 @@ static inline int vhost_blk_set_status(struct vhost_blk_req *req, u8 status)
iov_iter_init(&iter, ITER_DEST, req->status, ARRAY_SIZE(req->status), sizeof(status));
ret = copy_to_iter(&status, sizeof(status), &iter);
- if (ret != sizeof(status)) {
- vhostblk_vq_err(req->blk, &req->blk_vq->vq, "Failed to write status\n");
+ if (ret != sizeof(status))
return -EFAULT;
- }
return 0;
}
@@ -490,7 +488,6 @@ static int vhost_blk_req_handle(struct vhost_virtqueue *vq,
vhost_add_used_and_signal(&blk->dev, vq, head, len);
break;
default:
- vhostblk_vq_err(blk, vq, "Unsupported request type %d\n", hdr->type);
status = VIRTIO_BLK_S_UNSUPP;
ret = vhost_blk_set_status(req, status);
if (ret)
@@ -597,7 +594,8 @@ static void vhost_blk_handle_host_kick(struct vhost_work *work)
vhost_blk_req_cleanup(req);
status = req->bio_err == 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR;
- (void) vhost_blk_set_status(req, status);
+ if (vhost_blk_set_status(req, status))
+ vhostblk_vq_err(blk, vq, "Failed to write status");
vhost_add_used(vq, req->head, req->len);
added = true;
More information about the Devel
mailing list