On Thu, Dec 21, 2017 at 01:27:17PM +0000, Daniel P. Berrange wrote: > When starting QEMU management apps will usually setup a monitor socket, and > then open it immediately after startup. If not using QEMU's own -daemonize > arg, this process can be troublesome to handle correctly. The mgmt app will > need to repeatedly call connect() until it succeeds, because it does not > know when QEMU has created the listener socket. If can't retry connect() > forever though, because an error might have caused QEMU to exit before it > even creates the monitor. > > The obvious way to fix this kind of problem is to just pass in a pre-opened > socket file descriptor for the QEMU monitor to listen on. The management app > can now immediately call connect() just once. If connect() fails it knows > that QEMU has exited with an error. > > The SocketAddress(Legacy) structs allow for FD passing via the monitor, using > the 'getfd' command, but only when using QMP JSON syntax. The HMP syntax has > no way to initialize the SocketAddress(Legacy) 'fd' variant. So this patch > first wires up the 'fd' parameter to refer to a monitor file descriptor, > allowing HMP to use > > getfd myfd > chardev-add socket,fd=myfd > > The SocketAddress 'fd' variant is currently tied to the use of the monitor > 'getfd' command, so we have a chicken & egg problem with reusing that at > startup wher no monitor connection is available. We could define that the > special fd name prefix '/dev/fdset' refers to a FD passed via the CLI, but > magic strings feel unpleasant. > > Instead we define a SocketAddress 'fdset' variant that takes an fd set number > that works in combination with the 'add-fd' command line argument. e.g. > > -add-fd fd=3,set=1 > -chardev socket,fdset=1,id=mon > -mon chardev=mon,mode=control
Having written this, it occurs to me that using fdset for this is really just adding uncessary complication. The 'fd' parameter in SocketAddress is required to be a string that refers to a named FD passed over the monitor. I now see, however, that these strings are forbidden to start with a digit. This means we could easily re-use this facility to just directly reference a passed-in file descriptor number, without clashing with named FD strings. eg we could do -chardev socket,fd=3,id=mon -mon chardev=mon,mode=control This would simplify this patch significantly, and give close alignement between the HMP & cli usage. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|