From: "Denis V. Lunev" <den@openvz.org>
To: andrey.drobyshev@virtuozzo.com
Cc: svt-core@virtuozzo.com, den@openvz.org
Subject: [PATCH hci-8.1 4/5] virtio-scsi-test: split virtio_scsi_do_command() into submit and wait #VSTOR-151532
Date: Mon, 26 Oct 2026 18:49:28 +0100 [thread overview]
Message-ID: <20261026174929.685720-5-den@openvz.org> (raw)
In-Reply-To: <20261026174929.685720-1-den@openvz.org>
From: Denis V. Lunev <den@openvz.org>
Add virtio_scsi_submit_command() and virtio_scsi_wait_command() so that
a test can act on the device while a command is still in flight.
virtio_scsi_do_command() becomes a wrapper around the two and its
callers are unchanged.
Signed-off-by: Denis V. Lunev <den@openvz.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Hanna Reitz <hreitz@redhat.com>
Cc: Fabiano Rosas <farosas@suse.de>
Cc: Laurent Vivier <lvivier@redhat.com>
---
tests/qtest/virtio-scsi-test.c | 85 +++++++++++++++++++++++-----------
1 file changed, 59 insertions(+), 26 deletions(-)
diff --git a/tests/qtest/virtio-scsi-test.c b/tests/qtest/virtio-scsi-test.c
index db10d572d0f..bc1edf046c2 100644
--- a/tests/qtest/virtio-scsi-test.c
+++ b/tests/qtest/virtio-scsi-test.c
@@ -59,22 +59,28 @@ static uint64_t qvirtio_scsi_alloc(QVirtioSCSIQueues *vs, size_t alloc_size,
return addr;
}
-static uint8_t virtio_scsi_do_command(QVirtioSCSIQueues *vs,
- const uint8_t *cdb,
- const uint8_t *data_in,
- size_t data_in_len,
- uint8_t *data_out, size_t data_out_len,
- struct virtio_scsi_cmd_resp *resp_out)
+typedef struct {
+ uint32_t free_head;
+ uint64_t req_addr;
+ uint64_t resp_addr;
+ uint64_t data_in_addr;
+ uint64_t data_out_addr;
+} VirtioSCSICmd;
+
+static void virtio_scsi_submit_command(QVirtioSCSIQueues *vs,
+ const uint8_t *cdb,
+ const uint8_t *data_in,
+ size_t data_in_len,
+ uint8_t *data_out, size_t data_out_len,
+ VirtioSCSICmd *cmd)
{
QVirtQueue *vq;
struct virtio_scsi_cmd_req req = { { 0 } };
struct virtio_scsi_cmd_resp resp = { .response = 0xff, .status = 0xff };
- uint64_t req_addr, resp_addr, data_in_addr = 0, data_out_addr = 0;
- uint8_t response;
- uint32_t free_head;
QTestState *qts = global_qtest;
vq = vs->vq[2];
+ *cmd = (VirtioSCSICmd) { 0 };
req.lun[0] = 1; /* Select LUN */
req.lun[1] = 1; /* Select target 1 */
@@ -83,41 +89,68 @@ static uint8_t virtio_scsi_do_command(QVirtioSCSIQueues *vs,
/* XXX: Fix endian if any multi-byte field in req/resp is used */
/* Add request header */
- req_addr = qvirtio_scsi_alloc(vs, sizeof(req), &req);
- free_head = qvirtqueue_add(qts, vq, req_addr, sizeof(req), false, true);
+ cmd->req_addr = qvirtio_scsi_alloc(vs, sizeof(req), &req);
+ cmd->free_head = qvirtqueue_add(qts, vq, cmd->req_addr, sizeof(req),
+ false, true);
if (data_out_len) {
- data_out_addr = qvirtio_scsi_alloc(vs, data_out_len, data_out);
- qvirtqueue_add(qts, vq, data_out_addr, data_out_len, false, true);
+ cmd->data_out_addr = qvirtio_scsi_alloc(vs, data_out_len, data_out);
+ qvirtqueue_add(qts, vq, cmd->data_out_addr, data_out_len, false, true);
}
/* Add response header */
- resp_addr = qvirtio_scsi_alloc(vs, sizeof(resp), &resp);
- qvirtqueue_add(qts, vq, resp_addr, sizeof(resp), true, !!data_in_len);
+ cmd->resp_addr = qvirtio_scsi_alloc(vs, sizeof(resp), &resp);
+ qvirtqueue_add(qts, vq, cmd->resp_addr, sizeof(resp), true,
+ !!data_in_len);
if (data_in_len) {
- data_in_addr = qvirtio_scsi_alloc(vs, data_in_len, data_in);
- qvirtqueue_add(qts, vq, data_in_addr, data_in_len, true, false);
+ cmd->data_in_addr = qvirtio_scsi_alloc(vs, data_in_len, data_in);
+ qvirtqueue_add(qts, vq, cmd->data_in_addr, data_in_len, true, false);
}
- qvirtqueue_kick(qts, vs->dev, vq, free_head);
- qvirtio_wait_used_elem(qts, vs->dev, vq, free_head, NULL,
- QVIRTIO_SCSI_TIMEOUT_US);
+ qvirtqueue_kick(qts, vs->dev, vq, cmd->free_head);
+}
+
+static uint8_t virtio_scsi_wait_command(QVirtioSCSIQueues *vs,
+ VirtioSCSICmd *cmd,
+ struct virtio_scsi_cmd_resp *resp_out,
+ gint64 timeout_us)
+{
+ uint8_t response;
+ QTestState *qts = global_qtest;
+
+ qvirtio_wait_used_elem(qts, vs->dev, vs->vq[2], cmd->free_head, NULL,
+ timeout_us);
- response = readb(resp_addr +
+ response = readb(cmd->resp_addr +
offsetof(struct virtio_scsi_cmd_resp, response));
if (resp_out) {
- memread(resp_addr, resp_out, sizeof(*resp_out));
+ memread(cmd->resp_addr, resp_out, sizeof(*resp_out));
}
- guest_free(alloc, req_addr);
- guest_free(alloc, resp_addr);
- guest_free(alloc, data_in_addr);
- guest_free(alloc, data_out_addr);
+ guest_free(alloc, cmd->req_addr);
+ guest_free(alloc, cmd->resp_addr);
+ guest_free(alloc, cmd->data_in_addr);
+ guest_free(alloc, cmd->data_out_addr);
return response;
}
+static uint8_t virtio_scsi_do_command(QVirtioSCSIQueues *vs,
+ const uint8_t *cdb,
+ const uint8_t *data_in,
+ size_t data_in_len,
+ uint8_t *data_out, size_t data_out_len,
+ struct virtio_scsi_cmd_resp *resp_out)
+{
+ VirtioSCSICmd cmd;
+
+ virtio_scsi_submit_command(vs, cdb, data_in, data_in_len,
+ data_out, data_out_len, &cmd);
+ return virtio_scsi_wait_command(vs, &cmd, resp_out,
+ QVIRTIO_SCSI_TIMEOUT_US);
+}
+
static QVirtioSCSIQueues *qvirtio_scsi_init(QVirtioDevice *dev)
{
QVirtioSCSIQueues *vs;
--
2.53.0
next prev parent reply other threads:[~2026-10-26 17:49 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 17:49 [PATCH hci-8.1 0/5] scsi-disk: fix UNMAP and WRITE SAME racing with inactivation #VSTOR-151532 Denis V. Lunev
2026-10-26 17:49 ` [PATCH hci-8.1 1/5] scsi-disk: check all UNMAP descriptors before discarding any #VSTOR-151532 Denis V. Lunev
2026-10-26 17:49 ` [PATCH hci-8.1 2/5] scsi-disk: fix UNMAP racing with inactivation of block nodes #VSTOR-151532 Denis V. Lunev
2026-10-26 17:49 ` [PATCH hci-8.1 3/5] scsi-disk: fix WRITE SAME " Denis V. Lunev
2026-10-26 17:49 ` Denis V. Lunev [this message]
2026-10-26 17:49 ` [PATCH hci-8.1 5/5] virtio-scsi-test: test UNMAP and WRITE SAME during inactivation #VSTOR-151532 Denis V. Lunev
2026-10-27 10:56 ` [PATCH hci-8.1 0/5] scsi-disk: fix UNMAP and WRITE SAME racing with " Andrey Drobyshev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261026174929.685720-5-den@openvz.org \
--to=den@openvz.org \
--cc=andrey.drobyshev@virtuozzo.com \
--cc=svt-core@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.