On Thu, Feb 10, 2022 at 18:35:44 +0100, Ján Tomko wrote: > On a Wednesday in 2022, Peter Krempa wrote: > > The existing helpers we have are very clumsy and there's no integration > > with the monitor. > > > > This patch introduces new helpers to bridge the gap and simplify handing [...] > > +/** > > + * qemuFDPassNew: > > + * @prefix: prefix used for naming the passed FDs > > + * @dompriv: qemu domain private data > > + * @useFDSet: Always use FD sets (/dev/fdset/N) for this instance > > + * > > + * Create a new helper object for passing FDs to qemu. If @useFDSet is false > > + * the older approach of directly using FD number on the commandline and 'getfd' > > + * QMP command is used. Otherwise '-add-fd' and /dev/fdset/N is used to pass the > > + * FD. > > + * > > I dislike using bools in helpers, can this be turned into a flag? Well I dislike flags because it makes the code of the function harder to read as opposed to making the call itself easier to read, so I try to avoid them if it's feasible in a given situation. > Alternatively, to discourage the older approach you can create a thin > qemuFDPassNewLegacy wrapper and leave qemuFDPassNew without the comment. I think I'll go with this one. > (Can we even convince QEMU to use fdset for sockets? Or is that not > worth pursuing?) I actually have a qemu patch prepared which makes the code paths using direct FD passing or the 'getfd' QMP command to accept fdsets too, but I still have to test it. The idea is to hide the complexity in these wrappers and then just use fdsets. > > > + * Non-test uses must pass a valid @dompriv. > > + * > > + * @prefix is used for naming the FD if needed and is later referenced when > > + * removing the FDSet via monitor. > > + */ > > +qemuFDPass * > > +qemuFDPassNew(const char *prefix, > > + void *dompriv, > > + bool useFDSet) > > +{ > > + qemuDomainObjPrivate *priv = dompriv; > > + qemuFDPass *fdpass = g_new0(qemuFDPass, 1); > > + > > + fdpass->prefix = g_strdup(prefix); > > + fdpass->useFDSet = useFDSet; > > + > > + if (fdpass->useFDSet && priv) > > + fdpass->fdSetID = qemuDomainFDSetIdNew(priv); > > + > > + return fdpass; > > +} > > + > > + > > +/** > > + * qemuFDPassAddFD: > > + * @fdpass: The fd passing helper struct > > + * @fd: File descriptor to pass > > + * @suffix: Name suffix for the file descriptor name > > + * > > + * Adds @fd to be passed to qemu when transferring @fdpass to qemu. > > QEMU > > > When @fdpass > > + * is configured to use FD set mode, multiple file descriptors can be passed by > > + * calling this function repeatedly. > > + * > > + * @suffix is used to build the name of the file descriptor by concatenating > > + * it with @prefix passed to qemuFDPassNew. @suffix may be NULL, in which case > > + * it's considered to be an empty string. > > + * > > + * Returns 0 on success, -1 on error (when attempting to pass multiple FDs) using > > + * the 'direct' method. > > + */ > > +int > > +qemuFDPassAddFD(qemuFDPass *fdpass, > > + int *fd, > > + const char *suffix) > > +{ > > + struct qemuFDPassFD newfd = { .fd = *fd }; > > + > > + if (newfd.fd < 0) { > > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > > + _("invalid file descriptor")); > > + return -1; > > + } > > + > > + if (fdpass->nfds >= 1) { > > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > > + _("direct FD passing supports only 1 file descriptor")); > > This check conflicts with the comment above saying multiple FDs are > allowed with fdsets. Also, please s/1/one/ oops, the idea was to do that check only when the legacy mode is used. Changes in this series actually don't use the multi-fd mode yet.