qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] virtio-serial-bus: replay guest_open on migrati


From: Alon Levy
Subject: Re: [Qemu-devel] [PATCH] virtio-serial-bus: replay guest_open on migration
Date: Wed, 27 Jul 2011 17:49:32 +0300
User-agent: Mutt/1.5.21 (2010-09-15)

On Wed, Jul 27, 2011 at 09:16:33AM -0500, Anthony Liguori wrote:
> On 07/27/2011 02:07 AM, Alon Levy wrote:
> >On Wed, Jul 27, 2011 at 07:45:25AM +0200, Markus Armbruster wrote:
> >>Alon Levy<address@hidden>  writes:
> >>
> >>>Signed-off-by: Alon Levy<address@hidden>
> >>>---
> >>>  hw/virtio-serial-bus.c |    8 +++++++-
> >>>  1 files changed, 7 insertions(+), 1 deletions(-)
> >>>
> >>>diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
> >>>index c5eb931..7a652ff 100644
> >>>--- a/hw/virtio-serial-bus.c
> >>>+++ b/hw/virtio-serial-bus.c
> >>>@@ -618,14 +618,20 @@ static int virtio_serial_load(QEMUFile *f, void 
> >>>*opaque, int version_id)
> >>>      for (i = 0; i<  nr_active_ports; i++) {
> >>>          uint32_t id;
> >>>          bool host_connected;
> >>>+        VirtIOSerialPortInfo *info;
> >>>
> >>>          id = qemu_get_be32(f);
> >>>          port = find_port_by_id(s, id);
> >>>          if (!port) {
> >>>              return -EINVAL;
> >>>          }
> >>>-
> >>>          port->guest_connected = qemu_get_byte(f);
> >>>+        info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info);
> >>>+        if (port->guest_connected&&  info->guest_open) {
> >>>+            /* replay guest open */
> >>>+            info->guest_open(port);
> >>>+
> >>>+        }
> >>>          host_connected = qemu_get_byte(f);
> >>>          if (host_connected != port->host_connected) {
> >>>              /*
> >>
> >>The patch makes enough sense to me, but the commit message is
> >>insufficient.  Why do you have to replay?  And what's being fixed?
> >
> >When migrating a host with with a spice agent running the mouse becomes
> >non operational after the migration. This is rhbz #718463, currently on
> >spice-server but it seems this is a qemu-kvm issue. The problem is that
> >after migration spice doesn't know the guest agent is open.
> 
> The problem is that guest_open is a hack.
> 
> You want connection semantics.  You need the following information
> from the backend and the client:
> 
> 1) backend is associated with a transport.  The transport may
> disconnect at any point in time.  The backend needs to have explicit
> state transitions associated with the transport disconnecting and
> connecting.
> 
> 2) the client may disconnect and reconnect at any point in time.  A
> device model reset is a disconnect followed by a reconnect.
> 
> This gives you the following matrix of states:
> 
> A: backend-connected, client-connected
> B: backend-disconnected, client-disconnected
> C: backend-connected, client-disconnected
> D: backend-disconnected, client-connected
> 
> The state transition diagram looks like this:
> 
> B: for some devices, immediately goto C.  other devices, on accept()
> goto D.  if in B and client connects, goto D
> 
> C: if transport disconnects, goto B. if client connects, goto A
> 
> D: if transport connects, goto A.  if client disconects, goto B
> 
> A: if transport disconnects, goto B, if client disconnects, goto C
> 
> The problem is that guest_open() is a poor approximation of
> 'client-connected' and it's not used universally.  We need to
> introduce proper state tracking to the character device layer and we
> need to have a proper connection function that is used by all char
> device clients.
> 
> Semantically, write should only be allowed in states A and D.  Read
> should only be allowed in states A and C.
> 
> C and D should have very well defined semantics about what happens
> to the data that is written  Arguably, read/write should not be
> allowed in states C/D.
> 
> Device reset should always trigger a client reconnect.  Migration
> resets devices so migration would Just Work if we modelled the state
> transitions appropriately.
Are you saying currently on migration the guest (client above) always
receives an event from virtio? The guest_open callback happens when
a guest operation happens, not when the device gets reset, unless the later
triggers the former, but I don't understand how that would happen since a
reset can happen while the guest isn't ready to handle anything (guest is
booting).
I do see a virtio_pci_reset does a virtio_reset which sends the
VIRTIO_NO_VECTOR interrupt, but I don't understand what happens after that.

Besides, I understand the need to fix the connection semantics of chardevs,
but the situation is broken right now and even if someone were to write this
I don't believe you would just take it to 0.15.0, would you?

Also, the conversation is still ongoing but Armbru mentioned some 
''relevant-cases''
in http://lists.nongnu.org/archive/html/qemu-devel/2011-07/msg03221.html
backing the fix-the-hack approach (at least for 0.15.0).

> 
> Regards,
> 
> Anthony Liguori
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]