From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>
Subject: [Qemu-devel] [PULL 01/24] virtio-scsi-dataplane: Add op blocker
Date: Thu, 23 Oct 2014 15:33:49 +0200 [thread overview]
Message-ID: <1414071252-7003-2-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1414071252-7003-1-git-send-email-pbonzini@redhat.com>
From: Fam Zheng <famz@redhat.com>
We need this to protect dataplane thread from race conditions with block
jobs until the latter is made dataplane-safe.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi/virtio-scsi-dataplane.c | 4 ++++
hw/scsi/virtio-scsi.c | 19 +++++++++++++++++--
include/hw/virtio/virtio-scsi.h | 1 +
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index b778e05..97c2a4f 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -154,6 +154,8 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
s->dataplane_starting = true;
+ assert(!s->blocker);
+ error_setg(&s->blocker, "block device is in use by data plane");
/* Set up guest notifier (irq) */
rc = k->set_guest_notifiers(qbus->parent, vs->conf.num_queues + 2, true);
if (rc != 0) {
@@ -194,6 +196,8 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
if (!s->dataplane_started || s->dataplane_stopping) {
return;
}
+ error_free(s->blocker);
+ s->blocker = NULL;
s->dataplane_stopping = true;
assert(s->ctx == iothread_get_aio_context(vs->conf.iothread));
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 8547ea0..99fddee 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -741,9 +741,18 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
+ VirtIOSCSI *s = VIRTIO_SCSI(vdev);
+ SCSIDevice *sd = SCSI_DEVICE(dev);
+
+ if (s->ctx && !s->dataplane_disabled) {
+ if (bdrv_op_is_blocked(sd->conf.bs, BLOCK_OP_TYPE_DATAPLANE, errp)) {
+ return;
+ }
+ bdrv_op_block_all(sd->conf.bs, s->blocker);
+ }
if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
- virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
+ virtio_scsi_push_event(s, sd,
VIRTIO_SCSI_T_TRANSPORT_RESET,
VIRTIO_SCSI_EVT_RESET_RESCAN);
}
@@ -753,12 +762,18 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
+ VirtIOSCSI *s = VIRTIO_SCSI(vdev);
+ SCSIDevice *sd = SCSI_DEVICE(dev);
if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
- virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
+ virtio_scsi_push_event(s, sd,
VIRTIO_SCSI_T_TRANSPORT_RESET,
VIRTIO_SCSI_EVT_RESET_REMOVED);
}
+
+ if (s->ctx) {
+ bdrv_op_unblock_all(sd->conf.bs, s->blocker);
+ }
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
}
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index d6e5e79..1ce0858 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -195,6 +195,7 @@ typedef struct VirtIOSCSI {
bool dataplane_starting;
bool dataplane_stopping;
bool dataplane_disabled;
+ Error *blocker;
Notifier migration_state_notifier;
} VirtIOSCSI;
--
1.8.3.1
next prev parent reply other threads:[~2014-10-23 13:34 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-23 13:33 [Qemu-devel] [PULL 00/24] SCSI, maintainers and more - 2014-10-17 Paolo Bonzini
2014-10-23 13:33 ` Paolo Bonzini [this message]
2014-10-23 13:33 ` [Qemu-devel] [PULL 02/24] virtio-scsi: dataplane: print why starting failed Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 03/24] virtio-scsi: dataplane: fail setup gracefully Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 04/24] virtio-scsi: dataplane: stop trying on notifier error Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 05/24] qom: Allow clearing of a Link property Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 06/24] qom: Demote already-has-a-parent to a regular error Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 07/24] qdev: gpio: Re-implement qdev_connect_gpio QOM style Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 08/24] qdev: gpio: Add API for intercepting a GPIO Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 09/24] qtest/irq: Rework IRQ interception Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 10/24] irq: Remove qemu_irq_intercept_out Paolo Bonzini
2014-10-23 13:33 ` [Qemu-devel] [PULL 11/24] qdev: gpio: delete NamedGPIOList::out Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 12/24] qdev: gpio: Remove qdev_init_gpio_out x1 restriction Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 13/24] qdev: gpio: Define qdev_pass_gpios() Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 14/24] sysbus: Use TYPE_DEVICE GPIO functionality Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 15/24] target-i386: warns users when CPU threads>1 for non-Intel CPUs Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 16/24] MAINTAINERS: grab more files from Anthony's pile Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 17/24] MAINTAINERS: add Samuel Thibault as usb-serial.c and baum.c maintainer Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 18/24] MAINTAINERS: add myself for X86 Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 19/24] MAINTAINERS: Add more TCG files Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 20/24] MAINTAINERS: add some tests directories Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 21/24] MAINTAINERS: avoid M entries that point to mailing lists Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 22/24] qtest: fix qtest log fd should be initialized before qtest chardev Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 23/24] get_maintainer.pl: move git loop under "if ($email) {" Paolo Bonzini
2014-10-23 13:34 ` [Qemu-devel] [PULL 24/24] get_maintainer.pl: restrict cases where it falls back to --git Paolo Bonzini
2014-10-23 14:32 ` [Qemu-devel] [PULL 00/24] SCSI, maintainers and more - 2014-10-17 Peter Maydell
2014-10-23 14:39 ` Paolo Bonzini
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=1414071252-7003-2-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).