[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC-v2 4/6] virtio-scsi: Add start/stop functionality
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC-v2 4/6] virtio-scsi: Add start/stop functionality for vhost-scsi |
Date: |
Mon, 20 Aug 2012 11:04:30 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 |
Il 13/08/2012 10:35, Nicholas A. Bellinger ha scritto:
> From: Stefan Hajnoczi <address@hidden>
>
> This patch starts and stops vhost as the virtio device transitions
> through its status phases. Vhost can only be started once the guest
> reports its driver has successfully initialized, which means the
> virtqueues have been set up by the guest.
>
> v2: - Squash virtio-scsi: use the vhost-scsi host device from stefan (nab)
> - Fix up virtio_scsi_properties[] conflict w/ upstream qemu (nab)
> - Drop usage of to_virtio_scsi() in virtio_scsi_set_status()
> (reported by paolo)
> - Use modern VirtIOSCSIConf define in virtio-scsi.h (reported by paolo)
> - Use s->conf->vhost_scsi instead of proxyconf->vhost_scsi in
> virtio_scsi_init() (reported by paolo)
> - Only register QEMU SCSI bus is vhost-scsi is not active (reported
> by paolo)
How much of the functionality of virtio-scsi.[ch] is still in use at
this point? Would it make more sense to use a separate vhost-scsi-pci
device instead?
Especially since advertising VIRTIO_SCSI_F_HOTPLUG and
VIRTIO_SCSI_F_CHANGE is probably wrong for vhost-scsi...
Paolo
> Cc: Stefan Hajnoczi <address@hidden>
> Cc: Zhi Yong Wu <address@hidden>
> Cc: Michael S. Tsirkin <address@hidden>
> Cc: Paolo Bonzini <address@hidden>
> Signed-off-by: Nicholas Bellinger <address@hidden>
> ---
> hw/virtio-pci.c | 1 +
> hw/virtio-scsi.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
> hw/virtio-scsi.h | 1 +
> 3 files changed, 50 insertions(+), 0 deletions(-)
>
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index 125eded..b29fc3b 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -1036,6 +1036,7 @@ static void virtio_scsi_exit_pci(PCIDevice *pci_dev)
> }
>
> static Property virtio_scsi_properties[] = {
> + DEFINE_PROP_VHOST_SCSI("vhost-scsi", VirtIOPCIProxy, scsi.vhost_scsi),
> DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags,
> VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
> DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
> DEV_NVECTORS_UNSPECIFIED),
> DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
> diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
> index 5f737ac..8130956 100644
> --- a/hw/virtio-scsi.c
> +++ b/hw/virtio-scsi.c
> @@ -13,9 +13,13 @@
> *
> */
>
> +#include "qemu-common.h"
> +#include "qemu-error.h"
> +#include "vhost-scsi.h"
> #include "virtio-scsi.h"
> #include <hw/scsi.h>
> #include <hw/scsi-defs.h>
> +#include "vhost.h"
>
> #define VIRTIO_SCSI_VQ_SIZE 128
> #define VIRTIO_SCSI_CDB_SIZE 32
> @@ -147,6 +151,9 @@ typedef struct {
> VirtQueue *ctrl_vq;
> VirtQueue *event_vq;
> VirtQueue *cmd_vqs[0];
> +
> + bool vhost_started;
> + VHostSCSI *vhost_scsi;
> } VirtIOSCSI;
>
> typedef struct VirtIOSCSIReq {
> @@ -699,6 +706,38 @@ static struct SCSIBusInfo virtio_scsi_scsi_info = {
> .load_request = virtio_scsi_load_request,
> };
>
> +static bool virtio_scsi_started(VirtIOSCSI *s, uint8_t val)
> +{
> + return (val & VIRTIO_CONFIG_S_DRIVER_OK) && s->vdev.vm_running;
> +}
> +
> +static void virtio_scsi_set_status(VirtIODevice *vdev, uint8_t val)
> +{
> + VirtIOSCSI *s = (VirtIOSCSI *)vdev;
> + bool start = virtio_scsi_started(s, val);
> +
> + if (s->vhost_started == start) {
> + return;
> + }
> +
> + if (start) {
> + int ret;
> +
> + ret = vhost_scsi_start(s->vhost_scsi, vdev);
> + if (ret < 0) {
> + error_report("virtio-scsi: unable to start vhost: %s\n",
> + strerror(-ret));
> +
> + /* There is no userspace virtio-scsi fallback so exit */
> + exit(1);
> + }
> + } else {
> + vhost_scsi_stop(s->vhost_scsi, vdev);
> + }
> +
> + s->vhost_started = start;
> +}
> +
> VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
> {
> VirtIOSCSI *s;
> @@ -712,12 +751,17 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev,
> VirtIOSCSIConf *proxyconf)
>
> s->qdev = dev;
> s->conf = proxyconf;
> + s->vhost_started = false;
> + s->vhost_scsi = s->conf->vhost_scsi;
>
> /* TODO set up vdev function pointers */
> s->vdev.get_config = virtio_scsi_get_config;
> s->vdev.set_config = virtio_scsi_set_config;
> s->vdev.get_features = virtio_scsi_get_features;
> s->vdev.reset = virtio_scsi_reset;
> + if (s->vhost_scsi) {
> + s->vdev.set_status = virtio_scsi_set_status;
> + }
>
> s->ctrl_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
> virtio_scsi_handle_ctrl);
> @@ -743,5 +787,9 @@ void virtio_scsi_exit(VirtIODevice *vdev)
> {
> VirtIOSCSI *s = (VirtIOSCSI *)vdev;
> unregister_savevm(s->qdev, "virtio-scsi", s);
> +
> + /* This will stop vhost backend if appropriate. */
> + virtio_scsi_set_status(vdev, 0);
> +
> virtio_cleanup(vdev);
> }
> diff --git a/hw/virtio-scsi.h b/hw/virtio-scsi.h
> index 4bc889d..74e9422 100644
> --- a/hw/virtio-scsi.h
> +++ b/hw/virtio-scsi.h
> @@ -22,6 +22,7 @@
> #define VIRTIO_ID_SCSI 8
>
> struct VirtIOSCSIConf {
> + VHostSCSI *vhost_scsi;
> uint32_t num_queues;
> uint32_t max_sectors;
> uint32_t cmd_per_lun;
>
- [Qemu-devel] [RFC-v2 1/6] msix: Work-around for vhost-scsi with KVM in-kernel MSI injection, (continued)
Re: [Qemu-devel] [RFC-v2 1/6] msix: Work-around for vhost-scsi with KVM in-kernel MSI injection, Blue Swirl, 2012/08/13
[Qemu-devel] [RFC-v2 2/6] vhost: Pass device path to vhost_dev_init(), Nicholas A. Bellinger, 2012/08/13
[Qemu-devel] [RFC-v2 4/6] virtio-scsi: Add start/stop functionality for vhost-scsi, Nicholas A. Bellinger, 2012/08/13
- Re: [Qemu-devel] [RFC-v2 4/6] virtio-scsi: Add start/stop functionality for vhost-scsi,
Paolo Bonzini <=
[Qemu-devel] [RFC-v2 5/6] virtio-scsi: Set max_target=0 during vhost-scsi operation, Nicholas A. Bellinger, 2012/08/13
[Qemu-devel] [RFC-v2 6/6] virtio-scsi: Fix incorrect VirtIOSCSI->cmd_vqs[0] definition, Nicholas A. Bellinger, 2012/08/13
[Qemu-devel] [RFC-v2 3/6] vhost-scsi: add -vhost-scsi host device for use with tcm-vhost, Nicholas A. Bellinger, 2012/08/13