[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole
From: |
Alon Levy |
Subject: |
Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole |
Date: |
Tue, 3 Aug 2010 10:13:27 -0400 (EDT) |
----- "Anthony Liguori" <address@hidden> wrote:
> On 08/03/2010 03:46 AM, Gerd Hoffmann wrote:
> > Hi,
> >
> >> My main objection to ioctls is that you change states based on
> event
> >> delivery. This results in weird things like what happens when you
> do a
> >> chr_write while not ready or not connected.
> >>
> >> So what I'd rather see is a move to an API that was connection
> oriented.
> >> For instance, we could treat CharDriverState as an established
> >> connection. So something like:
> >>
> >> typedef struct CharServerState
> >> {
> >> int backlog; /* max simultaneous connections; -1 for unlimited */
> >> void (*connect)(CharServerState *s, CharDriverState *session);
> >> void (*disconnect)(CharServerState *s, CharDriverState *session);
> >> } CharDriverState;
> >
> > Oh, that is a similar but unrelated issue.
> >
> > We have open/close events on the *guest* side (i.e. some process
> > inside the guests opens/closes /dev/vmchannel/org.qemu.foo.42).
> This
> > is what Alon wants to propagate from the device backend to the
> chardev.
> >
> > We also have open/close (or connect/disconnect) events on the *host*
>
> > side for the devices (or sockets) the chardevs are bound to. This
> is
> > what you are talking about.
>
> No, I'm not. You have a front-end device that's connected to
> virtio-serial. You're implementing the backend in spice. The
> front-end needs to communicate to the backend events like connect,
> ready, disconnect. I don't see what the difference between connect
> and
> ready is so I'll ignore it for now.
>
> The proposal is to implement this via events. My concern is that
> this
> interface is brittle because it leaves a lot of behavior undefined.
> There are three distinct states in the life cycle, DISCONNECTED,
> CONNECTED_BUT_NOT_READY, and CONNECTED_AND_READY. The entire
> CharDriverState interface is only useful in the CONNECTED_AND_READY
> state so what's the behavior of every function in any of the other
> states?
>
> My suggestion is to implement a simple CharServerState driver. This
> interface is connection oriented. You can have a dummy
> CharServerState
> that returns a single CharDriverState on connect() and does nothing on
>
> disconnect(). That's how you bridge virtio-serial to what we have
> today. But the idea is that virtio-serial no longer takes a
> CharDriverState but a CharServerState.
>
> Spice would then implement it's own CharServerState and would use it
> to
> understand what state the session is in. It's a really simple
> interface
> yet it makes the code much more robust because it eliminates the
> entire
> class of errors associated with undefined behavior when state !=
> CONNECTED_AND_READY.
>
> The problem we've had with host side state is poorly defined
> semantics.
> For instance, I still think we generate multiple OPENED events as
> opposed to strictly generating CLOSED, followed by OPENED, followed by
>
> CLOSED.
>
> > Note that we already have events (CHR_EVENT_OPENED,CLOSED) for the
> > host side. Adding events for the guest side open/close events makes
>
> > sense to me (and is certainly better than the ioctl patch).
>
> We have the same problem with host side events today but it's even
> worse
> because the semantics are very subtle. Ultimately we need something
> like CharServerState and we could probably even use it but that's a
> larger scope than just this patch.
>
> The reason I think it's worth doing it this way is that I anticipate
> future virtio-serial backends in QEMU. It's a very simple difference
> too.
>
Ok, I don't see how it's that totally simple right now, but I'm going to
send a patch along those lines. Basically just adding a qemu_chr_server_write
to be used instead of the qemu_chr_write.
I think it would actually be simpler to add connect and disconnect to
ChrDriverState
and have a guest_connect host_connected booleans (basically same as
virtio-serial).
For the normal case (all existing backends) a connected bool would be
initialized to 1,
and write would have an if (!connected) return, and connect/disconnect would be
empty.
For spicevmc backend I would implement those as I would have the ioctl's /
events.
> Regards,
>
> Anthony Liguori
>
>
> >
> > cheers,
> > Gerd
> >
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, (continued)
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Gerd Hoffmann, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Anthony Liguori, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Gerd Hoffmann, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Anthony Liguori, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Gerd Hoffmann, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Anthony Liguori, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Gerd Hoffmann, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Anthony Liguori, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Gerd Hoffmann, 2010/08/03
- Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole, Anthony Liguori, 2010/08/03
Re: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole,
Alon Levy <=