All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liran Alon <liran.alon@oracle.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, mtosatti@redhat.com, rth@twiddle.net,
	ehabkost@redhat.com, stefanha@gmail.com, nir.weiner@oracle.com,
	bijan.mottahedeh@oracle.com, Liran Alon <liran.alon@oracle.com>
Subject: [Qemu-devel] [PATCH v2 3/3] vhost-scsi: Allow user to enable migration
Date: Tue, 16 Apr 2019 15:59:12 +0300	[thread overview]
Message-ID: <20190416125912.44001-4-liran.alon@oracle.com> (raw)
In-Reply-To: <20190416125912.44001-1-liran.alon@oracle.com>

In order to perform a valid migration of a vhost-scsi device,
the following requirements must be met:
(1) The virtio-scsi device state needs to be saved & loaded.
(2) The vhost backend must be stopped before virtio-scsi device state
is saved:
  (2.1) Sync vhost backend state to virtio-scsi device state.
  (2.2) No further I/O requests are made by vhost backend to target
        SCSI device.
  (2.3) No further guest memory access takes place after VM is stopped.
(3) Requests in-flight to target SCSI device are completed before
    migration handover.
(4) Target SCSI device state needs to be saved & loaded into the
    destination host target SCSI device.

Previous commit ("vhost-scsi: Add VMState descriptor")
add support to save & load the device state using VMState.
This meets requirement (1).

When VM is stopped by migration thread (On Pre-Copy complete), the
following code path is executed:
migration_completion() -> vm_stop_force_state() -> vm_stop() ->
do_vm_stop().

do_vm_stop() calls first pause_all_vcpus() which pause all guest
vCPUs and then call vm_state_notify().
In case of vhost-scsi device, this will lead to the following code path
to be executed:
vm_state_notify() -> virtio_vmstate_change() ->
virtio_set_status() -> vhost_scsi_set_status() -> vhost_scsi_stop().
vhost_scsi_stop() then calls vhost_scsi_clear_endpoint() and
vhost_scsi_common_stop().

vhost_scsi_clear_endpoint() sends VHOST_SCSI_CLEAR_ENDPOINT ioctl to
vhost backend which will reach kernel's vhost_scsi_clear_endpoint()
which process all pending I/O requests and wait for them to complete
(vhost_scsi_flush()). This meets requirement (3).

vhost_scsi_common_stop() will stop the vhost backend.
As part of this stop, dirty-bitmap is synced and vhost backend state is
synced with virtio-scsi device state. As at this point guest vCPUs are
already paused, this meets requirement (2).

At this point we are left with requirement (4) which is target SCSI
device specific and therefore cannot be done by QEMU. Which is the main
reason why vhost-scsi adds a migration blocker.
However, as this can be handled either by an external orchestrator or
by using shared-storage (i.e. iSCSI), there is no reason to limit the
orchestrator from being able to explictly specify it wish to enable
migration even when VM have a vhost-scsi device.

Considering all the above, this commit allows orchestrator to explictly
specify that it is responsbile for taking care of requirement (4) and
therefore vhost-scsi should not add a migration blocker.

Reviewed-by: Nir Weiner <nir.weiner@oracle.com>
Reviewed-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
---
 hw/scsi/vhost-scsi.c                  | 30 ++++++++++++++++++---------
 include/hw/virtio/vhost-scsi-common.h |  1 +
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index eb0cf9e1312f..6b01accf61ad 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -199,13 +199,18 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
         goto close_fd;
     }
 
-    error_setg(&vsc->migration_blocker,
-               "vhost-scsi does not support migration");
-    migrate_add_blocker(vsc->migration_blocker, &err);
-    if (err) {
-        error_propagate(errp, err);
-        error_free(vsc->migration_blocker);
-        goto close_fd;
+    if (!vsc->migratable) {
+        error_setg(&vsc->migration_blocker,
+                "vhost-scsi does not support migration in all cases. "
+                "When external environment supports it (Orchestrator migrates "
+                "target SCSI device state or use shared storage over network), "
+                "set 'migratable' property to true to enable migration.");
+        migrate_add_blocker(vsc->migration_blocker, &err);
+        if (err) {
+            error_propagate(errp, err);
+            error_free(vsc->migration_blocker);
+            goto close_fd;
+        }
     }
 
     vsc->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
@@ -230,7 +235,9 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     return;
 
  free_vqs:
-    migrate_del_blocker(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+    }
     g_free(vsc->dev.vqs);
  close_fd:
     close(vhostfd);
@@ -243,8 +250,10 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
     struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
-    migrate_del_blocker(vsc->migration_blocker);
-    error_free(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+        error_free(vsc->migration_blocker);
+    }
 
     /* This will stop vhost backend. */
     vhost_scsi_set_status(vdev, 0);
@@ -268,6 +277,7 @@ static Property vhost_scsi_properties[] = {
     DEFINE_PROP_BIT64("t10_pi", VHostSCSICommon, host_features,
                                                  VIRTIO_SCSI_F_T10_PI,
                                                  false),
+    DEFINE_PROP_BOOL("migratable", VHostSCSICommon, migratable, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/virtio/vhost-scsi-common.h b/include/hw/virtio/vhost-scsi-common.h
index 57fb1d87b51d..4eab767ee89f 100644
--- a/include/hw/virtio/vhost-scsi-common.h
+++ b/include/hw/virtio/vhost-scsi-common.h
@@ -36,6 +36,7 @@ typedef struct VHostSCSICommon {
     int target;
     int lun;
     uint64_t host_features;
+    bool migratable;
 } VHostSCSICommon;
 
 int vhost_scsi_common_start(VHostSCSICommon *vsc);
-- 
2.20.1

WARNING: multiple messages have this Message-ID (diff)
From: Liran Alon <liran.alon@oracle.com>
To: qemu-devel@nongnu.org
Cc: ehabkost@redhat.com, stefanha@gmail.com, mtosatti@redhat.com,
	bijan.mottahedeh@oracle.com, Liran Alon <liran.alon@oracle.com>,
	pbonzini@redhat.com, nir.weiner@oracle.com, rth@twiddle.net
Subject: [Qemu-devel] [PATCH v2 3/3] vhost-scsi: Allow user to enable migration
Date: Tue, 16 Apr 2019 15:59:12 +0300	[thread overview]
Message-ID: <20190416125912.44001-4-liran.alon@oracle.com> (raw)
Message-ID: <20190416125912.oet8ZoOUPBrJeTZGgUJ44aZrZpg14K17f3bOnJXGthA@z> (raw)
In-Reply-To: <20190416125912.44001-1-liran.alon@oracle.com>

In order to perform a valid migration of a vhost-scsi device,
the following requirements must be met:
(1) The virtio-scsi device state needs to be saved & loaded.
(2) The vhost backend must be stopped before virtio-scsi device state
is saved:
  (2.1) Sync vhost backend state to virtio-scsi device state.
  (2.2) No further I/O requests are made by vhost backend to target
        SCSI device.
  (2.3) No further guest memory access takes place after VM is stopped.
(3) Requests in-flight to target SCSI device are completed before
    migration handover.
(4) Target SCSI device state needs to be saved & loaded into the
    destination host target SCSI device.

Previous commit ("vhost-scsi: Add VMState descriptor")
add support to save & load the device state using VMState.
This meets requirement (1).

When VM is stopped by migration thread (On Pre-Copy complete), the
following code path is executed:
migration_completion() -> vm_stop_force_state() -> vm_stop() ->
do_vm_stop().

do_vm_stop() calls first pause_all_vcpus() which pause all guest
vCPUs and then call vm_state_notify().
In case of vhost-scsi device, this will lead to the following code path
to be executed:
vm_state_notify() -> virtio_vmstate_change() ->
virtio_set_status() -> vhost_scsi_set_status() -> vhost_scsi_stop().
vhost_scsi_stop() then calls vhost_scsi_clear_endpoint() and
vhost_scsi_common_stop().

vhost_scsi_clear_endpoint() sends VHOST_SCSI_CLEAR_ENDPOINT ioctl to
vhost backend which will reach kernel's vhost_scsi_clear_endpoint()
which process all pending I/O requests and wait for them to complete
(vhost_scsi_flush()). This meets requirement (3).

vhost_scsi_common_stop() will stop the vhost backend.
As part of this stop, dirty-bitmap is synced and vhost backend state is
synced with virtio-scsi device state. As at this point guest vCPUs are
already paused, this meets requirement (2).

At this point we are left with requirement (4) which is target SCSI
device specific and therefore cannot be done by QEMU. Which is the main
reason why vhost-scsi adds a migration blocker.
However, as this can be handled either by an external orchestrator or
by using shared-storage (i.e. iSCSI), there is no reason to limit the
orchestrator from being able to explictly specify it wish to enable
migration even when VM have a vhost-scsi device.

Considering all the above, this commit allows orchestrator to explictly
specify that it is responsbile for taking care of requirement (4) and
therefore vhost-scsi should not add a migration blocker.

Reviewed-by: Nir Weiner <nir.weiner@oracle.com>
Reviewed-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
---
 hw/scsi/vhost-scsi.c                  | 30 ++++++++++++++++++---------
 include/hw/virtio/vhost-scsi-common.h |  1 +
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index eb0cf9e1312f..6b01accf61ad 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -199,13 +199,18 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
         goto close_fd;
     }
 
-    error_setg(&vsc->migration_blocker,
-               "vhost-scsi does not support migration");
-    migrate_add_blocker(vsc->migration_blocker, &err);
-    if (err) {
-        error_propagate(errp, err);
-        error_free(vsc->migration_blocker);
-        goto close_fd;
+    if (!vsc->migratable) {
+        error_setg(&vsc->migration_blocker,
+                "vhost-scsi does not support migration in all cases. "
+                "When external environment supports it (Orchestrator migrates "
+                "target SCSI device state or use shared storage over network), "
+                "set 'migratable' property to true to enable migration.");
+        migrate_add_blocker(vsc->migration_blocker, &err);
+        if (err) {
+            error_propagate(errp, err);
+            error_free(vsc->migration_blocker);
+            goto close_fd;
+        }
     }
 
     vsc->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
@@ -230,7 +235,9 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     return;
 
  free_vqs:
-    migrate_del_blocker(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+    }
     g_free(vsc->dev.vqs);
  close_fd:
     close(vhostfd);
@@ -243,8 +250,10 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
     struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
-    migrate_del_blocker(vsc->migration_blocker);
-    error_free(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+        error_free(vsc->migration_blocker);
+    }
 
     /* This will stop vhost backend. */
     vhost_scsi_set_status(vdev, 0);
@@ -268,6 +277,7 @@ static Property vhost_scsi_properties[] = {
     DEFINE_PROP_BIT64("t10_pi", VHostSCSICommon, host_features,
                                                  VIRTIO_SCSI_F_T10_PI,
                                                  false),
+    DEFINE_PROP_BOOL("migratable", VHostSCSICommon, migratable, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/virtio/vhost-scsi-common.h b/include/hw/virtio/vhost-scsi-common.h
index 57fb1d87b51d..4eab767ee89f 100644
--- a/include/hw/virtio/vhost-scsi-common.h
+++ b/include/hw/virtio/vhost-scsi-common.h
@@ -36,6 +36,7 @@ typedef struct VHostSCSICommon {
     int target;
     int lun;
     uint64_t host_features;
+    bool migratable;
 } VHostSCSICommon;
 
 int vhost_scsi_common_start(VHostSCSICommon *vsc);
-- 
2.20.1



WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <fam@euphon.net>,
	Peter Maydell <peter.maydell@linaro.org>,
	Bijan Mottahedeh <bijan.mottahedeh@oracle.com>,
	Liran Alon <liran.alon@oracle.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Nir Weiner <nir.weiner@oracle.com>
Subject: [Qemu-devel] [PULL v2 13/14] vhost-scsi: Allow user to enable migration
Date: Mon, 3 Jun 2019 14:09:07 -0400	[thread overview]
Message-ID: <20190416125912.44001-4-liran.alon@oracle.com> (raw)
Message-ID: <20190603180907.Htz0yfGmYW9ZIjrqwTzpW3sBqmw7So7BTCXxLt__qCc@z> (raw)
In-Reply-To: <20190603180807.16140-1-mst@redhat.com>

From: Liran Alon <liran.alon@oracle.com>

In order to perform a valid migration of a vhost-scsi device,
the following requirements must be met:
(1) The virtio-scsi device state needs to be saved & loaded.
(2) The vhost backend must be stopped before virtio-scsi device state
is saved:
  (2.1) Sync vhost backend state to virtio-scsi device state.
  (2.2) No further I/O requests are made by vhost backend to target
        SCSI device.
  (2.3) No further guest memory access takes place after VM is stopped.
(3) Requests in-flight to target SCSI device are completed before
    migration handover.
(4) Target SCSI device state needs to be saved & loaded into the
    destination host target SCSI device.

Previous commit ("vhost-scsi: Add VMState descriptor")
add support to save & load the device state using VMState.
This meets requirement (1).

When VM is stopped by migration thread (On Pre-Copy complete), the
following code path is executed:
migration_completion() -> vm_stop_force_state() -> vm_stop() ->
do_vm_stop().

do_vm_stop() calls first pause_all_vcpus() which pause all guest
vCPUs and then call vm_state_notify().
In case of vhost-scsi device, this will lead to the following code path
to be executed:
vm_state_notify() -> virtio_vmstate_change() ->
virtio_set_status() -> vhost_scsi_set_status() -> vhost_scsi_stop().
vhost_scsi_stop() then calls vhost_scsi_clear_endpoint() and
vhost_scsi_common_stop().

vhost_scsi_clear_endpoint() sends VHOST_SCSI_CLEAR_ENDPOINT ioctl to
vhost backend which will reach kernel's vhost_scsi_clear_endpoint()
which process all pending I/O requests and wait for them to complete
(vhost_scsi_flush()). This meets requirement (3).

vhost_scsi_common_stop() will stop the vhost backend.
As part of this stop, dirty-bitmap is synced and vhost backend state is
synced with virtio-scsi device state. As at this point guest vCPUs are
already paused, this meets requirement (2).

At this point we are left with requirement (4) which is target SCSI
device specific and therefore cannot be done by QEMU. Which is the main
reason why vhost-scsi adds a migration blocker.
However, as this can be handled either by an external orchestrator or
by using shared-storage (i.e. iSCSI), there is no reason to limit the
orchestrator from being able to explictly specify it wish to enable
migration even when VM have a vhost-scsi device.

Considering all the above, this commit allows orchestrator to explictly
specify that it is responsbile for taking care of requirement (4) and
therefore vhost-scsi should not add a migration blocker.

Reviewed-by: Nir Weiner <nir.weiner@oracle.com>
Reviewed-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Message-Id: <20190416125912.44001-4-liran.alon@oracle.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 include/hw/virtio/vhost-scsi-common.h |  1 +
 hw/scsi/vhost-scsi.c                  | 30 ++++++++++++++++++---------
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/include/hw/virtio/vhost-scsi-common.h b/include/hw/virtio/vhost-scsi-common.h
index 57fb1d87b5..4eab767ee8 100644
--- a/include/hw/virtio/vhost-scsi-common.h
+++ b/include/hw/virtio/vhost-scsi-common.h
@@ -36,6 +36,7 @@ typedef struct VHostSCSICommon {
     int target;
     int lun;
     uint64_t host_features;
+    bool migratable;
 } VHostSCSICommon;
 
 int vhost_scsi_common_start(VHostSCSICommon *vsc);
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index eb0cf9e131..6b01accf61 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -199,13 +199,18 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
         goto close_fd;
     }
 
-    error_setg(&vsc->migration_blocker,
-               "vhost-scsi does not support migration");
-    migrate_add_blocker(vsc->migration_blocker, &err);
-    if (err) {
-        error_propagate(errp, err);
-        error_free(vsc->migration_blocker);
-        goto close_fd;
+    if (!vsc->migratable) {
+        error_setg(&vsc->migration_blocker,
+                "vhost-scsi does not support migration in all cases. "
+                "When external environment supports it (Orchestrator migrates "
+                "target SCSI device state or use shared storage over network), "
+                "set 'migratable' property to true to enable migration.");
+        migrate_add_blocker(vsc->migration_blocker, &err);
+        if (err) {
+            error_propagate(errp, err);
+            error_free(vsc->migration_blocker);
+            goto close_fd;
+        }
     }
 
     vsc->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
@@ -230,7 +235,9 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     return;
 
  free_vqs:
-    migrate_del_blocker(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+    }
     g_free(vsc->dev.vqs);
  close_fd:
     close(vhostfd);
@@ -243,8 +250,10 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
     struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
-    migrate_del_blocker(vsc->migration_blocker);
-    error_free(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+        error_free(vsc->migration_blocker);
+    }
 
     /* This will stop vhost backend. */
     vhost_scsi_set_status(vdev, 0);
@@ -268,6 +277,7 @@ static Property vhost_scsi_properties[] = {
     DEFINE_PROP_BIT64("t10_pi", VHostSCSICommon, host_features,
                                                  VIRTIO_SCSI_F_T10_PI,
                                                  false),
+    DEFINE_PROP_BOOL("migratable", VHostSCSICommon, migratable, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
MST



WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <fam@euphon.net>,
	Peter Maydell <peter.maydell@linaro.org>,
	Bijan Mottahedeh <bijan.mottahedeh@oracle.com>,
	Liran Alon <liran.alon@oracle.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Nir Weiner <nir.weiner@oracle.com>
Subject: [Qemu-devel] [PULL v3 13/17] vhost-scsi: Allow user to enable migration
Date: Wed, 5 Jun 2019 16:00:42 -0400	[thread overview]
Message-ID: <20190416125912.44001-4-liran.alon@oracle.com> (raw)
Message-ID: <20190605200042.BPZ_oo0E36jQzQlJZ_eJJZdgthWhBOGiOdAGNS6UQ7M@z> (raw)
In-Reply-To: <20190605195913.12243-1-mst@redhat.com>

From: Liran Alon <liran.alon@oracle.com>

In order to perform a valid migration of a vhost-scsi device,
the following requirements must be met:
(1) The virtio-scsi device state needs to be saved & loaded.
(2) The vhost backend must be stopped before virtio-scsi device state
is saved:
  (2.1) Sync vhost backend state to virtio-scsi device state.
  (2.2) No further I/O requests are made by vhost backend to target
        SCSI device.
  (2.3) No further guest memory access takes place after VM is stopped.
(3) Requests in-flight to target SCSI device are completed before
    migration handover.
(4) Target SCSI device state needs to be saved & loaded into the
    destination host target SCSI device.

Previous commit ("vhost-scsi: Add VMState descriptor")
add support to save & load the device state using VMState.
This meets requirement (1).

When VM is stopped by migration thread (On Pre-Copy complete), the
following code path is executed:
migration_completion() -> vm_stop_force_state() -> vm_stop() ->
do_vm_stop().

do_vm_stop() calls first pause_all_vcpus() which pause all guest
vCPUs and then call vm_state_notify().
In case of vhost-scsi device, this will lead to the following code path
to be executed:
vm_state_notify() -> virtio_vmstate_change() ->
virtio_set_status() -> vhost_scsi_set_status() -> vhost_scsi_stop().
vhost_scsi_stop() then calls vhost_scsi_clear_endpoint() and
vhost_scsi_common_stop().

vhost_scsi_clear_endpoint() sends VHOST_SCSI_CLEAR_ENDPOINT ioctl to
vhost backend which will reach kernel's vhost_scsi_clear_endpoint()
which process all pending I/O requests and wait for them to complete
(vhost_scsi_flush()). This meets requirement (3).

vhost_scsi_common_stop() will stop the vhost backend.
As part of this stop, dirty-bitmap is synced and vhost backend state is
synced with virtio-scsi device state. As at this point guest vCPUs are
already paused, this meets requirement (2).

At this point we are left with requirement (4) which is target SCSI
device specific and therefore cannot be done by QEMU. Which is the main
reason why vhost-scsi adds a migration blocker.
However, as this can be handled either by an external orchestrator or
by using shared-storage (i.e. iSCSI), there is no reason to limit the
orchestrator from being able to explictly specify it wish to enable
migration even when VM have a vhost-scsi device.

Considering all the above, this commit allows orchestrator to explictly
specify that it is responsbile for taking care of requirement (4) and
therefore vhost-scsi should not add a migration blocker.

Reviewed-by: Nir Weiner <nir.weiner@oracle.com>
Reviewed-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Message-Id: <20190416125912.44001-4-liran.alon@oracle.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 include/hw/virtio/vhost-scsi-common.h |  1 +
 hw/scsi/vhost-scsi.c                  | 30 ++++++++++++++++++---------
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/include/hw/virtio/vhost-scsi-common.h b/include/hw/virtio/vhost-scsi-common.h
index 57fb1d87b5..4eab767ee8 100644
--- a/include/hw/virtio/vhost-scsi-common.h
+++ b/include/hw/virtio/vhost-scsi-common.h
@@ -36,6 +36,7 @@ typedef struct VHostSCSICommon {
     int target;
     int lun;
     uint64_t host_features;
+    bool migratable;
 } VHostSCSICommon;
 
 int vhost_scsi_common_start(VHostSCSICommon *vsc);
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index eb0cf9e131..6b01accf61 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -199,13 +199,18 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
         goto close_fd;
     }
 
-    error_setg(&vsc->migration_blocker,
-               "vhost-scsi does not support migration");
-    migrate_add_blocker(vsc->migration_blocker, &err);
-    if (err) {
-        error_propagate(errp, err);
-        error_free(vsc->migration_blocker);
-        goto close_fd;
+    if (!vsc->migratable) {
+        error_setg(&vsc->migration_blocker,
+                "vhost-scsi does not support migration in all cases. "
+                "When external environment supports it (Orchestrator migrates "
+                "target SCSI device state or use shared storage over network), "
+                "set 'migratable' property to true to enable migration.");
+        migrate_add_blocker(vsc->migration_blocker, &err);
+        if (err) {
+            error_propagate(errp, err);
+            error_free(vsc->migration_blocker);
+            goto close_fd;
+        }
     }
 
     vsc->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
@@ -230,7 +235,9 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     return;
 
  free_vqs:
-    migrate_del_blocker(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+    }
     g_free(vsc->dev.vqs);
  close_fd:
     close(vhostfd);
@@ -243,8 +250,10 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
     struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
-    migrate_del_blocker(vsc->migration_blocker);
-    error_free(vsc->migration_blocker);
+    if (!vsc->migratable) {
+        migrate_del_blocker(vsc->migration_blocker);
+        error_free(vsc->migration_blocker);
+    }
 
     /* This will stop vhost backend. */
     vhost_scsi_set_status(vdev, 0);
@@ -268,6 +277,7 @@ static Property vhost_scsi_properties[] = {
     DEFINE_PROP_BIT64("t10_pi", VHostSCSICommon, host_features,
                                                  VIRTIO_SCSI_F_T10_PI,
                                                  false),
+    DEFINE_PROP_BOOL("migratable", VHostSCSICommon, migratable, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
MST



  parent reply	other threads:[~2019-04-16 13:01 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-16 12:59 [Qemu-devel] [PATCH v2 0/3] vhost-scsi: Support migration Liran Alon
2019-04-16 12:59 ` Liran Alon
2019-04-16 12:59 ` [Qemu-devel] [PATCH v2 1/3] vhost-scsi: The vhost backend should be stopped when the VM is not running Liran Alon
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 11/17] " Michael S. Tsirkin
2019-06-03 18:09   ` [Qemu-devel] [PULL v2 11/14] " Michael S. Tsirkin
2019-04-16 12:59   ` [Qemu-devel] [PATCH v2 1/3] " Liran Alon
2019-04-16 12:59 ` [Qemu-devel] [PATCH v2 2/3] vhost-scsi: Add VMState descriptor Liran Alon
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 12/17] " Michael S. Tsirkin
2019-06-03 18:09   ` [Qemu-devel] [PULL v2 12/14] " Michael S. Tsirkin
2019-04-16 12:59   ` [Qemu-devel] [PATCH v2 2/3] " Liran Alon
2019-04-16 12:59 ` Liran Alon [this message]
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 13/17] vhost-scsi: Allow user to enable migration Michael S. Tsirkin
2019-06-03 18:09   ` [Qemu-devel] [PULL v2 13/14] " Michael S. Tsirkin
2019-04-16 12:59   ` [Qemu-devel] [PATCH v2 3/3] " Liran Alon
2019-04-18  9:41 ` [Qemu-devel] [PATCH v2 0/3] vhost-scsi: Support migration Stefan Hajnoczi
2019-04-18  9:41   ` Stefan Hajnoczi
2019-04-24 16:38   ` Liran Alon
2019-04-24 16:38     ` Liran Alon
2019-04-25  8:38     ` Stefan Hajnoczi
2019-04-25  8:38       ` Stefan Hajnoczi
2019-04-25 17:53       ` Michael S. Tsirkin
2019-04-25 17:53         ` Michael S. Tsirkin
2019-05-10 11:48         ` Liran Alon
2019-06-02 23:40         ` Liran Alon
2019-06-03  0:39           ` Michael S. Tsirkin
2019-06-12 15:26           ` Paolo Bonzini
2019-04-30  6:10 [Qemu-devel] [PATCH] vhost: remove the dead code Jie Wang
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 07/17] " Michael S. Tsirkin
2019-06-03 18:08 ` [Qemu-devel] [PULL v2 07/14] " Michael S. Tsirkin
2019-05-29 16:37 ` [Qemu-devel] [PULL 08/10] " Michael S. Tsirkin
2019-04-30  6:10 ` [Qemu-devel] [PATCH] " Jie Wang
2019-05-01 16:38 ` Stefan Hajnoczi
2019-05-01 16:38   ` Stefan Hajnoczi
2019-05-29 12:12   ` [Qemu-devel] Ping " Jie Wang
2019-04-30  6:29 [Qemu-devel] [PATCH] vhost: fix incorrect print type Jie Wang
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 08/17] " Michael S. Tsirkin
2019-06-03 18:08 ` [Qemu-devel] [PULL v2 08/14] " Michael S. Tsirkin
2019-05-29 16:37 ` [Qemu-devel] [PULL 09/10] " Michael S. Tsirkin
2019-04-30  6:29 ` [Qemu-devel] [PATCH] " Jie Wang
2019-04-30  8:48 ` Philippe Mathieu-Daudé
2019-04-30  8:48   ` Philippe Mathieu-Daudé
2019-05-29 13:13   ` Philippe Mathieu-Daudé
2019-06-06  9:20     ` [Qemu-devel] [Qemu-trivial] " Laurent Vivier
2019-05-02  8:30 ` [Qemu-devel] " no-reply
2019-05-02  8:30   ` no-reply
2019-05-02  9:34 ` no-reply
2019-05-02  9:34   ` no-reply
2019-04-30  7:15 [Qemu-devel] [PATCH] vhost: fix memory leak in vhost_user_scsi_realize Jie Wang
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 09/17] " Michael S. Tsirkin
2019-06-03 18:08 ` [Qemu-devel] [PULL v2 09/14] " Michael S. Tsirkin
2019-05-29 16:37 ` [Qemu-devel] [PULL 10/10] " Michael S. Tsirkin
2019-04-30  7:15 ` [Qemu-devel] [PATCH] " Jie Wang
2019-05-01 16:40 ` Stefan Hajnoczi
2019-05-29 12:12   ` [Qemu-devel] Ping " Jie Wang
2019-05-13  6:19 [Qemu-devel] [PATCH v4 0/5] Simplify some not-really-necessary PCI bus callbacks David Gibson
2019-05-13  6:19 ` [Qemu-devel] [PATCH v4 1/5] pcie: Remove redundant test in pcie_mmcfg_data_{read, write}() David Gibson
2019-05-13  6:19 ` [Qemu-devel] [PATCH v4 2/5] pci: Simplify pci_bus_is_root() David Gibson
2019-05-13  6:19 ` [Qemu-devel] [PATCH v4 3/5] pcie: Simplify pci_adjust_config_limit() David Gibson
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 03/17] " Michael S. Tsirkin
2019-06-03 18:08   ` [Qemu-devel] [PULL v2 03/14] " Michael S. Tsirkin
2019-05-29 16:37   ` [Qemu-devel] [PULL 04/10] " Michael S. Tsirkin
2019-05-13  6:19 ` [Qemu-devel] [PATCH v4 4/5] pci: Make is_bridge a bool David Gibson
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 04/17] " Michael S. Tsirkin
2019-06-03 18:08   ` [Qemu-devel] [PULL v2 04/14] " Michael S. Tsirkin
2019-05-29 16:37   ` [Qemu-devel] [PULL 05/10] " Michael S. Tsirkin
2019-05-13  6:19 ` [Qemu-devel] [PATCH v4 5/5] pci: Fold pci_get_bus_devfn() into its sole caller David Gibson
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 05/17] " Michael S. Tsirkin
2019-06-03 18:08   ` [Qemu-devel] [PULL v2 05/14] " Michael S. Tsirkin
2019-05-29 16:37   ` [Qemu-devel] [PULL 06/10] " Michael S. Tsirkin
2019-05-13  8:02   ` [Qemu-devel] [PATCH v4 5/5] " Greg Kurz
2019-05-21  6:28 [Qemu-devel] [PATCH v6 0/2] Extract build_mcfg Part 2 Wei Yang
2019-05-21  6:28 ` [Qemu-devel] [PATCH v6 1/2] hw/acpi: Consolidate build_mcfg to pci.c Wei Yang
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 01/17] " Michael S. Tsirkin
2019-06-03 18:08   ` [Qemu-devel] [PULL v2 01/14] " Michael S. Tsirkin
2019-05-29 16:37   ` [Qemu-devel] [PULL 02/10] " Michael S. Tsirkin
2019-05-22  9:11   ` [Qemu-devel] [PATCH v6 1/2] " Igor Mammedov
2019-05-21  6:28 ` [Qemu-devel] [PATCH v6 2/2] acpi: pci: use build_append_foo() API to construct MCFG Wei Yang
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 02/17] " Michael S. Tsirkin
2019-06-03 18:08   ` [Qemu-devel] [PULL v2 02/14] " Michael S. Tsirkin
2019-05-29 16:37   ` [Qemu-devel] [PULL 03/10] " Michael S. Tsirkin
2019-05-21 14:23 [Qemu-devel] [PATCH v2] docs: smbios: remove family=x from type2 entry description Igor Mammedov
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 06/17] " Michael S. Tsirkin
2019-06-03 18:08 ` [Qemu-devel] [PULL v2 06/14] " Michael S. Tsirkin
2019-05-29 16:37 ` [Qemu-devel] [PULL 07/10] " Michael S. Tsirkin
2019-05-29 16:37 [Qemu-devel] [PULL 00/10] virtio, pci, pc: cleanups Michael S. Tsirkin
2019-05-29 16:37 ` [Qemu-devel] [PULL 01/10] bios-tables-test: add diff allowed list Michael S. Tsirkin
2019-05-29 22:02 ` [Qemu-devel] [PULL 00/10] virtio, pci, pc: cleanups Michael S. Tsirkin
2019-06-03 11:22 [Qemu-devel] [PATCH v6 0/2] tests: acpi: ARM testing support Igor Mammedov
2019-06-03 11:22 ` [Qemu-devel] [PATCH v6 1/2] tests: add expected ACPI tables for arm/virt board Igor Mammedov
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 15/17] " Michael S. Tsirkin
2019-06-03 11:22 ` [Qemu-devel] [PATCH v6 2/2] tests: acpi: add simple arm/virt testcase Igor Mammedov
2019-06-05 20:00   ` [Qemu-devel] [PULL v3 16/17] " Michael S. Tsirkin
2019-06-03 16:08   ` [Qemu-devel] [PATCH v6 2/2] " Laszlo Ersek
2019-06-04 11:51     ` Igor Mammedov
2019-06-04 17:13       ` Michael S. Tsirkin
2019-06-03 18:08 [Qemu-devel] [PULL v2 00/14] virtio, pci, pc: cleanups, features Michael S. Tsirkin
2019-06-03 18:08 ` [Qemu-devel] [PULL v2 10/14] bios-tables-test: add diff allowed list Michael S. Tsirkin
2019-06-03 18:09 ` [Qemu-devel] [PULL v2 14/14] bios-tables-test: list all tables that differ Michael S. Tsirkin
2019-06-04 15:57 ` [Qemu-devel] [PULL v2 00/14] virtio, pci, pc: cleanups, features Peter Maydell
2019-06-04 16:48   ` Michael S. Tsirkin
2019-06-04 16:55     ` Peter Maydell
2019-06-04 17:09       ` Michael S. Tsirkin
2019-06-05 20:00 [Qemu-devel] [PULL v3 00/17] " Michael S. Tsirkin
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 10/17] bios-tables-test: add diff allowed list Michael S. Tsirkin
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 14/17] bios-tables-test: list all tables that differ Michael S. Tsirkin
2019-06-05 20:00 ` [Qemu-devel] [PULL v3 17/17] bios-tables-test: ignore identical binaries Michael S. Tsirkin
2019-06-06 13:08 ` [Qemu-devel] [PULL v3 00/17] virtio, pci, pc: cleanups, features Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190416125912.44001-4-liran.alon@oracle.com \
    --to=liran.alon@oracle.com \
    --cc=bijan.mottahedeh@oracle.com \
    --cc=ehabkost@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=nir.weiner@oracle.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.