From patchwork Wed May 23 13:52:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kelvin Wang X-Patchwork-Id: 160942 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 21613B6FB6 for ; Thu, 24 May 2012 01:32:09 +1000 (EST) Received: from localhost ([::1]:56898 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXDXj-0007hW-0u for incoming@patchwork.ozlabs.org; Wed, 23 May 2012 11:32:07 -0400 Received: from eggs.gnu.org ([208.118.235.92]:34371) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXBzN-0000Oh-92 for qemu-devel@nongnu.org; Wed, 23 May 2012 09:52:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SXBzL-0006Ss-2p for qemu-devel@nongnu.org; Wed, 23 May 2012 09:52:32 -0400 Received: from e23smtp01.au.ibm.com ([202.81.31.143]:40211) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXBzK-0006Rz-9j for qemu-devel@nongnu.org; Wed, 23 May 2012 09:52:30 -0400 Received: from /spool/local by e23smtp01.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 23 May 2012 13:43:35 +1000 Received: from d23relay03.au.ibm.com (202.81.31.245) by e23smtp01.au.ibm.com (202.81.31.207) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 23 May 2012 13:43:33 +1000 Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q4NDq8kF58130480 for ; Wed, 23 May 2012 23:52:08 +1000 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q4NDq8NO004384 for ; Wed, 23 May 2012 23:52:08 +1000 Received: from localhost (chinaltcdragon.cn.ibm.com [9.186.9.18]) by d23av01.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q4NDq7EC004368; Wed, 23 May 2012 23:52:07 +1000 Date: Wed, 23 May 2012 21:52:06 +0800 From: Kelvin Wang To: qemu-devel Message-ID: <20120523135206.GA14654@chinaltcdragon.cn.ibm.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) x-cbid: 12052303-1618-0000-0000-000001A9232B X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.81.31.143 X-Mailman-Approved-At: Wed, 23 May 2012 11:31:03 -0400 Cc: Stefan Hajnoczi , Brian Zhao , Paolo Bonzini , Amos Kong , "Michael S. Tsirkin" Subject: [Qemu-devel] [PATCH] Support virtio-scsi-pci adapter hot-plug X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: Kelvin Wang 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 Support the virtio-scsi-pci adapter hot-plug. However, this patch can only make adapter hot-plugable. More effort is needed for LUN hot-plug. Actually, that is the most valuable feature to virtio-scsi. Following the steps as follows can give an intuitive understanding of this feature after applying the patch to QEMU v1.1.0-rc3. 1, Generate a image file: qemu-img create -f qcow2 test.img 2G 2, Run qemu with the option -monitor. 3, In the guest, insert necessary modules: for m in acpiphp pci_hotplug; do sudo modprobe ${m}; done 4, In the qemu monitor,hot add a virtio-scsi-pci adapter: (qemu)pci_add auto storage if=virtio-scsi-pci 5, Check whether the controller was added: Guest: lspci Qemu: (qemu)info qtree Signed-off-by: Kelvin Wang Signed-off-by: Sheng Liu --- blockdev.c | 19 +++++++++++++++---- blockdev.h | 3 ++- hw/pci-hotplug.c | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/blockdev.c b/blockdev.c index 67895b2..ecb82bf 100644 --- a/blockdev.c +++ b/blockdev.c @@ -31,6 +31,7 @@ static const char *const if_name[IF_COUNT] = { [IF_MTD] = "mtd", [IF_SD] = "sd", [IF_VIRTIO] = "virtio", + [IF_VIRTIO_SCSI] = "virtio-scsi", [IF_XEN] = "xen", }; @@ -436,7 +437,8 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) on_write_error = BLOCK_ERR_STOP_ENOSPC; if ((buf = qemu_opt_get(opts, "werror")) != NULL) { - if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO && type != IF_NONE) { + if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO && + type != IF_VIRTIO_SCSI && type != IF_NONE) { error_report("werror is not supported by this bus type"); return NULL; } @@ -449,7 +451,8 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) on_read_error = BLOCK_ERR_REPORT; if ((buf = qemu_opt_get(opts, "rerror")) != NULL) { - if (type != IF_IDE && type != IF_VIRTIO && type != IF_SCSI && type != IF_NONE) { + if (type != IF_IDE && type != IF_VIRTIO && type != IF_SCSI && + IF_VIRTIO_SCSI && type != IF_NONE) { error_report("rerror is not supported by this bus type"); return NULL; } @@ -461,7 +464,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) } if ((devaddr = qemu_opt_get(opts, "addr")) != NULL) { - if (type != IF_VIRTIO) { + if (type != IF_VIRTIO || type != IF_VIRTIO_SCSI) { error_report("addr is not supported by this bus type"); return NULL; } @@ -579,6 +582,14 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) if (devaddr) qemu_opt_set(opts, "addr", devaddr); break; + case IF_VIRTIO_SCSI: + opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0); + qemu_opt_set(opts, "driver", "virtio-scsi-pci"); + qemu_opt_set(opts, "drive", dinfo->id); + if (devaddr) { + qemu_opt_set(opts, "addr", devaddr); + } + break; default: abort(); } @@ -604,7 +615,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) ro = 1; } else if (ro == 1) { if (type != IF_SCSI && type != IF_VIRTIO && type != IF_FLOPPY && - type != IF_NONE && type != IF_PFLASH) { + type != IF_NONE && type != IF_PFLASH && IF_VIRTIO_SCSI) { error_report("readonly not supported by this bus type"); goto err; } diff --git a/blockdev.h b/blockdev.h index 260e16b..96f40a5 100644 --- a/blockdev.h +++ b/blockdev.h @@ -22,7 +22,8 @@ void blockdev_auto_del(BlockDriverState *bs); typedef enum { IF_DEFAULT = -1, /* for use with drive_add() only */ IF_NONE, - IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, + IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, + IF_VIRTIO_SCSI, IF_COUNT } BlockInterfaceType; diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index c55d8b9..4f5c022 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -154,6 +154,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, type = IF_SCSI; else if (!strcmp(buf, "virtio")) { type = IF_VIRTIO; + } else if (!strcmp(buf, "virtio-scsi")) { + type = IF_VIRTIO_SCSI; } else { monitor_printf(mon, "type %s not a hotpluggable PCI device.\n", buf); return NULL; @@ -211,6 +213,19 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, if (qdev_init(&dev->qdev) < 0) dev = NULL; break; + case IF_VIRTIO_SCSI: + dev = pci_create(bus, devfn, "virtio-scsi-pci"); + if (qdev_init(&dev->qdev) < 0) { + dev = NULL; + } + + if (dev && dinfo) { + if (scsi_hot_add(mon, &dev->qdev, dinfo, 0) != 0) { + qdev_unplug(&dev->qdev, NULL); + dev = NULL; + } + } + break; default: dev = NULL; }