From patchwork Thu Apr 19 14:29:24 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 153809 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 1C3B6B6FFC for ; Fri, 20 Apr 2012 01:13:27 +1000 (EST) Received: from localhost ([::1]:37477 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKsNy-0000se-N3 for incoming@patchwork.ozlabs.org; Thu, 19 Apr 2012 10:31:02 -0400 Received: from eggs.gnu.org ([208.118.235.92]:44584) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKsN9-0007MI-EV for qemu-devel@nongnu.org; Thu, 19 Apr 2012 10:30:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SKsMz-0004kB-Ar for qemu-devel@nongnu.org; Thu, 19 Apr 2012 10:30:11 -0400 Received: from mail-pz0-f46.google.com ([209.85.210.46]:49132) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKsMz-0004YT-1o for qemu-devel@nongnu.org; Thu, 19 Apr 2012 10:30:01 -0400 Received: by mail-pz0-f46.google.com with SMTP id z9so13323081dad.33 for ; Thu, 19 Apr 2012 07:30:00 -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=+WcJySFO4uJLssazitbzJDCnOyVE+o+6KFasYX/WxkY=; b=yPLTqLUux/347k1bF6zicSc+ggwqeVcIZAsuTjBymQN0jMIxyQdSP5wRq7EKtT+FRm QePxaVrCfZEoXHHC51C8JRttaLOSJjlvaxY0AfEh0iCcro8wwo1i8Ije5G13A1r05/FI th+jO2S1XqOkqJ7RkZgGo1XWIIE221kaL6ASZxJf9z1oRx+c7zZNhCkHYecbJXyT/T41 1v8/IaDekGqBEUdgUk8OidP7HPn8lBKvXb7/Vi4/IzXEj7lE2LHyas3yZkXuWgiL9+7q jY4vUaaCLfVS7eb9YdIr3rcB0Qf3LBTVFRQTUPSQinnQy4QIMZN92xzgDEvMOHaFofcr wEcA== Received: by 10.68.216.234 with SMTP id ot10mr5002272pbc.107.1334845800048; Thu, 19 Apr 2012 07:30:00 -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 r6sm2401487pbl.24.2012.04.19.07.29.57 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 19 Apr 2012 07:29:58 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 19 Apr 2012 16:29:24 +0200 Message-Id: <1334845776-11664-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.9.3 In-Reply-To: <1334845776-11664-1-git-send-email-pbonzini@redhat.com> References: <1334845776-11664-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.210.46 Subject: [Qemu-devel] [PATCH 04/16] 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 | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 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; + uint32_t sense_size; + uint32_t cdb_size; + int resetting; VirtQueue *ctrl_vq; VirtQueue *event_vq; - VirtQueue *cmd_vq; - uint32_t sense_size; - uint32_t cdb_size; - int resetting; + 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) {