[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 5/7] virtio-scsi: Batched prepare for cmd reqs
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v3 5/7] virtio-scsi: Batched prepare for cmd reqs |
Date: |
Tue, 23 Sep 2014 15:49:28 +0800 |
Queue the popped requests while calling
virtio_scsi_handle_cmd_req_prepare(), then submit them after all
prepared.
Signed-off-by: Fam Zheng <address@hidden>
---
hw/scsi/virtio-scsi-dataplane.c | 9 +++++++--
hw/scsi/virtio-scsi.c | 9 +++++++--
include/hw/virtio/virtio-scsi.h | 3 +++
3 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index 11f5705..b778e05 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -122,14 +122,19 @@ static void virtio_scsi_iothread_handle_cmd(EventNotifier
*notifier)
VirtIOSCSIVring *vring = container_of(notifier,
VirtIOSCSIVring, host_notifier);
VirtIOSCSI *s = (VirtIOSCSI *)vring->parent;
- VirtIOSCSIReq *req;
+ VirtIOSCSIReq *req, *next;
+ QTAILQ_HEAD(, VirtIOSCSIReq) reqs = QTAILQ_HEAD_INITIALIZER(reqs);
event_notifier_test_and_clear(notifier);
while ((req = virtio_scsi_pop_req_vring(s, vring))) {
if (virtio_scsi_handle_cmd_req_prepare(s, req)) {
- virtio_scsi_handle_cmd_req_submit(s, req);
+ QTAILQ_INSERT_TAIL(&reqs, req, next);
}
}
+
+ QTAILQ_FOREACH_SAFE(req, &reqs, next, next) {
+ virtio_scsi_handle_cmd_req_submit(s, req);
+ }
}
/* Context: QEMU global mutex held */
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 6cf070f..395178e 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -502,7 +502,8 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev,
VirtQueue *vq)
{
/* use non-QOM casts in the data path */
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
- VirtIOSCSIReq *req;
+ VirtIOSCSIReq *req, *next;
+ QTAILQ_HEAD(, VirtIOSCSIReq) reqs = QTAILQ_HEAD_INITIALIZER(reqs);
if (s->ctx && !s->dataplane_disabled) {
virtio_scsi_dataplane_start(s);
@@ -510,9 +511,13 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev,
VirtQueue *vq)
}
while ((req = virtio_scsi_pop_req(s, vq))) {
if (virtio_scsi_handle_cmd_req_prepare(s, req)) {
- virtio_scsi_handle_cmd_req_submit(s, req);
+ QTAILQ_INSERT_TAIL(&reqs, req, next);
}
}
+
+ QTAILQ_FOREACH_SAFE(req, &reqs, next, next) {
+ virtio_scsi_handle_cmd_req_submit(s, req);
+ }
}
static void virtio_scsi_get_config(VirtIODevice *vdev,
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index 1cc759a..6134c0b 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -213,6 +213,9 @@ typedef struct VirtIOSCSIReq {
VirtQueueElement elem;
/* Set by dataplane code. */
VirtIOSCSIVring *vring;
+ /* Used by two stages request submitting */
+ QTAILQ_ENTRY(VirtIOSCSIReq) next;
+
SCSIRequest *sreq;
size_t resp_size;
enum SCSIXferMode mode;
--
1.9.3
- [Qemu-devel] [PATCH v3 0/7] virtio-scsi: Dataplane on single iothread, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 1/7] virtio-scsi-dataplane: Code to run virtio-scsi on iothread, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 2/7] virtio-scsi: Hook up with dataplane, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 3/7] virtio-scsi: Add migration state notifier for dataplane code, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 4/7] virtio-scsi: Two stages processing of cmd request, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 5/7] virtio-scsi: Batched prepare for cmd reqs,
Fam Zheng <=
- [Qemu-devel] [PATCH v3 6/7] virtio-scsi: Call bdrv_io_plug/bdrv_io_unplug in cmd request handling, Fam Zheng, 2014/09/23
- [Qemu-devel] [PATCH v3 7/7] virtio-scsi: Process ".iothread" property, Fam Zheng, 2014/09/23
- Re: [Qemu-devel] [PATCH v3 0/7] virtio-scsi: Dataplane on single iothread, Paolo Bonzini, 2014/09/23