From: Paolo Bonzini <pbonzini@redhat.com>
To: Max Reitz <mreitz@redhat.com>, qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Anthony Liguori <aliguori@amazon.com>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2] virtio-scsi: Allocate op blocker reason before blocking
Date: Fri, 27 Feb 2015 19:43:11 +0100 [thread overview]
Message-ID: <54F0BABF.6010008@redhat.com> (raw)
In-Reply-To: <1425057113-26940-1-git-send-email-mreitz@redhat.com>
On 27/02/2015 18:11, Max Reitz wrote:
> s->blocker is really only used in hw/scsi/virtio-scsi.c; the only places
> where it is used in hw/scsi/virtio-scsi-dataplane.c is when it is
> allocated and when it is freed. That does not make a whole lot of sense
> (and is actually wrong because this leads to s->blocker potentially
> being NULL when blk_op_block_all() is called in virtio-scsi.c), so move
> the allocation and destruction of s->blocker to the device realization
> and unrealization in virtio-scsi.c, respectively.
>
> Case in point:
>
> $ echo -e 'eject drv\nquit' | \
> x86_64-softmmu/qemu-system-x86_64 \
> -monitor stdio -machine accel=qtest -display none \
> -object iothread,id=thr -device virtio-scsi-pci,iothread=thr \
> -drive if=none,file=test.qcow2,format=qcow2,id=drv \
> -device scsi-cd,drive=drv
>
> Without this patch:
>
> (qemu) eject drv
> [1] 10102 done
> 10103 segmentation fault (core dumped)
>
> With this patch:
>
> (qemu) eject drv
> Device 'drv' is busy: block device is in use by data plane
> (qemu) quit
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
> v2:
> - Put the reproducer into the commit message [Markus] and modified its
> wording to be more fitting of a commit message ("Case in point"
> instead of the imperative "Try").
> - As noted by Fam on my bdrv_close_all() series, there can be multiple
> block devices per virtio-scsi bus; therefore, it's wrong to delete the
> blocker if one of these is unplugged. Instead, just allocate the
> blocker with the virtio-scsi device itself and free it when the device
> is unrealized.
> ---
> hw/scsi/virtio-scsi-dataplane.c | 4 ----
> hw/scsi/virtio-scsi.c | 4 ++++
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
> index 03a1e8c..9b775d4 100644
> --- a/hw/scsi/virtio-scsi-dataplane.c
> +++ b/hw/scsi/virtio-scsi-dataplane.c
> @@ -211,8 +211,6 @@ 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) {
> @@ -279,8 +277,6 @@ 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 9e2c718..9c2a272 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -904,6 +904,8 @@ static void virtio_scsi_device_realize(DeviceState *dev, Error **errp)
> virtio_scsi_save, virtio_scsi_load, s);
> s->migration_state_notifier.notify = virtio_scsi_migration_state_changed;
> add_migration_state_change_notifier(&s->migration_state_notifier);
> +
> + error_setg(&s->blocker, "block device is in use by data plane");
> }
>
> static void virtio_scsi_instance_init(Object *obj)
> @@ -929,6 +931,8 @@ static void virtio_scsi_device_unrealize(DeviceState *dev, Error **errp)
> {
> VirtIOSCSI *s = VIRTIO_SCSI(dev);
>
> + error_free(s->blocker);
> +
> unregister_savevm(dev, "virtio-scsi", s);
> remove_migration_state_change_notifier(&s->migration_state_notifier);
>
>
Applying, thanks.
Paolo
prev parent reply other threads:[~2015-02-27 18:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-27 17:11 [Qemu-devel] [PATCH v2] virtio-scsi: Allocate op blocker reason before blocking Max Reitz
2015-02-27 17:45 ` Eric Blake
2015-02-27 18:43 ` Paolo Bonzini [this message]
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=54F0BABF.6010008@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@amazon.com \
--cc=armbru@redhat.com \
--cc=famz@redhat.com \
--cc=mreitz@redhat.com \
--cc=mst@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 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.