qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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);
>>   
>>
> 

  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).