Commit 1880ad4f authored by Fam Zheng's avatar Fam Zheng Committed by Paolo Bonzini
Browse files

virtio-scsi: Batched prepare for cmd reqs



Queue the popped requests while calling
virtio_scsi_handle_cmd_req_prepare(), then submit them after all
prepared.

Signed-off-by: default avatarFam Zheng <famz@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 359eea71
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -122,13 +122,18 @@ 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);
    }
}

+7 −2
Original line number Diff line number Diff line
@@ -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,8 +511,12 @@ 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);
    }
}

+4 −0
Original line number Diff line number Diff line
@@ -213,6 +213,10 @@ typedef struct VirtIOSCSIReq {
    VirtQueueElement elem;
    /* Set by dataplane code. */
    VirtIOSCSIVring *vring;

    /* Used for two-stage request submission */
    QTAILQ_ENTRY(VirtIOSCSIReq) next;

    SCSIRequest *sreq;
    size_t resp_size;
    enum SCSIXferMode mode;