From: Pavel Butsykin <pbutsykin@virtuozzo.com>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: mst@redhat.com, dgilbert@redhat.com, amit@kernel.org, den@openvz.org
Subject: Re: [Qemu-devel] [PATCH] virtio-serial: add enable_backend callback
Date: Mon, 18 Sep 2017 12:37:21 +0300 [thread overview]
Message-ID: <61dd88c7-3f8c-471b-b33c-61aa2b09f981@virtuozzo.com> (raw)
In-Reply-To: <55a8a300-2247-dadb-40b3-0c1d4e651e08@redhat.com>
On 15.09.2017 20:09, Paolo Bonzini wrote:
> On 07/07/2017 16:21, Pavel Butsykin wrote:
>> We should guarantee that RAM will not be modified while VM has a stopped
>> state, otherwise it can lead to negative consequences during post-copy
>> migration. In RUN_STATE_FINISH_MIGRATE step, it's expected that RAM on
>> source side will not be modified as this could lead to non-consistent vm state
>> on the destination side. Also RAM access during postcopy-ram migration with
>> enabled release-ram capability can lead to sad consequences.
>>
>> Let's add enable_backend() callback to avoid undesirable virtioqueue changes
>> in the guest memory.
>>
>> Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
>
> To understand the patch better this doesn't fix _all_ stopped states,
> only migration, right? That said it's a valid bugfix even independent
> of the effects for stopped runstate.
Yes, the bug only appears on the migration. Actually, to protect memory
during the migration, this approach is already used for other virtio
devices, for example net_vhost, see virtio_net_vhost_status().
> Thanks,
>
> Paolo
>
>> ---
>> hw/char/virtio-console.c | 21 +++++++++++++++++++++
>> hw/char/virtio-serial-bus.c | 7 +++++++
>> include/hw/virtio/virtio-serial.h | 3 +++
>> 3 files changed, 31 insertions(+)
>>
>> diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
>> index 0cb1668c8a..b55905892e 100644
>> --- a/hw/char/virtio-console.c
>> +++ b/hw/char/virtio-console.c
>> @@ -163,6 +163,26 @@ static void chr_event(void *opaque, int event)
>> }
>> }
>>
>> +static void virtconsole_enable_backend(VirtIOSerialPort *port, bool enable)
>> +{
>> + VirtConsole *vcon = VIRTIO_CONSOLE(port);
>> +
>> + if (!qemu_chr_fe_get_driver(&vcon->chr)) {
>> + return;
>> + }
>> +
>> + if (enable) {
>> + VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
>> +
>> + qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
>> + k->is_console ? NULL : chr_event,
>> + vcon, NULL, false);
>> + } else {
>> + qemu_chr_fe_set_handlers(&vcon->chr, NULL, NULL,
>> + NULL, NULL, NULL, false);
>> + }
>> +}
>> +
>> static void virtconsole_realize(DeviceState *dev, Error **errp)
>> {
>> VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
>> @@ -233,6 +253,7 @@ static void virtserialport_class_init(ObjectClass *klass, void *data)
>> k->unrealize = virtconsole_unrealize;
>> k->have_data = flush_buf;
>> k->set_guest_connected = set_guest_connected;
>> + k->enable_backend = virtconsole_enable_backend;
>> k->guest_writable = guest_writable;
>> dc->props = virtserialport_properties;
>> }
>> diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
>> index f5bc173844..f0f18c8e7c 100644
>> --- a/hw/char/virtio-serial-bus.c
>> +++ b/hw/char/virtio-serial-bus.c
>> @@ -637,6 +637,13 @@ static void set_status(VirtIODevice *vdev, uint8_t status)
>> if (!(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
>> guest_reset(vser);
>> }
>> +
>> + QTAILQ_FOREACH(port, &vser->ports, next) {
>> + VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
>> + if (vsc->enable_backend) {
>> + vsc->enable_backend(port, vdev->vm_running);
>> + }
>> + }
>> }
>>
>> static void vser_reset(VirtIODevice *vdev)
>> diff --git a/include/hw/virtio/virtio-serial.h b/include/hw/virtio/virtio-serial.h
>> index b19c44727f..12657a9f39 100644
>> --- a/include/hw/virtio/virtio-serial.h
>> +++ b/include/hw/virtio/virtio-serial.h
>> @@ -58,6 +58,9 @@ typedef struct VirtIOSerialPortClass {
>> /* Guest opened/closed device. */
>> void (*set_guest_connected)(VirtIOSerialPort *port, int guest_connected);
>>
>> + /* Enable/disable backend for virtio serial port */
>> + void (*enable_backend)(VirtIOSerialPort *port, bool enable);
>> +
>> /* Guest is now ready to accept data (virtqueues set up). */
>> void (*guest_ready)(VirtIOSerialPort *port);
>>
>>
>
next prev parent reply other threads:[~2017-09-18 9:37 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-07 14:21 [Qemu-devel] [PATCH] virtio-serial: add enable_backend callback Pavel Butsykin
2017-07-10 14:13 ` Laurent Vivier
2017-07-10 16:39 ` Michael S. Tsirkin
2017-07-11 9:31 ` Laurent Vivier
2017-07-10 17:23 ` Pavel Butsykin
2017-07-17 13:56 ` Pavel Butsykin
2017-09-15 9:20 ` Pavel Butsykin
2017-08-24 14:27 ` Denis V. Lunev
2017-09-15 17:09 ` Paolo Bonzini
2017-09-18 9:37 ` Pavel Butsykin [this message]
2017-09-19 7:43 ` 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=61dd88c7-3f8c-471b-b33c-61aa2b09f981@virtuozzo.com \
--to=pbutsykin@virtuozzo.com \
--cc=amit@kernel.org \
--cc=den@openvz.org \
--cc=dgilbert@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@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).