From patchwork Fri Apr 6 14:02:19 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 151238 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id EBED7B6FEB for ; Sat, 7 Apr 2012 04:16:38 +1000 (EST) Received: from localhost ([::1]:60229 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SG9ko-0005fT-BG for incoming@patchwork.ozlabs.org; Fri, 06 Apr 2012 10:03:06 -0400 Received: from eggs.gnu.org ([208.118.235.92]:51893) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SG9kY-0005YH-CV for qemu-devel@nongnu.org; Fri, 06 Apr 2012 10:02:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SG9kT-00005g-Jj for qemu-devel@nongnu.org; Fri, 06 Apr 2012 10:02:49 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:42026) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SG9kS-0008W3-C9 for qemu-devel@nongnu.org; Fri, 06 Apr 2012 10:02:45 -0400 Received: by pbcuo5 with SMTP id uo5so3011315pbc.4 for ; Fri, 06 Apr 2012 07:02:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:x-mailer:in-reply-to :references; bh=MCp/0xFVSZC+re7sf1EyqIMIrOGyifJ39Isxf8KYlDs=; b=WA6As5Ah5lmct2ZfTErkoflFry8pHgBK+5DzrYWKd4yFxKNCi5B2wyEHNmVl7YHy0+ Qjrr9sSizYoaxjS42+p8TLNdVo/aHyXa+qI79WOG+ZabcCQfoQkyGndGYVStU7wYsm84 t4bIPmAPrTVY4nX7TgaXIiTWH6pOdqoWglrRTYMwIh/RAZZ7so7KGM7kJqexJP7yutgU KOqoSrb4RkxBWWbimaGocq0uS6CLdeavUtJvhr5upVeH2MeuGwnO02olkrLCJjBuUVQA t4iWNZLdggaOjBQb/V5r+zyhJAmjMjDuvvowYCR0zQku0+f9gtF7fWo6FyN2JKFmf1oc xdxg== Received: by 10.68.226.42 with SMTP id rp10mr15747045pbc.162.1333720958569; Fri, 06 Apr 2012 07:02:38 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id o7sm6380309pbq.8.2012.04.06.07.02.35 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 06 Apr 2012 07:02:37 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2012 16:02:19 +0200 Message-Id: <1333720939-670-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.9.3 In-Reply-To: <1333720939-670-1-git-send-email-pbonzini@redhat.com> References: <1333720939-670-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.45 Subject: [Qemu-devel] [PATCH 3/3] virtio-scsi: add multiqueue capability X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Adding multiqueue is as simple as creating more than one virtqueues, and saving the queue number for each request. Signed-off-by: Paolo Bonzini --- hw/virtio-scsi.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c index 0d90d9c..e8328f4 100644 --- a/hw/virtio-scsi.c +++ b/hw/virtio-scsi.c @@ -129,12 +129,12 @@ typedef struct { VirtIOSCSIConf *conf; SCSIBus bus; - VirtQueue *ctrl_vq; - VirtQueue *event_vq; - VirtQueue *cmd_vq; uint32_t sense_size; uint32_t cdb_size; int resetting; + VirtQueue *ctrl_vq; + VirtQueue *event_vq; + VirtQueue *cmd_vqs[0]; } VirtIOSCSI; typedef struct VirtIOSCSIReq { @@ -240,8 +240,9 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq) static void virtio_scsi_save_request(QEMUFile *f, SCSIRequest *sreq) { VirtIOSCSIReq *req = sreq->hba_private; - uint32_t n = 0; + uint32_t n = virtio_queue_get_id(req->vq) - 2; + assert(n < req->dev->conf->num_queues); qemu_put_be32s(f, &n); qemu_put_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem)); } @@ -255,9 +256,9 @@ static void *virtio_scsi_load_request(QEMUFile *f, SCSIRequest *sreq) req = g_malloc(sizeof(*req)); qemu_get_be32s(f, &n); - assert(n == 0); + assert(n < s->conf->num_queues); qemu_get_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem)); - virtio_scsi_parse_req(s, s->cmd_vq, req); + virtio_scsi_parse_req(s, s->cmd_vqs[n], req); scsi_req_ref(sreq); req->sreq = sreq; @@ -584,10 +585,12 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf) { VirtIOSCSI *s; static int virtio_scsi_id; + size_t sz; + int i; + sz = sizeof(VirtIOSCSI) + proxyconf->num_queues * sizeof(VirtQueue *); s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI, - sizeof(VirtIOSCSIConfig), - sizeof(VirtIOSCSI)); + sizeof(VirtIOSCSIConfig), sz); s->qdev = dev; s->conf = proxyconf; @@ -602,8 +605,10 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf) virtio_scsi_handle_ctrl); s->event_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, NULL); - s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, - virtio_scsi_handle_cmd); + for (i = 0; i < s->conf->num_queues; i++) { + s->cmd_vqs[i] = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, + virtio_scsi_handle_cmd); + } scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info); if (!dev->hotplugged) {